<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>https://lib.custis.ru/index.php?action=history&amp;feed=atom&amp;title=AgileDays-2011%3A_%D0%9E%D1%82%D1%87%D0%B5%D1%82_%D0%9A%D1%83%D0%B4%D1%80%D1%8F%D0%B2%D1%86%D0%B5%D0%B2%D0%B0_%D0%92.%D0%91%2F%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D0%B2_Agile</id>
		<title>AgileDays-2011: Отчет Кудрявцева В.Б/Архитектура в Agile - История изменений</title>
		<link rel="self" type="application/atom+xml" href="https://lib.custis.ru/index.php?action=history&amp;feed=atom&amp;title=AgileDays-2011%3A_%D0%9E%D1%82%D1%87%D0%B5%D1%82_%D0%9A%D1%83%D0%B4%D1%80%D1%8F%D0%B2%D1%86%D0%B5%D0%B2%D0%B0_%D0%92.%D0%91%2F%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D0%B2_Agile"/>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/index.php?title=AgileDays-2011:_%D0%9E%D1%82%D1%87%D0%B5%D1%82_%D0%9A%D1%83%D0%B4%D1%80%D1%8F%D0%B2%D1%86%D0%B5%D0%B2%D0%B0_%D0%92.%D0%91/%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D0%B2_Agile&amp;action=history"/>
		<updated>2026-04-11T16:01:26Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.26.4</generator>

	<entry>
		<id>https://lib.custis.ru/index.php?title=AgileDays-2011:_%D0%9E%D1%82%D1%87%D0%B5%D1%82_%D0%9A%D1%83%D0%B4%D1%80%D1%8F%D0%B2%D1%86%D0%B5%D0%B2%D0%B0_%D0%92.%D0%91/%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D0%B2_Agile&amp;diff=26682&amp;oldid=prev</id>
		<title>StasFomin: Новая страница: «  Андрей Бибичев.  ;Презентация: [http://www.slideshare.net/biBIGine/agile-7158754 Документ на slideshare.net (Спасибо Ди...»</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/index.php?title=AgileDays-2011:_%D0%9E%D1%82%D1%87%D0%B5%D1%82_%D0%9A%D1%83%D0%B4%D1%80%D1%8F%D0%B2%D1%86%D0%B5%D0%B2%D0%B0_%D0%92.%D0%91/%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D0%B2_Agile&amp;diff=26682&amp;oldid=prev"/>
				<updated>2011-05-10T08:34:48Z</updated>
		
		<summary type="html">&lt;p&gt;Новая страница: «  Андрей Бибичев.  ;Презентация: [http://www.slideshare.net/biBIGine/agile-7158754 Документ на slideshare.net (Спасибо Ди...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;  Андрей Бибичев.&lt;br /&gt;
&lt;br /&gt;
;Презентация: [http://www.slideshare.net/biBIGine/agile-7158754 Документ на slideshare.net (Спасибо Диме Белобородову за ссылку)]&lt;br /&gt;
&lt;br /&gt;
Хороший [[Архитектура в Agile — переосмысляя идею модульности и компонентности (Андрей Бибичев, AgileDays-2011)|доклад]] про паттерны и антипаттерны ООП. Интересно, однако, что внедрение многих хороших упомянутых практик в RMS (и в ЗИС вообще) началось по инициативе «снизу», а не пришло из TechEvol.&lt;br /&gt;
&lt;br /&gt;
Вполне можно использовать как справочник или мантру для размышления каждый вечер&lt;br /&gt;
&lt;br /&gt;
==== Общее ====&lt;br /&gt;
* Неустойчивый код '''='''&lt;br /&gt;
;'''+''' Side-effects&lt;br /&gt;
;'''+''' Избыточная область видимости&lt;br /&gt;
;'''+''' Мутабельность всего и вся&lt;br /&gt;
;'''+''' Большие глобальные контексты&lt;br /&gt;
* God-класс&lt;br /&gt;
** Огромные классы, которые умеют «все». Их рост все труднее остановить, так как новую функциональность становится все проще реализовать внутри такого класса и все сложнее вне его.&lt;br /&gt;
** Может помочь паттерн State (GoF)&lt;br /&gt;
** В RMS пример такого класс — &amp;lt;tt&amp;gt;InitialDataTestBase&amp;lt;/tt&amp;gt;, базовый класс тестов с деревней&lt;br /&gt;
* Огромные функции&lt;br /&gt;
** Андрей привел пример из Open-Source проекта, функцию длиной 9520 строк&lt;br /&gt;
&lt;br /&gt;
==== Взаимодействие классов ====&lt;br /&gt;
* Длинные руки объектов = длинные цепочки вызовов по большим графам объектов&lt;br /&gt;
&lt;br /&gt;
Как бороться?&lt;br /&gt;
* Inversion of Control (наиболее предпочитаемый метод — через конструктор)&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Law_of_Demeter Law of Demeter]&lt;br /&gt;
* Принцип «Tell, don’t ask»&lt;br /&gt;
** рекомендую посмотреть пример из презентации&lt;br /&gt;
&lt;br /&gt;
==== Наследование ====&lt;br /&gt;
Способы:&lt;br /&gt;
* Общие данные + helper-методы к ним&lt;br /&gt;
** чаще всего наследников мало&lt;br /&gt;
** не предполагаться написание новых наследников&lt;br /&gt;
** сам базовый класс в API никак не фигурирует&lt;br /&gt;
** правки наследников рушат базовый&lt;br /&gt;
* Расширение функциональности за счет перекрытия виртуальных методов&lt;br /&gt;
** Отдельная проблема — когда вызывать базовую реализацию в перекрытом методе, «до» или «после»&lt;br /&gt;
** Очень тяжело, если на n+1 уровне нужно что-то изменить&lt;br /&gt;
* Наследование как отношение «is»&lt;br /&gt;
** Методы добавляют новое поведение&lt;br /&gt;
** иногда очень тяжело правильно понять, к какой иерархии отнести класс, цена ошибки очень высока&lt;br /&gt;
&lt;br /&gt;
По возможности, от наследования лучше отказываться:&lt;br /&gt;
* Interface over inheritance&lt;br /&gt;
* Composition over Inheritance&lt;br /&gt;
* Delegation over Inhertance&lt;br /&gt;
&lt;br /&gt;
==== Что еще ====&lt;br /&gt;
* AOP&lt;br /&gt;
* Design by contract&lt;br /&gt;
** Хорошо не статическим проверками, а тем, что программист задумывается над тем что пишет&lt;br /&gt;
** Инструмент .NET — Microsoft Code Contracts&lt;br /&gt;
** Варианты проверок: предусловия, постусловия, инварианты&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	</feed>