<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
	<title>Хабрахабр / Проектирование и рефакторинг / Захабренные</title>
	<link>http://habrahabr.ru/rss/blog/refactoring/</link>
	<description><![CDATA[Захабренные посты из блога «Проектирование и рефакторинг» на Хабрахабре]]></description>
	<language>ru</language>
	<managingEditor>editor@habrahabr.ru</managingEditor>
	<generator>habrahabr.ru</generator>
	<pubDate>Sat, 11 Feb 2012 11:20:21 GMT</pubDate>
	<lastBuildDate></lastBuildDate>
	<image>
		<link>http://habrahabr.ru/</link>
		<url>http://habrahabr.ru/i/logo.gif</url>
		<title>Хабрахабр</title>
	</image>
	
		
	
	
	
		
	<item>		
		<title><![CDATA[Проектирование и рефакторинг / [Перевод] Прагматичный подход к производительности]]></title>
		<guid isPermaLink="true">http://habrahabr.ru/blogs/refactoring/135484/</guid>
		<link>http://habrahabr.ru/blogs/refactoring/135484/</link>
		<description><![CDATA[Является преждевременная оптимизация дорогой в ад? Или подход «потом исправим» превращает программистов из «специалистов» в презираемую всеми «школоту»?<br/>
<br/>
Эти вопросы не имеют четких ответов, тем не менее, в этой статье я постараюсь описать мой собственный подход к производительности. Что я делаю для того, чтобы мои системы работали с приличной скоростью, но не нарушали прочих требований, таких как модульность, сопровождаемость и гибкость.<br/>
<div class="habracut"> <a class="habracut" href="http://habrahabr.ru/blogs/refactoring/135484/#habracut">Читать дальше &rarr;</a> </div>]]></description>
		
		<pubDate>Thu, 29 Dec 2011 09:13:35 GMT</pubDate>
		<author>unconnected</author>
		<category>оптимизация кода</category><category>разработка игр</category><category>профилирование</category>
	</item>
	
	
	

		
	<item>		
		<title><![CDATA[Проектирование и рефакторинг / Объектно-ориентированная разработка инсталлятора Gin]]></title>
		<guid isPermaLink="true">http://habrahabr.ru/blogs/refactoring/135310/</guid>
		<link>http://habrahabr.ru/blogs/refactoring/135310/</link>			
		<description><![CDATA[<a href="http://habrahabr.ru/blogs/refactoring/134439/">Ссылка на первую часть</a><br/>
<a href="http://habrahabr.ru/blogs/refactoring/134512/">Ссылка на вторую часть</a><br/>
<a href="http://habrahabr.ru/blogs/refactoring/134439/">Ссылка на третью часть</a><br/>
<br/>
<h4>Ввод данных</h4><br/>
<br/>
Любой инсталлятор должен давать пользователю возможность вводить некоторые стартовый параметры, например, путь к папке, куда будет инсталлирована программа, строка подключения к базе данных, и т.д. Причем, хотелось бы, чтобы это были не просто текстовые поля, а поля, дающие возможность удобного вода данных. Если это путь установки программы, то помимо текстового поля должна быть кнопка «Browse…», если это строка подключения к БД, то пусть рядом будет кнопка для выбора или создания источника данных и т.д.<br/>
<div class="habracut"> <a class="habracut" href="http://habrahabr.ru/blogs/refactoring/135310/#habracut">Читать дальше &rarr;</a> </div>]]></description>
		
		<pubDate>Mon, 26 Dec 2011 11:09:17 GMT</pubDate>
		<author>vgrinin</author>
		<category>ООП</category><category>проектирование</category><category>рефакторинг</category><category>разработка</category><category>инсталлятор</category>
	</item>
	
	
	
	
	
	

		
	<item>		
		<title><![CDATA[Проектирование и рефакторинг / Объектно-ориентированная разработка инсталлятора Gin]]></title>
		<guid isPermaLink="true">http://habrahabr.ru/blogs/refactoring/134876/</guid>
		<link>http://habrahabr.ru/blogs/refactoring/134876/</link>			
		<description><![CDATA[<a href="http://habrahabr.ru/blogs/refactoring/134439/">Ссылка на первую часть</a><br/>
<a href="http://habrahabr.ru/blogs/refactoring/134512/">Ссылка на вторую часть</a><br/>
<h4>Контентные и контейнерные команды</h4><br/>
Некоторые команды подразумевают работу с файлами, изначально хранимыми на компьютере разработчика пакета. Понятно, что эти файлы нужно вместе с пакетом (а желательно, прямо внутри пакета) доставить к потребителю пакета. Попробуем для начала представить себе как это будет работать. <br/>
У нас есть экземпляр класса PackageBuilder, которому при конструировании мы указываем аргумент PackageBody, содержащий в себе, помимо всего прочего, команду Command, которая представляет собой корневой узел дерева команд пакета. Метод SaveResult() экземпляра класса PackageBuilder должен рекурсивно обойти все дерево, и для тех команд, которые используют контентные файлы, расположенные на компьютере разработчика, включить в тело пакета содержимое всех этих файлов. В тело пакета он также должен включить xml-файл, в который будет сериализован сам PackageBody с полным описанием пакета и выполняемых им команд.<br/>
<div class="habracut"> <a class="habracut" href="http://habrahabr.ru/blogs/refactoring/134876/#habracut">Читать дальше &rarr;</a> </div>]]></description>
		
		<pubDate>Mon, 19 Dec 2011 12:17:39 GMT</pubDate>
		<author>vgrinin</author>
		<category>ООП</category><category>проектирование</category><category>рефакторинг</category><category>разработка</category><category>инсталлятор</category><category>контейнер</category>
	</item>
	
	
	
	
	
	

		
	<item>		
		<title><![CDATA[Проектирование и рефакторинг / Объектно-ориентированная разработка инсталлятора Gin]]></title>
		<guid isPermaLink="true">http://habrahabr.ru/blogs/refactoring/134512/</guid>
		<link>http://habrahabr.ru/blogs/refactoring/134512/</link>			
		<description><![CDATA[<a href="http://habrahabr.ru/blogs/refactoring/134439/">Ссылка на первую часть</a><br/>
<h4>Транзакции.</h4><br/>
Напомню, что я собирался реализовать механизм транзакций, позволяющий откатывать блоки операций при возникновении ошибки внутри блока, защищенного транзакцией. Сначала надо решить вопрос с ответственностью за сохранение состояния и за откат операции. Скажу сразу, что архитектура, которую я приведу ниже вырисовалась у меня не сразу, а только после нескольких попыток проектирования и реализации макета, пока у меня не получилось то, что получилось.<br/>
Для того, чтобы архитектура транзакций была легко наращиваемой, воспользуемся как и ранее наследованием. При этом возложим ответственность за сохранение состояние и откат к сохраненному состоянию на саму команду. Учтем при этом, что не все команды являются по сути транзакционными. Например, чтение из реестра не может быть частью транзакции, потому что оно ничего не изменяет в системе. А вот запись в реестр – это уже часть транзакции. И создание файла – это часть транзакции.<br/>
А поэтому объявим еще один абстрактный класс TransactionalCommand, унаследуем его от класса Command. <br/>
<div class="habracut"> <a class="habracut" href="http://habrahabr.ru/blogs/refactoring/134512/#habracut">Читать дальше &rarr;</a> </div>]]></description>
		
		<pubDate>Wed, 14 Dec 2011 05:44:31 GMT</pubDate>
		<author>vgrinin</author>
		<category>ООП</category><category>проектирование</category><category>рефакторинг</category><category>разработка</category><category>инсталлятор</category><category>транзакции</category>
	</item>
	
	
	
	
	
	

	
		
	<item>		
		<title><![CDATA[Проектирование и рефакторинг / [Из песочницы] Объектно-ориентированная разработка инсталлятора Gin]]></title>
		<guid isPermaLink="true">http://habrahabr.ru/blogs/refactoring/134439/</guid>
		<link>http://habrahabr.ru/blogs/refactoring/134439/</link>			
		<description><![CDATA[<h4>Введение</h4><br/>
У предлагаемого вашему вниманию цикла статей есть несколько основных целей:<br/>
<ol>
<li>Создать полезное программное обеспечение – инсталлятор программ и обновлений.</li>
<li>Показать преимущества объектно-ориентированного подхода к разработке ПО и научить создавать легко расширяемые программные архитектуры.</li>
</ol><br/>
В данном цикле статей я хочу поделиться историей создания программного обеспечения, позволяющего производить установку и обновление программных продуктов компании при помощи пакетов. Необходимость создания собственного инсталлятора(с отказом от использования готовых решений) вызвана специфичностью требований к инсталлятору. Я не буду углубляться в обоснование необходимости разработки, так как тема цикла статей другая.<br/>
Основными требованиями к разрабатываемой архитектуре будут:<br/>
<ol>
<li>Реализация механизма транзакций, причем транзакции могут включать в себя не только SQL-транзакции, но и файловые, а также транзакции, связанные с изменением любых других ресурсов ОС, таких как записи в реестре, изменения конфигурационных файлов и т.д.</li>
<li>Расширяемость операционной базы инсталлятора, то есть, добавление новых типов команд(операций), как с поддержкой транзакций, так и без нее.</li>
</ol><br/>
<div class="habracut"> <a class="habracut" href="http://habrahabr.ru/blogs/refactoring/134439/#habracut">Читать дальше &rarr;</a> </div>]]></description>
		
		<pubDate>Mon, 12 Dec 2011 10:12:30 GMT</pubDate>
		<author>vgrinin</author>
		<category>ООП</category><category>проектирование</category><category>рефакторинг</category><category>разработка</category><category>инсталлятор</category>
	</item>
	
	
	
	
	

		
	<item>		
		<title><![CDATA[Проектирование и рефакторинг / Идеальная архитектура]]></title>
		<guid isPermaLink="true">http://habrahabr.ru/blogs/refactoring/133287/</guid>
		<link>http://habrahabr.ru/blogs/refactoring/133287/</link>			
		<description><![CDATA[Существует много разных взглядов на разработку архитектуры и дизайна современных приложений. Некоторые архитекторы стремятся продумать все до мелочей, разрисовать use case-ы всех классов и модулей, проанализировать миллион возможных способов их использования, все их обязательно задокументировать и уже потом приступить к этапу кодирования. <br/>
<br/>
Другие, наоборот, считают, что «думать уже поздно» и давным-давно пора «делать», поэтому они кидаются на баррикады с криками «Ура», выдавая на гора тонны никому не нужного кода. Как и любая крайность, такой подход не приводит ни к чему хорошему. Но, как и во многих других случаях, существует промежуточный вариант, когда проектированию и архитектуре уделяется должное внимание, когда они не ставятся во главу угла, а используются для выявления правильных абстракций и поиска компромиссов в противоречивых требованиях заказчика. <br/>
<br/>
<div class="habracut"> <a class="habracut" href="http://habrahabr.ru/blogs/refactoring/133287/#habracut">Читать дальше &rarr;</a> </div>]]></description>
		
		<pubDate>Wed, 23 Nov 2011 21:01:43 GMT</pubDate>
		<author>SergeyT</author>
		<category>принципы проектирования</category><category>архитектура приложений</category>
	</item>
	
	
	
	
	
	

		
	<item>		
		<title><![CDATA[Проектирование и рефакторинг / Библия проектирования. Часть вторая. Костыли, изгнание из рая, Каин, Авель, и снова с чистого листа]]></title>
		<guid isPermaLink="true">http://habrahabr.ru/blogs/refactoring/132254/</guid>
		<link>http://habrahabr.ru/blogs/refactoring/132254/</link>			
		<description><![CDATA[<img src="http://img1.liveinternet.ru/images/attach/c/3/76/328/76328251_1725009_izgnanie.jpg" alt="image"/><br/>
<br/>
Вот он первый сорванный дедлайн. Пока еще маленький звоночек больших проблем. <br/>
Проходит время, про контер-страйк уже никто не вспоминает, и вместе со слоем пыли на столе для пинг-понга, растет напряжение. <br/>
Поломка последней кофе-машины на этаже стала причиной экстренного совещания, и есть только один человек, который сможет найти решение. <br/>
<br/>
Из последних сил и отбросив такт, ты начинаешь свой рассказ.<br/>
<br/>
<div class="habracut"> <a class="habracut" href="http://habrahabr.ru/blogs/refactoring/132254/#habracut">Читать дальше &rarr;</a> </div>]]></description>
		
		<pubDate>Wed, 09 Nov 2011 14:04:15 GMT</pubDate>
		<author>crmMaster</author>
		<category>речь</category><category>программисты</category><category>шоковая терапия</category>
	</item>
	
	
	
	
	
	

		
	<item>		
		<title><![CDATA[Проектирование и рефакторинг / Библия проектирования. Часть первая. Создание мира]]></title>
		<guid isPermaLink="true">http://habrahabr.ru/blogs/refactoring/132179/</guid>
		<link>http://habrahabr.ru/blogs/refactoring/132179/</link>			
		<description><![CDATA[<img src="http://www.graphic.org.ru/history/karolsfeld-sm/3.jpg" alt="image"/><br/>
<br/>
Ну вот ты и стал главным. Теперь все тебя будут слушаться, а твои спецификации будут цитировать в джире зарвавшимся еретикам. Твое творение будет вечным, и пока ты здесь, никто не сможет его уничтожить. На радостях ты выпиваешь лишние пол-литра амброзии, а в понедельник приходишь с больной головой, готовый творить. <br/>
<br/>
<div class="habracut"> <a class="habracut" href="http://habrahabr.ru/blogs/refactoring/132179/#habracut">Читать дальше &rarr;</a> </div>]]></description>
		
		<pubDate>Tue, 08 Nov 2011 16:35:24 GMT</pubDate>
		<author>crmMaster</author>
		<category>проектирование</category><category>система</category><category>мир</category>
	</item>
	
	
	
	
	
	

	
		
	<item>		
		<title><![CDATA[Проектирование и рефакторинг / [Из песочницы] Нормализация отношений. Первая и вторая нормальные формы]]></title>
		<guid isPermaLink="true">http://habrahabr.ru/blogs/refactoring/129195/</guid>
		<link>http://habrahabr.ru/blogs/refactoring/129195/</link>			
		<description><![CDATA[<h4>Предисловие</h4><br/>
<b>Нормализация отношений</b> (таблиц) — одна из основополагающих частей теории реляционных баз данных. Нормализация имеет своей целью избавиться от избыточности в отношениях и модифицировать их структуру таким образом, чтобы процесс работы с ними не был обременён различными посторонними сложностями. При игнорировании такого подхода эффективность проектирования стремительно снижается, что вкупе с прочими подобными вольностями может привести к критическим последствиям.<br/>
<br/>
Любому специалисту, по роду своей деятельности так или иначе связанному с проектированием реляционных баз данных, полезно понимать и уметь осуществить нормализацию отношений. И этим постом хотелось бы начать небольшую серию публикаций, посвящённых нормальным формам, имеющую целью дать тем читателям Хабрахабра, которые по различным обстоятельствам ещё не освоили эту тему, возможность легко заполнить этот пробел в знаниях.<br/>
<br/>
Статья не имеет своей целью подробное и точное изложение принципов нормализациии, поскольку это, очевидно, невозможно в рамках блога в силу больших объёмов информации, необходимых для публикации при таком подходе. Кроме этого, для такой цели существует большое количество литературы, написанной прекрасными специалистами. Моя же задача, как я считаю, заключается в том, чтобы популярно продемонстрировать и объяснить <i>основные</i> принципы. <div class="habracut"> <a class="habracut" href="http://habrahabr.ru/blogs/refactoring/129195/#habracut">Читать дальше &rarr;</a> </div>]]></description>
		
		<pubDate>Mon, 26 Sep 2011 18:59:00 GMT</pubDate>
		<author>ngfrolov</author>
		<category>реляционные базы данных</category><category>нормализация отношений</category><category>нормальные формы</category><category>первая нормальная форма</category><category>1НФ</category><category>вторая нормальная форма</category><category>2НФ</category>
	</item>
	
	
	
	
	

		
	<item>		
		<title><![CDATA[Проектирование и рефакторинг / Принцип самурая]]></title>
		<guid isPermaLink="true">http://habrahabr.ru/blogs/refactoring/128397/</guid>
		<link>http://habrahabr.ru/blogs/refactoring/128397/</link>			
		<description><![CDATA[В мире разработки софта существует много идей и «метафор», позаимствованных из других, казалось бы, не сильно связанных с программированием областей. Можно вспомнить паттерны проектирования, позаимствованные у архитекторов, или понятие «технического долга», пришедшее из финансовой индустрии, да и «эффектом второй системы» страдают проектировщики любых систем, а не только программных (*). Все это упрощает коммуникацию между разработчиками или между разработчиками и заказчиками, а также упрощает понимание той или иной проблемы в разработке ПО.<br/>
<br/>
Еще одной метафорой, или скорее принципом разработки, является «<b>принцип самурая</b>», призванный описать «контракт» между функцией и вызывающим ее кодом и заключается в следующем. Любая функция, реализующая некоторую единицу работы должна следовать тому же кодексу чести «бусидо», по которому живет любой самурай. Так, самурай не будет выполнять никаких заданий, противоречащих его «кодексу чести» и если к нему подойти с «непристойным» предложением, то он снесет вам башку раньше, чем вы успеете глазом моргнуть. Но если уж самурай возьмется за дело, то можно быть уверенным в том, что он доведет его до конца (**). <br/>
<div class="habracut"> <a class="habracut" href="http://habrahabr.ru/blogs/refactoring/128397/#habracut">Читать дальше &rarr;</a> </div>]]></description>
		
		<pubDate>Tue, 13 Sep 2011 20:03:21 GMT</pubDate>
		<author>SergeyT</author>
		<category>Принципы проектирования</category>
	</item>
	
	
	
	
	
	

		
	<item>		
		<title><![CDATA[Проектирование и рефакторинг / Эпидемия в данных]]></title>
		<guid isPermaLink="true">http://habrahabr.ru/blogs/refactoring/125719/</guid>
		<link>http://habrahabr.ru/blogs/refactoring/125719/</link>			
		<description><![CDATA[Хочу рассказать одну историю о том, как однажды никем не предвиденная проблема нанесла финансовый ущерб бизнесу одной крупной корпорации. Я расскажу о причинах возникновения этой проблемы, о том, как мы ее побороли и о том, как решить ее правильно. Надеюсь эта статья поможет проектировщикам избежать подобных ситуаций в будущем.<br/>
<div class="habracut"> <a class="habracut" href="http://habrahabr.ru/blogs/refactoring/125719/#habracut">Читать дальше &rarr;</a> </div>]]></description>
		
		<pubDate>Fri, 05 Aug 2011 12:30:00 GMT</pubDate>
		<author>dbratus</author>
		<category>архитектура</category><category>проектирование</category>
	</item>
	
	
	
	
	
	

	
		
	<item>		
		<title><![CDATA[Проектирование и рефакторинг / [Из песочницы] Обеспечение бесперебойного клиент-серверного взаимодействия(WEB)]]></title>
		<guid isPermaLink="true">http://habrahabr.ru/blogs/refactoring/124410/</guid>
		<link>http://habrahabr.ru/blogs/refactoring/124410/</link>			
		<description><![CDATA[Данным постом постараюсь описать протокол с помощью которого можно повысить надежность ВЕБ-приложения при возникновении проблем соединения с сервером. Постараюсь описать абстрагируясь от технологий однако в тексте будут приведены примеры серверного Java кода и JavaScript/SmartClient на UI для наглядности описуемого и по причине того что данный протокол был реализован в рамках существующего проекта с использованием данных технологий.<br/>
<div class="habracut"> <a class="habracut" href="http://habrahabr.ru/blogs/refactoring/124410/#habracut">Читать дальше &rarr;</a> </div>]]></description>
		
		<pubDate>Mon, 18 Jul 2011 21:43:47 GMT</pubDate>
		<author>PaulGauguin</author>
		<category>web</category><category>java</category><category>javascript</category><category>http 404</category><category>http 503</category><category>smartclient</category><category>stable</category><category>reliability</category>
	</item>
	
	
	
	
	

		
	<item>		
		<title><![CDATA[Проектирование и рефакторинг / Паттерны поведения]]></title>
		<guid isPermaLink="true">http://habrahabr.ru/blogs/refactoring/123070/</guid>
		<link>http://habrahabr.ru/blogs/refactoring/123070/</link>			
		<description><![CDATA[(Эта заметка является завершением серии постов, в которую вошли <a href="http://habrahabr.ru/blogs/refactoring/119490/">«Технический долг»</a>, <a href="http://habrahabr.ru/blogs/refactoring/120000/">«Синдром рефакторинга»</a> и <a href="http://habrahabr.ru/blogs/refactoring/121213/">«Эффект второй системы»</a>)<br/>
<br/>
В чем польза паттернов проектирования? (*) Это, прежде всего, повторное использование проверенных архитектурных решений, а также упрощение коммуникаций между разработчиками. Но ведь помимо паттернов <b>проектирования</b> существует и масса других паттернов: существуют паттерны кодирования, тестирования, модификации кода (a.k.a. рефакторинг), существуют архитектурные паттерны и многие другие. Поскольку мы, на самом деле, редко делаем что-либо по-настоящему новое, то проверенные типовые решения существуют для огромного количества областей. И поскольку большинство проблем, с которыми сталкиваются команды разработчиков, также не отличаются разнообразием, то и поведение этих людей также весьма однообразно.<br/>
<br/>
<a href="http://sergeyteplyakov.blogspot.com/2011/05/blog-post.html">«Технический долг»</a>,<a href="http://sergeyteplyakov.blogspot.com/2011/05/blog-post_26.html"> «синдром рефакторинга»</a> и <a href="http://sergeyteplyakov.blogspot.com/2011/06/blog-post.html">«эффект второй системы»</a> — это типовые ситуации, с которыми периодически сталкивается команда разработчиков. И главная польза от них как раз и заключается в том, чтобы увидеть проблему и доказать ее существование нужным людям. Если вы сами поняли, что технический долг проекта слишком велик, то используя денежную метафору будет уже значительно проще доказать важность этой проблемы менеджеру или заказчику. А затем взвешенно показать ему альтернативные пути развития событий: (1) оставить все, как есть; (2) уменьшить технический долг путем разумного рефакторинга или (3) переписать все нафиг.<br/>
<div class="habracut"> <a class="habracut" href="http://habrahabr.ru/blogs/refactoring/123070/#habracut">Читать дальше &rarr;</a> </div>]]></description>
		
		<pubDate>Wed, 29 Jun 2011 20:48:21 GMT</pubDate>
		<author>SergeyT</author>
		<category>проектирование</category><category>паттерны поведения</category><category>антипаттерны</category>
	</item>
	
	
	
	
	
	

		
	<item>		
		<title><![CDATA[Проектирование и рефакторинг / Эффект второй системы]]></title>
		<guid isPermaLink="true">http://habrahabr.ru/blogs/refactoring/121213/</guid>
		<link>http://habrahabr.ru/blogs/refactoring/121213/</link>			
		<description><![CDATA[Когда <a href="http://sergeyteplyakov.blogspot.com/2011/05/blog-post.html">технический долг</a> команды потихоньку начинает превышать все мыслимые и немыслимые границы, то у команды появляется как минимум два способа его погашения: отрефакторить систему таким образом, чтобы стоимость будущих изменений была не столь высокой или оставить текущую версию системы в покое и переписать все заново. В первом случае легко столкнуться с <a href="http://sergeyteplyakov.blogspot.com/2011/05/blog-post_26.html">синдромом рефакторинга</a>, когда изменения делаются не с расчетом уменьшения стоимости будущих изменений, а вносятся просто ради изменений. Во втором же случае может возникнуть «эффект второй системы», когда развиваются и совершенствуются уже никому не нужные функции системы, а мысль «а не переписать ли все нафиг» является первой и единственной, которая приходит в голову команде, как только она сталкивается с чужим кодом.<br/>
<br/>
И хотя в классическом понимании «эффект второй системы» немного отличается от паталогической нелюбви к чужому коду и постоянному его переписыванию, оба эти случая имеют и что-то общее, так что имеет смысл оба эти симптома рассмотреть совместно.<br/>
<div class="habracut"> <a class="habracut" href="http://habrahabr.ru/blogs/refactoring/121213/#habracut">Читать дальше &rarr;</a> </div>]]></description>
		
		<pubDate>Mon, 13 Jun 2011 07:17:14 GMT</pubDate>
		<author>SergeyT</author>
		<category>проектирование</category><category>брукс</category>
	</item>
	
	
	
	
	
	

		
	<item>		
		<title><![CDATA[Проектирование и рефакторинг / Синдром рефакторинга]]></title>
		<guid isPermaLink="true">http://habrahabr.ru/blogs/refactoring/120000/</guid>
		<link>http://habrahabr.ru/blogs/refactoring/120000/</link>			
		<description><![CDATA[<img src="http://sourcemaking.com/files/sm/images/arch2.jpg" alt="image"/><br/>
Бытует мнение, что программные системы, будучи объектом не совсем материальным, не поддаются старению. И если говорить о старении физическом, то действительно, шансы на то, что буковка “o” в имени класса вдруг от старости ссохнется и превратится в букву “c” – действительно малы. Но вместо старения физического, программные системы стареют морально.  Со временем накапливается груз ошибок за счет неточностей в исходных требованиях, непонимания требований самим заказчиком, архитектурных ошибок или неудачных компромиссных решений; да и ошибки поменьше, типа слабопонятного кода, его высокой связности, отсутствия юнит-тестов и комментариев делают свое черное дело. Все это приводит к накоплению <a href="http://sergeyteplyakov.blogspot.com/2011/05/blog-post.html">технического долга</a> (о котором шла речь в прошлый раз), из-за которого при добавлении новой возможности в систему приходиться платить «проценты» в виде более высокой стоимости реализации и более низкого качества получаемого результата. <br/>
<div class="habracut"> <a class="habracut" href="http://habrahabr.ru/blogs/refactoring/120000/#habracut">Читать дальше &rarr;</a> </div>]]></description>
		
		<pubDate>Thu, 26 May 2011 05:19:14 GMT</pubDate>
		<author>SergeyT</author>
		<category>рефакторинг</category><category>антипаттерны</category>
	</item>
	
	
	
	
	
	

		
	<item>		
		<title><![CDATA[Проектирование и рефакторинг / Технический долг]]></title>
		<guid isPermaLink="true">http://habrahabr.ru/blogs/refactoring/119490/</guid>
		<link>http://habrahabr.ru/blogs/refactoring/119490/</link>			
		<description><![CDATA[Будь вы простым программистом, матерым лидом, архитектором или даже ПМ-ом, вы наверняка в своей нелегкой работе сталкивались с проблемой выбора при добавлении в систему новой возможности. Одно решение гораздо проще реализовать в сжатые сроки и успеть к очередному очень важному релизу, однако оно будет более затратное в сопровождении, менее расширяемое или менее надежное. Другое решение может не обладать всеми этими недостатками, однако обладать другим, в некоторых случаях более важным недостатком – на его реализацию потребуется значительно больше времени.<br/>
<div class="habracut"> <a class="habracut" href="http://habrahabr.ru/blogs/refactoring/119490/#habracut">Читать дальше &rarr;</a> </div>]]></description>
		
		<pubDate>Wed, 18 May 2011 04:24:23 GMT</pubDate>
		<author>SergeyT</author>
		<category>Проектирование</category>
	</item>
	
	
	
	
	
	

	
		
	<item>		
		<title><![CDATA[Проектирование и рефакторинг / [Из песочницы] Рефакторинг проекта в SVN с помощью ANT]]></title>
		<guid isPermaLink="true">http://habrahabr.ru/blogs/refactoring/119013/</guid>
		<link>http://habrahabr.ru/blogs/refactoring/119013/</link>			
		<description><![CDATA[В статье описывается способ разделения логики и реализации логики в ant-скриптах, примененный для решения одной практической задаче по рефакторингу большого проекта в SVN-репозитории.<br/>
<br/>
<h5>Предыстория</h5><br/>
Имеется проект в SVN из 15 000 файлов и 5 000 папок. Проекту почти 10 лет, на нем поработало несколько поколений разработчиков разной квалификации. В какой-то момент, пару-тройку лет назад, а может и раньше, архитектура проекта «потекла». Разные модули и слои стали писаться в разных стандартах организации кода, возникли циклические зависимости между модулями. В итоге в SVN за долгие года образовалась свалка. Проект собирается, но совершенно шаманским способом.<br/>
<br/>
<h5>Задача</h5><br/>
Привести код к единому формату хранения. При этом сохранить историю изменений по каждому файлу и не останавливать процесс разработки. <br/>
<br/>
<h6>Сложности</h6><br/>
Сохранить историю по одному файлу или папке в SVN довольно просто с помощью команды <a href="http://svnbook.red-bean.com/en/1.5/svn.ref.svn.c.copy.html">svn copy</a>. При небольшом количестве файлов все можно сделать вручную.<br/>
 С разбором большого проекта сложно. Пока будешь вручную разбирать 15 000 файлов, разработчики накоммитят новых изменений и их тоже нужно будет копировать. Замкнутый круг.<br/>
Нужна автоматизация. Скриптик, который раз! — и переводит проект в новую структуру.<br/>
<br/>
<h5>Результат</h5><br/>
Задача была выполнена, а побочным продуктом стал подход к написанию ANT-скриптов, который в большом программировании называется инкапсуляция. Хочу поделиться полученным подходом.<br/>
<br/>
<div class="habracut"> <a class="habracut" href="http://habrahabr.ru/blogs/refactoring/119013/#habracut">Читать дальше &rarr;</a> </div>]]></description>
		
		<pubDate>Wed, 11 May 2011 05:13:47 GMT</pubDate>
		<author>qwazer</author>
		<category>ant</category><category>svn</category><category>refactoring</category><category>subversion</category><category>рефакторинг</category>
	</item>
	
	
	
	
	

		
	<item>		
		<title><![CDATA[Проектирование и рефакторинг / Построение отказоустойчивой (fault tolerant) системы]]></title>
		<guid isPermaLink="true">http://habrahabr.ru/blogs/refactoring/118496/</guid>
		<link>http://habrahabr.ru/blogs/refactoring/118496/</link>			
		<description><![CDATA[В разработке банковского ПО данному аспекту системы уделяется наибольшее внимание. Часто, описывая отказоустойчивую систему, используют слова: Fault Tolerance, Resilience, Reliability, Stability, DR (disaster recovery). Данная характеристика — суть способность системы продолжать корректно работать при падении одной или нескольких подсистем, от которых она зависит. Я кратко опишу какие подходы могут применяться в данной области и приведу пару примеров.<br/>
 <div class="habracut"> <a class="habracut" href="http://habrahabr.ru/blogs/refactoring/118496/#habracut">Читать дальше &rarr;</a> </div>]]></description>
		
		<pubDate>Tue, 03 May 2011 03:39:17 GMT</pubDate>
		<author>javaspecialist</author>
		<category>отказоустойчивость</category><category>fault tolerance</category><category>resilience</category><category>reliability</category><category>DR</category>
	</item>
	
	
	
	
	
	

	
		
	<item>		
		<title><![CDATA[Проектирование и рефакторинг / [Из песочницы] Юнит тесты в ASP.NET WebForms]]></title>
		<guid isPermaLink="true">http://habrahabr.ru/blogs/refactoring/118409/</guid>
		<link>http://habrahabr.ru/blogs/refactoring/118409/</link>			
		<description><![CDATA[<h4>Про юнит тесты</h4><br/>
Юнит тесты, как известно, это таблетка от головной боли разработчика ПО. Если использовать правильно и по инструкции, то здоровый цвет лица и блеск в глазах обеспечен и без стимулирующих средств. Про юнит тесты говорят по разному: с придыханием те кто прочитал о них в MSDN журнале, с восхищением те кто уже окунулся в мир прекрасного, и с сожалением те кто волею судеб вынужден работать в среде категорически неприемлющей эту ману небесную. Первым я могу лишь пожелать решительности, вторым апплодирую, а вот третим и адресована эта статья.<br/>
<br/>
<h4>Кому это? О чем?</h4><br/>
Данная статья посвящается таким же как и я, разработчикам корпоративных сайтов на C#/ASP.NET WebForms. Людям которые, как и я, доросли до осознания факта, что ASP.NET WebForms это классно, но не совсем. Не совсем, потому что вебформы не поддерживают юнит тесты, а следовательно и TDD. И единственный практический способ написания стойкого кода это вдумчивое чтение оного. Так я мучался последние несколько лет развивая существующие асп.нет проекты, пока наконец не прозрел. О прозрении и пойдет речь.<br/>
<div class="habracut"> <a class="habracut" href="http://habrahabr.ru/blogs/refactoring/118409/#habracut">Читать дальше &rarr;</a> </div>]]></description>
		
		<pubDate>Fri, 29 Apr 2011 18:14:43 GMT</pubDate>
		<author>rroyter</author>
		<category>asp.net</category><category>unit testing</category><category>юнит-тесты</category><category>c-sharp</category>
	</item>
	
	
	
	
	

		
	<item>		
		<title><![CDATA[Проектирование и рефакторинг / Интеграция информационных систем]]></title>
		<guid isPermaLink="true">http://habrahabr.ru/blogs/refactoring/117468/</guid>
		<link>http://habrahabr.ru/blogs/refactoring/117468/</link>			
		<description><![CDATA[Ни для кого не секрет, что «уже все сделано до нас». Осталась всего-то малость «собрать фрагменты» для решения поставленной задачи. И тут оказывается, что интегрировать разобщенные части не редко сложнее, чем их написать. Почему же так происходит? Что можно с этим сделать?<br/>
 <div class="habracut"> <a class="habracut" href="http://habrahabr.ru/blogs/refactoring/117468/#habracut">Читать дальше &rarr;</a> </div>]]></description>
		
		<pubDate>Thu, 14 Apr 2011 22:42:31 GMT</pubDate>
		<author>MarcusAurelius</author>
		<category>архитектура</category><category>интеграция</category><category>сервисы</category><category>информационные системы</category><category>взаимодействие</category>
	</item>
	
	
	
	
	
	

	

	
	
	
	
	
</channel>
</rss>

