<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Келег`s homepage &#187; 1С</title>
	<atom:link href="http://www.keleg.info/tag/1%d1%81/feed" rel="self" type="application/rss+xml" />
	<link>http://www.keleg.info</link>
	<description>Обработанные мысли</description>
	<lastBuildDate>Fri, 25 Jun 2010 15:37:33 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Основы менеджмента кода 1С</title>
		<link>http://www.keleg.info/programming/refactoring2</link>
		<comments>http://www.keleg.info/programming/refactoring2#comments</comments>
		<pubDate>Fri, 26 Dec 2008 02:27:59 +0000</pubDate>
		<dc:creator>keleg</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[1С]]></category>
		<category><![CDATA[рефакторинг]]></category>

		<guid isPermaLink="false">http://www.keleg.info/?p=93</guid>
		<description><![CDATA[
Наверное, мало кто будет спорить с тем, что программа должна быть понятной не только компьютеру, но и человеку. С увеличением сложности и времени жизни проектов легкость понимания кода становится все более критичной. Действительно, программа, которая пишется множеством людей и может неоднократно изменяться, должна быть легко читаемой, иначе изменения и исправления ошибок могут привести к потере [...]]]></description>
			<content:encoded><![CDATA[<div class="txt">
<p>Наверное, мало кто будет спорить с тем, что программа должна быть понятной не только компьютеру, но и человеку. С увеличением сложности и времени жизни проектов легкость понимания кода становится все более критичной. Действительно, программа, которая пишется множеством людей и может неоднократно изменяться, должна быть легко читаемой, иначе изменения и исправления ошибок могут привести к потере контроля над кодом и краху проекта. Возникает проблема менеджмента кода, т.е. поддержания кода в работоспособном и понятном состоянии. Каковы основные принципы такого менеджмента? Пойдем «от печки». Что такое язык программирования? Это прежде всего язык, т.е. система, когда совокупность символов (слово, предложение) отображает какой-то, пусть и виртуальный, но объект или действие над ним.</p>
<p>Нам повезло, мы программируем под 1С, где объекты и действия обозначаются словами русского языка. Это облегчает выполнения главного требования для понятной программы – <strong>самодокументируемости</strong>, т.е. названия должны соответствовать тому, что за ними стоит.</p>
<p>Основной принцип здесь таков – глядя на идентификатор процедуры или функции должно быть возможно сообразить, что она делает. Внимание! Главное не только и не столько «как она устроена» а «что делает»! Так же и с объектами – главное отразить их смысл в контексте решаемой программой задачи, а внутренние отношения и устройство уже вторичны. (не «МассивСтрок» а «СтруктураШапкиДокумента») Ведь придумывая имена-идентификаторы, мы «конструируем» язык, на котором нам потом описывать предметную область, описывать алгоритм решения задачи. И, когда идентификаторы подобраны правильно, решение задачи будет написано «почти по-русски» и не будет требовать каких-то дополнительных пояснений. Подробнее о стандартах именования 1С можно прочитать здесь, они вполне логичны.</p>
<p>Другое очень важное требование нормального языка – <strong>однозначность</strong>. Т.е. одним и тем же словом не должны называться разные сущности, и одинаковые сущности должны называться одинаково. Опускаясь с языковедческих высот на программистскую «землю» получим простейшие принципы:</p>
<blockquote>
<li>При изменении действия процедуры или функции нужно менять и ее название. То же относится и к переменным с объектами. Да, это может быть затратным – но один раз аккуратно сделать поиск/замену проще, чем много-много раз обращаться к описанию, чтобы понять, почему, блин, делается совсем не то, что заявлено!</li>
<li>Нельзя использовать одну и ту же переменную для хранения разных сущностей.</li>
<li>Прежде чем завести новую переменную, новый объект или процедуру нужно всегда проверять, есть ли уже что-то похожее. Возможно, работать не придется и уже все сделано. Также возможно, что потребуется лишь незначительное изменение существующего кода.</li>
</blockquote>
<p> </p>
<p>Другое, очень важное требование языка – <strong>обозримость</strong>. Предложения в русском языке очень редко бывают длиной в страницу текста. Почему? Возможности человеческого внимания ограничены обычно магическими цифрами 7 и 3. Человек с нормальным вниманием (а мы совсем не сверхлюди, хоть и программисты с сертификатами) легко воспринимает 7 объектов или 3 их сочетания. Откуда такие цифры? Как вы понимаете, в двоичной системе сочетания 3 объектов как раз дадут 8 комбинаций, так что это, в общем-то, одна и та же цифра. «Оперативная память» человека имеет объем примерно равный 8 ячейкам памяти. Хочешь не хочешь, от этого приходится плясать. Программистский же вывод таков:</p>
<blockquote>
<li>Блок кода длиннее 7-10 строчек должен оформляться в отдельную процедуру или функцию, с названием, которое описывает, что, собственно, этот блок делает.</li>
<li>Передавать в процедуру или функцию более трех параметров очень не рекомендуется. Даже три простейших булевских параметра это восемь их сочетаний, обработку которых необходимо предусмотреть! Возможно, стоит объединить несколько однотипных параметров в структуру или просто передать параметром объект, из которого они взяты. Также возможно стоит вовремя остановиться и перестать городить что-то большое и универсальное. Может быть, лучше разбить процедуру на две-три более мелких?</li>
<li>Если в операторе сравнения (Если … Тогда) используется больше трех условий или же они сложные, нужно сделать на их основе функцию или даже две-три (как положено, с «говорящими» именами) и использовать при сравнении результат их работы.</li>
</blockquote>
<p>Понятно, что перечисленные рекомендации не догма, а лишь повод к размышлению. Можно нагородить и однострочный код так, что его невозможно будет понять. Главный принцип здесь таков – если код нельзя понять с первого взгляда, а особенно если захотелось написать комментарий, поясняющий его работу, значит, этот код требует изменения. </p>
<p>Третье, менее формализуемое, но не менее важное свойство кода – <strong>стильность</strong>. Прежде чем изменять или дописывать чужой код, нужно в него вжиться. Понять, как он обычно манипулирует данными и объектами, как принято в нем делать определенные действия. И делать так же, в том же стиле. Понятно, что не стоит копировать ужасно написанный код, но с таким вообще сделать что-то хорошее трудно. Но если программа имеет хотя бы среднее качество, стоит перенять перед изменением даже ее стиль написания, наименований. Это позволит не отвлекаться потом на мешанину стилей тому, кто придет править код дальше (а возможно и самому через полгода).</p>
<p>Когда же чаще всего вносятся все эти косметические правки в код? В самый светлый момент – когда все заработало! Тут, обычно, радостный программист бросает все «как есть» и убегает дальше. Но стоит потратить 5-15 минут на «уборку рабочего места», структурирование и причесывание получившегося результата, чтобы под результатом не стыдно было подписаться. Нужно еще обязательно отметить, что если код большой или при «причесывании» требуется изменять чужие и не до конца понятные строки, нужно действовать очень аккуратно. Маленькое изменение – тестирование – следующее маленькое изменение. Никогда не надо стирать и переписывать страницы кода, ни к чему хорошему это не приведет! Но при должном внимании и аккуратности задача поддержания изменяемого кода в рабочем состоянии вполне разрешима и даже не требует каких-то значительных затрат.<br />
Главное не давать себе лениться!</p>
<h2>Основные методы рефакторинга.</h2>
<p>Теперь можно поговорить более строго. Большинство из того, о чем говорилось выше, относится к недавно появившейся технологии программирования – рефакторингу. Рефакторингом кода называется его изменение с целью повышения логичности или понятности без изменения внешнего поведения программы. В модели программирования 1С возможны далеко не все его известные методы, но и оставшихся вполне хватит для того, чтобы сделать код ясным и четким.<br />
Итак, что у нас в арсенале?</p>
<li><strong>Переименование</strong>. Думаю, здесь можно обойтись без примеров? Переименование просто устраняет несоответствие между названием и содержанием (действием).</li>
<li><strong>Выделение процедуры/функции</strong>. Выделение блока кода с неявным смыслом в процедуру или функцию<br />
Было</li>
<blockquote><p>НомерКолонкиБазовый <span style="color: #ff0000;">= </span>СоответствиеТиповЦен<span style="color: #ff0000;">.</span>Получить<span style="color: #ff0000;">(</span>БазовыйТипЦен<span style="color: #ff0000;">)</span>;<br />
<span style="color: #ff0000;">Если НЕ </span>НомерКолонки <span style="color: #ff0000;">= </span>Неопределенно <span style="color: #ff0000;">И НЕ </span>ЭлементыФормы<span style="color: #ff0000;">.</span>ТаблицаЦен<span style="color: #ff0000;">.</span>Колонки<span style="color: #ff0000;">.</span>Найти<span style="color: #ff0000;">(</span>\<span style="color: #ff0000;">&#8220;</span>Цена\<span style="color: #ff0000;">&#8221; </span><span style="color: #ff0000;">+ </span>НомерКолонки<span style="color: #ff0000;">) </span><span style="color: #ff0000;">= </span>Неопределено <span style="color: #ff0000;">Тогда </span>{<span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span>}</p></blockquote>
</div>
<p>Стало</p>
<blockquote><p><span style="color: #ff0000;">Функция </span>ЕстьКолонка<span style="color: #ff0000;">(</span>НомерКолонки<span style="color: #ff0000;">)<br />
Возврат НЕ </span>НомерКолонки <span style="color: #ff0000;">= </span>Неопределено <span style="color: #ff0000;">И НЕ </span>ЭлементыФормы<span style="color: #ff0000;">.</span>ТаблицаЦен<span style="color: #ff0000;">.</span>Колонки<span style="color: #ff0000;">.</span>Найти<span style="color: #ff0000;">(</span>\<span style="color: #ff0000;">&#8220;</span>Цена\<span style="color: #ff0000;">&#8221; </span><span style="color: #ff0000;">+ </span>НомерКолонки<span style="color: #ff0000;">)</span><span style="color: #ff0000;">=</span>Неопределено;<br />
<span style="color: #ff0000;">КонецФункции<br />
</span>{<span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span>}<br />
НомерКолонкиБазовый <span style="color: #ff0000;">= </span>СоответствиеТиповЦен<span style="color: #ff0000;">.</span>Получить<span style="color: #ff0000;">(</span>БазовыйТипЦен<span style="color: #ff0000;">)</span>;<br />
<span style="color: #ff0000;">Если </span>ЕстьКолонка<span style="color: #ff0000;">(</span>НомерКолонкиБазовый<span style="color: #ff0000;">) Тогда </span>{<span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span>}</p></blockquote>
<li><strong>Свертывание процедуры/функции</strong>. Обратное выделению процедуры/функции действие. Применяется, если текст процедуры в ходе изменения упростился настолько, что понятнее будет включить его напрямую в код, где вызывалась процедура.</li>
<p>Было</p>
<blockquote><p><span style="color: #ff0000;">Процедура </span>ОчиститьТаблицуОплат<span style="color: #ff0000;">(</span><span style="color: #ff0000;">)<br />
</span>ТаблицаОплат<span style="color: #ff0000;">.</span>Очистить<span style="color: #ff0000;">(</span><span style="color: #ff0000;">)</span>;<br />
<span style="color: #ff0000;">КонецПроцедуры<br />
</span>{<span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span>}<br />
ОчиститьТаблицуОплат<span style="color: #ff0000;">(</span><span style="color: #ff0000;">)<br />
</span>{<span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span>}</p></blockquote>
<p>Стало</p>
<blockquote><p>{<span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span>}<br />
ТаблицаОплат<span style="color: #ff0000;">.</span>Очистить<span style="color: #ff0000;">(</span><span style="color: #ff0000;">)</span>;<br />
{<span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span>}</p></blockquote>
<li><strong>Выделение структуры параметров</strong> процедуры Если в параметрах нескольких процедур используется один и тот же длинный набор параметров, очень полезно объединить параметры в структуры. Помимо компактности и логичности это даст возможность простого добавления еще одного параметра без переписывания заголовков множества процедур.</li>
<p>Было</p>
<blockquote><p>
<span style="color: #ff0000;">Процедура </span>ДвиженияПоРегистрамУпр<span style="color: #ff0000;">(</span>РежимПроведения<span style="color: #ff0000;">, </span>СтруктураШапкиДокумента<span style="color: #ff0000;">, </span>ТаблицаПоТоварам<span style="color: #ff0000;">, </span>ТаблицаПоСкидкам<span style="color: #ff0000;">,</span>ТаблицаПоТоварамБезУслуг<span style="color: #ff0000;">, </span>Отказ<span style="color: #ff0000;">, </span>Заголовок<span style="color: #ff0000;">)<br />
</span>{<span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">*</span>}</p></blockquote>
<p>Стало (помечтаем о нормальной процедуре проведения документа….)</p>
<blockquote><p>СтруктураДанныхДокумента <span style="color: #ff0000;">= </span>Новый Структура; СтруктураДанныхДокумента<span style="color: #ff0000;">.</span>Добавить<span style="color: #ff0000;">(</span>“СтруктураШапки”<span style="color: #ff0000;">,</span>СтруктураШапкиДокумента<span style="color: #ff0000;">)</span>;<br />
СтруктураДанныхДокумента<span style="color: #ff0000;">.</span>Добавить<span style="color: #ff0000;">(</span>“ТаблицаПоТоварам”<span style="color: #ff0000;">,</span>ТаблицаПоТоварам<span style="color: #ff0000;">)</span>; СтруктураДанныхДокумента<span style="color: #ff0000;">.</span>Добавить<span style="color: #ff0000;">(</span>“ТаблицаПоСкидкам”<span style="color: #ff0000;">,</span>ТаблицаПоСкидкам<span style="color: #ff0000;">)</span>; СтруктураДанныхДокумента<span style="color: #ff0000;">.</span>Добавить<span style="color: #ff0000;">(</span>“ТаблицаПоТоварамБезУслуг”<span style="color: #ff0000;">,</span>ТаблицаПоТоварамБезУслуг<span style="color: #ff0000;">)</span>; СтруктураПараметровПроведения <span style="color: #ff0000;">= </span>Новый Структура; СтруктураПараметровПроведения<span style="color: #ff0000;">.</span>Добавить<span style="color: #ff0000;">(</span>“Режим”<span style="color: #ff0000;">,</span>РежимПроведения<span style="color: #ff0000;">)</span>;<br />
СтруктураПараметровПроведения<span style="color: #ff0000;">.</span>Добавить<span style="color: #ff0000;">(</span>“Отказ”<span style="color: #ff0000;">,</span>Отказ<span style="color: #ff0000;">)</span>;<br />
СтруктураПараметровПроведения<span style="color: #ff0000;">.</span>Добавить<span style="color: #ff0000;">(</span>“ЗаголовокПриОшибке”<span style="color: #ff0000;">,</span>Заголовок<span style="color: #ff0000;">)</span>; <span style="color: #ff0000;">Процедура </span>ДвиженияПоРегистрамУпр<span style="color: #ff0000;">(</span>СтруктураПараметровПроведения<span style="color: #ff0000;">, </span>СтруктураДанныхДокумента<span style="color: #ff0000;">)</span>;</p></blockquote>
<li>……..Надеюсь, из всего вышесказанного уже понятны основные принципы? В <a href="http://www.books.ru/shop/books/30436">основной книге по рефакторингу </a>перечислены несколько десятков его методов, но лучше ведь не слепо копировать шаблоны, а немного думать и самому, тем более что контекст кодирования 1с значительно отличается от контекста обычных объектно-ориентированных языков. <strong>Самодокументируемость, однозначность, обозримость и стильность </strong>вполне обозримый набор принципов, позволяющих понять необходимость исправления кода программы и найти его путь. Только не забываем про главный принцип рефакторинга: за один шаг делается только одно изменение и его правильность подтверждается тестированием. Нам ведь хочется получить не только красивый и легко изменяемый в будущем код, но и сделать так, чтоб он продолжал работать правильно!</li>
]]></content:encoded>
			<wfw:commentRss>http://www.keleg.info/programming/refactoring2/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Глокая Куздра программирования 1С</title>
		<link>http://www.keleg.info/programming/refactoring</link>
		<comments>http://www.keleg.info/programming/refactoring#comments</comments>
		<pubDate>Fri, 26 Dec 2008 02:19:22 +0000</pubDate>
		<dc:creator>keleg</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[1С]]></category>
		<category><![CDATA[рефакторинг]]></category>

		<guid isPermaLink="false">http://www.keleg.info/?p=89</guid>
		<description><![CDATA[
Известен такой анекдот. Вызывает профессор-лингвист студента к доске и говорит: «Пиши: Глокая куздра штеко будланула бокра и курдячит бокренка». «Чего-чего?» было спросил студент, но с авторитетом профессора спорить не стал и честно записал эту абракадабру. А теперь, &#8211; сказал профессор, объясни – о чем говорится в этом предложении? На студента стало жалко смотреть и лектор [...]]]></description>
			<content:encoded><![CDATA[<div class="txt">
<p>Известен такой анекдот. Вызывает профессор-лингвист студента к доске и говорит: «Пиши: Глокая куздра штеко будланула бокра и курдячит бокренка». «Чего-чего?» было спросил студент, но с авторитетом профессора спорить не стал и честно записал эту абракадабру. А теперь, &#8211; сказал профессор, объясни – о чем говорится в этом предложении? На студента стало жалко смотреть и лектор сжалился.</p>
<p>- Ну, кто здесь главное действующее лицо?<br />
- Ку… куздра, &#8211; промямлил студент<br />
- А какая она, эта куздра?<br />
- Глокая! &#8211; уже уверенней произнес студент<br />
- А на кого направлено действие?<br />
- На бокра!<br />
- И что эта куздра сделала?<br />
- Она его будланула! – выкрикнули из аудитории со смехом.<br />
- И штеко, причем, будланула, добавил, улыбнувшись, профессор.<br />
- А вот бокр – он живой?<br />
Студент задумался…<br />
- А! Да! У него бокренок есть!<br />
- У бочки тоже есть бочонок, но это не значит, что она живая. Если бы бокр был неживой, мы бы сказали «будланула бокр», это винительный падеж «кого, что».<br />
Итак, не зная смысла ни одного существительного, прилагательного или глагола мы уже можем достаточно много рассказать о происшедшем. Информацию об этом мы извлекли из вроде бы незначащих вещей – падежей, союзов, окончаний, определяющих отношения между словами в предложении.</p>
<p>Теперь вернемся от языковедения к программированию. При чем здесь Глокая куздра? Много говорилось о том, что названия процедур, функций и переменных должны быть «говорящими» должны соответствовать логике их использования. Но не менее говорящими должны быть и связи между идентификаторами! Даже не зная конкретного смысла программы, можно с первого взгляда увидеть, как она устроена.</p>
<p>Как этого достичь?<br />
Возьмем Глокую куздру.<br />
Но что это? Известно, что Глокая куздра может выполнять несколько действий. Она умеет будлануть, а умеет и курдячить т.е. представляет собой несколько связанных действий. Также известно, что эта куздра именно глокая, т.е. есть изменяемый параметр, явно в природе существуют и другие куздры – неглокие. В 1С логичнее всего оформить нашу куздру как обработку. Ведь бокров она именно «обрабатывает». Теперь, если ввести в тексте программы<br />
Куздра. (с точкой), то система покажет все, что эта куздра умеет делать. Глокая пусть будет реквизитом обработки. Сегодня Куздра будет Глокая, т.е.</p>
<pre>Куздра<span style="color: #ff0000;">.</span>Глокая <span style="color: #ff0000;">= </span>Истина</pre>
<p>Дальше возьмемся за бокра. Документ или справочник наш герой, не так важно, т.к. сам он ничего не делает, кроме одного: как мы помним, куздра его будланула. Т.е. явно состояние бокра изменилось, произошло действие! Что у нас отвечает за действие, что в 1С заменяет глаголы? Процедуры и функции. Теперь нужно выбрать, что будем применять. Можно написать</p>
<pre>Куздра<span style="color: #ff0000;">.</span>Будланула<span style="color: #ff0000;">(</span>бокра<span style="color: #ff0000;">)</span>;</pre>
<p>и это будет почти по-русски. Но из этой записи совершенно не понятно, изменился бокр или нет. Опять же, куздра булданула его <em>штеко</em> т.е. с параметром. Получится</p>
<pre>Куздра<span style="color: #ff0000;">.</span>Булданула<span style="color: #ff0000;">(</span>Бокра<span style="color: #ff0000;">, </span>Штеко<span style="color: #ff0000;">)
</span></pre>
<p>Здесь непонятно, кого куздра булданула – бокра или штеко, что является результатом действия, а что &#8211; его параметром. Самый правильный выход – написать</p>
<pre>Бокр <span style="color: #ff0000;">= </span>Куздра<span style="color: #ff0000;">.</span>Будланула<span style="color: #ff0000;">(</span>Бокр<span style="color: #ff0000;">, </span>Штеко<span style="color: #ff0000;">)
</span></pre>
<p>Теперь все методически правильно. Бокр является параметром и результатом (т.е. изменено его состояние, это объект над которым произошло действие), штеко – параметр. Соответственно продолжим наше повествование. Из него не совсем понятно, когда же это все кончится, когда глокая куздра все-таки закурдячит бокренка, ведь висящая программа нам не нужна. Допустим, бокренка есть функция Конец(), которая определяет конец закурдяченности. Получится такая вот такая конструкция</p>
<pre><span style="color: #ff0000;">Пока </span>Не Бокренок<span style="color: #ff0000;">.</span>Конец<span style="color: #ff0000;">(</span><span style="color: #ff0000;">) Цикл
  </span>Бокренок <span style="color: #ff0000;">= </span>Куздра<span style="color: #ff0000;">.</span>Курдячит<span style="color: #ff0000;">(</span>Бокренок<span style="color: #ff0000;">)
КонецЦикла
</span></pre>
<p>Здесь мы выразили непрерывное, повторяющееся действие через цикл (допустив, что прекращение действия зависит от Бокренка. Если оно зависит, например, от Бокра или состояния самой ГлокойКуздры, это тоже можно было выразить). Дальше еще можно добавить связь между Бокром и Бокренком. Оба они бокры! Значит, это можно выразить, объединив их в структуру, что может понадобиться, например, если нужно будет передать куда-то всех бокров скопом, а не поодиночке.</p>
<p>Итого у нас получилось</p>
<pre>Куздра<span style="color: #ff0000;">.</span>Глокая <span style="color: #ff0000;">= </span>Истина;
Бокры<span style="color: #ff0000;">.</span>Бокр <span style="color: #ff0000;">= </span>Куздра<span style="color: #ff0000;">.</span>Будланула<span style="color: #ff0000;">(</span>Бокры<span style="color: #ff0000;">.</span>Бокр<span style="color: #ff0000;">, </span>Штеко<span style="color: #ff0000;">)</span>;
<span style="color: #ff0000;">Пока </span>Не Бокры<span style="color: #ff0000;">.</span>Бокренок<span style="color: #ff0000;">.</span>Конец<span style="color: #ff0000;">(</span><span style="color: #ff0000;">) Цикл
  </span>Бокры<span style="color: #ff0000;">.</span>Бокренок <span style="color: #ff0000;">= </span>Куздра<span style="color: #ff0000;">.</span>Курдячит<span style="color: #ff0000;">(</span>Бокры<span style="color: #ff0000;">.</span>Бокренок<span style="color: #ff0000;">)</span>;
<span style="color: #ff0000;">КонецЦикла</span>;</pre>
<p>Конечно, по сравнению с богатством русского языка, в пересказе на макроязыке 1С некоторые нюансы шедевра потерялись, но главная нить по-прежнему вполне улавливается. А значит и в языке программирования операторы отношения и присваивания имеют выразительный смысл, который можно и нужно использовать!</p>
<p>Формализуем правила</p>
<li>Связанные между собой по-смыслу действия процедуры и функции полезно объединять</li>
<li>Нужно четко отделять само действие, объект, на который действие направлено и параметры действия. Это три разные вещи!</li>
<li>Для показа изменения состояния объектов данных нагляднее использовать функции, а не процедуры. А так как функция возвращает только один результат не нужно одной процедурой менять все сразу!
<pre>ГлокаяКуздра<span style="color: #ff0000;">(</span>Бокра<span style="color: #ff0000;">, </span>Бокренка<span style="color: #ff0000;">, </span>Будланула<span style="color: #ff0000;">, </span>Курдячит<span style="color: #ff0000;">)
</span></pre>
<p>это не наш путь!</li>
<p>Продолжение</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.keleg.info/programming/refactoring/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
