<?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>В поисках успеха &#187; programming</title>
	<atom:link href="http://sheremetov.com/category/programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://sheremetov.com</link>
	<description>Блог оптимистичного менеджера проектов</description>
	<lastBuildDate>Sun, 22 Aug 2010 06:53:15 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Перевод документации к PureMVC</title>
		<link>http://sheremetov.com/flash/puremvc-translation/</link>
		<comments>http://sheremetov.com/flash/puremvc-translation/#comments</comments>
		<pubDate>Tue, 13 Jul 2010 18:10:18 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[flash]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[translation]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=760</guid>
		<description><![CDATA[Какое-то время тому назад, мы с группой энтузиастов:

Романом Павленко
Денисом “Barmaleychik” Волохом
Дмитрием “Reijii” Кочетовым
Ростиславом “RostislavR” Сирыком

cделали перевод документации к PureMVC а Клифф Холл опубликовал.

Со временем в переводе было найдено массу огрехов, благодаря читателям flash-ripper.com но обновленный документ развалил нам структуру вордовского документа, который Клифф использует для конвертации документации в pdf, и окончательно опустив руки в борьбе [...]]]></description>
			<content:encoded><![CDATA[<p>Какое-то время тому назад, мы с группой энтузиастов:</p>
<ul>
<li>Романом Павленко</li>
<li><a href="http://denisvolokh.blogspot.com/">Денисом “Barmaleychik” Волохом</a></li>
<li><a href="http://reijii.solartxit.com/">Дмитрием “Reijii” Кочетовым</a></li>
<li><a href="http://flash-ripper.com/">Ростиславом “RostislavR” Сирыком</a></li>
</ul>
<p>cделали перевод документации к <a href="http://puremvc.org/">PureMVC</a> а Клифф Холл опубликовал.
</p>
<p>Со временем в переводе было найдено массу огрехов, благодаря читателям <a href="http://flash-ripper.com/">flash-ripper.com</a> но обновленный документ развалил нам структуру вордовского документа, который Клифф использует для конвертации документации в pdf, и окончательно опустив руки в борьбе с Microsoft Word исправленный перевод был закинут в долгий ящик. Недавно, разгребая завалы неоконченных дел, я нашел этот документ и решил опубликовать его хотя бы в блоге, - надеюсь ищущие найдут его тут. </p>
<p>Перевод не ограничен действиями лицензий - вы можете печатать его, давать почитать друзьям, изменять его как вам заблагорассудится и даже продавать. Прочитать его можно <a href="http://sheremetov.com/puremvc">тут</a></p>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/flash/puremvc-translation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ООП для чайников. Паттерны проектирования. Паттерн стратегия (Strategy)</title>
		<link>http://sheremetov.com/oop/oop-pattern-strategy/</link>
		<comments>http://sheremetov.com/oop/oop-pattern-strategy/#comments</comments>
		<pubDate>Tue, 01 Jun 2010 05:00:46 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[oop]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=733</guid>
		<description><![CDATA[Паттерн стратегия используется для сокрытия (инкапсуляции) алгоритмов. То&#160;есть, у&#160;вас есть несколько путей решения одной и&#160;той&#160;же проблемы&#160;&#8212; сортировки строк, например, но&#160;они очень отличаются в&#160;производительности, требованиям к&#160;ресурсам и&#160;проч. Для этого вы&#160;реализуете несколько алгоритмов сортировки:

Cортировку вставками (Insertion sort), сортирующую за&#160;конечное время и&#160;эффективному при небольших массивах, а&#160;также с&#160;частично отсортированными массивами
Быструю сортировку (Quicksort), сортирующую быстрее, но&#160;требующую O(log n) дополнительной памяти
Сортировку [...]]]></description>
			<content:encoded><![CDATA[<p>Паттерн стратегия используется для сокрытия (инкапсуляции) алгоритмов. То&nbsp;есть, у&nbsp;вас есть несколько путей решения одной и&nbsp;той&nbsp;же проблемы&nbsp;&mdash; сортировки строк, например, но&nbsp;они очень отличаются в&nbsp;производительности, требованиям к&nbsp;ресурсам и&nbsp;проч. Для этого вы&nbsp;реализуете несколько алгоритмов сортировки:</p>
<ol>
<li><a href="http://ru.wikipedia.org/wiki/Сортировка_вставками">Cортировку вставками (Insertion sort)</a>, сортирующую за&nbsp;конечное время и&nbsp;эффективному при небольших массивах, а&nbsp;также с&nbsp;частично отсортированными массивами</li>
<li><a href="http://ru.wikipedia.org/wiki/Быстрая_сортировка">Быструю сортировку (Quicksort)</a>, сортирующую быстрее, но&nbsp;требующую O(log n) дополнительной памяти</li>
<li><a href="http://ru.wikipedia.org/wiki/Сортировка_подсчётом">Сортировку подсчетом (Counting sort)</a>, эффективный для большого количества данных с&nbsp;небольшим разбросом значений</li>
</ol>
<p>Далее, в&nbsp;зависимости от&nbsp;типа данных что у&nbsp;нас есть, и&nbsp;их&nbsp;объема, решаем какой алгоритм предпочтительнее использовать.</p>
<p>Вот как паттерн Стратегия, выглядит на&nbsp;UML&nbsp;диаграмме:</p>
<p><a href="http://sheremetov.com/wp-content/uploads/2010/05/strategy.gif"><img class="alignleft size-full wp-image-734" title="strategy" src="http://sheremetov.com/wp-content/uploads/2010/05/strategy.gif" alt="" width="437" height="164" /></a></p>
<p>А&nbsp;вот пример на&nbsp;языке java, из&nbsp;уже классической, игровой тематики:</p>
<pre class="java"><span style="color: #808080; font-style: italic;">// IUnitRender.java</span>
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">strategy</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> IUnitRender <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> render<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// UnitRender2D.java</span>
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">strategy</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> UnitRender2D <span style="color: #000000; font-weight: bold;">implements</span> IUnitRender <span style="color: #66cc66;">&#123;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> render<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">System</span></a>.<span style="color: #006600;">out</span>.<span style="color: #006600;">println</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;2D unit&quot;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// UnitRender3D.java</span>
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">strategy</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> UnitRender3D <span style="color: #000000; font-weight: bold;">implements</span> IUnitRender <span style="color: #66cc66;">&#123;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> render<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">System</span></a>.<span style="color: #006600;">out</span>.<span style="color: #006600;">println</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;3D unit&quot;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// UnitSprite</span>
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">strategy</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> UnitSprite <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> IUnitRender render;
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> UnitSprite<span style="color: #66cc66;">&#40;</span>IUnitRender render<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006600;">render</span> = render;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> render<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		render.<span style="color: #006600;">render</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// TestApp.java</span>
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">strategy</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TestApp <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #993333;">void</span> main<span style="color: #66cc66;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">String</span></a><span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span> args<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		UnitSprite unit;
&nbsp;
		<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>TestApp.<span style="color: #006600;">hasVideoAdapter</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			unit = <span style="color: #000000; font-weight: bold;">new</span> UnitSprite<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> UnitRender3D<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>
			unit = <span style="color: #000000; font-weight: bold;">new</span> UnitSprite<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> UnitRender2D<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		unit.<span style="color: #006600;">render</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ABoolean+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">Boolean</span></a> hasVideoAdapter<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">true</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span></pre>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/oop/oop-pattern-strategy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Инструменты анализа кода на предмет &#171;говнокода&#187;, copy/paste, соответствию стандартам</title>
		<link>http://sheremetov.com/php/pm-tools/</link>
		<comments>http://sheremetov.com/php/pm-tools/#comments</comments>
		<pubDate>Wed, 12 May 2010 05:00:43 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=726</guid>
		<description><![CDATA[Если вы&#160;работаете с&#160;командой php-разработчиков, то&#160;вы&#160;знаете как много кода они пишут, особенно если это высокопроизводительная команда разработчиков. программистам свойственно автоматизировать любой рутинный труд, поэтому и&#160;труд по&#160;контролю над кодом тоже понемногу автоматизируется.
Самым полезным, для меня, оказался инструмент Copy/Paste Detector for PHP code. Как ясно из&#160;названия, этот инструмент используется для дублирующегося кода, ярым поборником которого я&#160;являюсь.
Устанавливается он&#160;очень просто, [...]]]></description>
			<content:encoded><![CDATA[<p>Если вы&nbsp;работаете с&nbsp;командой php-разработчиков, то&nbsp;вы&nbsp;знаете как много кода они пишут, особенно если это высокопроизводительная команда разработчиков. программистам свойственно автоматизировать любой рутинный труд, поэтому и&nbsp;труд по&nbsp;контролю над кодом тоже понемногу автоматизируется.</p>
<p>Самым полезным, для меня, оказался инструмент <a href="http://github.com/sebastianbergmann/phpcpd">Copy/Paste Detector for PHP code</a>. Как ясно из&nbsp;названия, этот инструмент используется для дублирующегося кода, ярым поборником которого я&nbsp;являюсь.</p>
<p>Устанавливается он&nbsp;очень просто, как PEAR пакет:</p>
<pre>sb@ubuntu ~ % pear channel-discover pear.phpunit.de
Adding Channel "pear.phpunit.de" succeeded
Discovery of channel "pear.phpunit.de" succeeded

sb@ubuntu ~ % pear channel-discover components.ez.no
Adding Channel "components.ez.no" succeeded
Discovery of channel "components.ez.no" succeeded

sb@ubuntu ~ % pear install phpunit/phpcpd
downloading phpcpd-1.3.0.tgz ...
Starting to download phpcpd-1.3.0.tgz (7,809 bytes)
.....done: 7,809 bytes
downloading File_Iterator-1.1.0.tgz ...
Starting to download File_Iterator-1.1.0.tgz (3,181 bytes)
...done: 3,181 bytes
downloading ConsoleTools-1.6.tgz ...
Starting to download ConsoleTools-1.6.tgz (869,925 bytes)
.........................................................
.........................................................
.........................................................
..done: 869,925 bytes
downloading Base-1.8.tgz ...
Starting to download Base-1.8.tgz (236,357 bytes)
...done: 236,357 bytes
install ok: channel://components.ez.no/Base-1.8
install ok: channel://components.ez.no/ConsoleTools-1.6
install ok: channel://pear.phpunit.de/File_Iterator-1
install ok: channel://pear.phpunit.de/phpcpd-1.3.0</pre>
<p>Пользоваться, тоже,&nbsp;&mdash; очень просто:</p>
<pre>bash-3.2# phpcpd PEAR/tests/
phpcpd 1.3.1 by Sebastian Bergmann.

Found 5 exact clones with 85 duplicated lines in 5 files:

  - MDB2/tests/MDB2_extended_testcase.php:398-404
    MDB2/tests/MDB2_extended_testcase.php:453-459

  - MDB2/tests/MDB2_manager_testcase.php:61-75
    MDB2/tests/MDB2_reverse_testcase.php:86-100

  - MDB2/tests/MDB2_usage_testcase.php:1289-1321
    MDB2/tests/MDB2_usage_testcase.php:1577-1609

  - MDB2/tests/MDB2_usage_testcase.php:1567-1593
    MDB2/tests/MDB2_usage_testcase.php:1739-1765

  - Structures_Graph/tests/testCase/BasicGraph.php:111-118
    Structures_Graph/tests/testCase/BasicGraph.php:142-149</pre>
<p>Еще один полезный инструмент, это <a href="http://pdepend.org/">PHP Depend</a>. Он&nbsp;позволяет взглянуть на&nbsp;ваш проект, как&nbsp;бы, с&nbsp;&laquo;высоты птичьего полета&raquo;, предоставляя такие метрики как: количество строк кода, классов, пакетов, методов, вызовов и&nbsp;даже эмпирическую метрику &laquo;сложность кода&raquo;. <a href="http://manuel-pichler.de/categories/3-php/P4.html">Здесь</a> можно прочитать расшифровку всех показателей.</p>
<p>Я&nbsp;сравнил два довольно больших проекта, которые веду и&nbsp;метрики отразили в&nbsp;цифрах почти то&nbsp;же что и&nbsp;было &laquo;по&nbsp;ощущению&raquo;,&nbsp;&mdash; более новый проект проще и&nbsp;лучше приблизительно в&nbsp;<nobr>2-3 раза,</nobr> при том что имеет более сложную бизнес логику и&nbsp;функционал:</p>
<p><a href="http://sheremetov.com/wp-content/uploads/2010/05/pyramid.svg_.jpg"><img class="alignleft size-medium wp-image-728" title="pyramid.svg" src="http://sheremetov.com/wp-content/uploads/2010/05/pyramid.svg_-300x61.jpg" alt="" width="300" height="61" /></a></p>
<p>Следующий, хороший инструмент это <a href="http://phpmd.org/">PHP Mess detector</a>. Устанавливается он&nbsp;аналогично, с&nbsp;помощью PEAR installer:</p>
<pre>mapi@arwen ~ $ pear channel-discover pear.phpmd.org
mapi@arwen ~ $ pear channel-discover pear.pdepend.org
mapi@arwen ~ $ pear install --alldeps phpmd/PHP_PMD-alpha</pre>
<p>Эта утилита дает нам массу интересной информации для размышления:</p>
<pre>bash-3.2# phpmd PEAR/Pear.php text codesize

PEAR.php:87	This class has a bunch of public methods and attributes
PEAR.php:87	This class has too many methods, consider refactoring it.
PEAR.php:87	This class PEAR has an overall complexity of 102 which is very high. The configured complexity threshold is 50.
PEAR.php:323	The method setErrorHandling() has a Cyclomatic Complexity of 11.
PEAR.php:511	The method raiseError() has a Cyclomatic Complexity of 20.
PEAR.php:511	The method raiseError() has an NPath complexity of 1600.
PEAR.php:771	The function _PEAR_call_destructors() has a Cyclomatic Complexity of 12.
PEAR.php:831	This class has a bunch of public methods and attributes
PEAR.php:866	The method PEAR_Error() has a Cyclomatic Complexity of 19.
PEAR.php:866	The method PEAR_Error() has an NPath complexity of 11520.

bash-3.2# phpmd PEAR/Pear.php text unusedcode

PEAR.php:450	Avoid unused local variables such as '$key'.
PEAR.php:788	Avoid unused local variables such as '$k'.</pre>
<p>Здесь важно насколько много проблемных мест в&nbsp;вашем коде. Изучая подобные отчеты вы&nbsp;будете всегда видеть какие части приложения должны быть подвергнуты рефакторингу в&nbsp;первую очередь.</p>
<p>Похожий по&nbsp;своему применению инструмент <a href="http://matrix.squiz.net/developer/tools/php_cs">PHP_CodeSniffer</a>, позволяет оценить насколько ваш код соответствует стандартам кодирования.</p>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/php/pm-tools/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>ООП для чайников. Паттерны проектирования. Паттерн абстрактная фабрика (Abstract factory)</title>
		<link>http://sheremetov.com/oop/oop-pattern-factory/</link>
		<comments>http://sheremetov.com/oop/oop-pattern-factory/#comments</comments>
		<pubDate>Sat, 08 May 2010 21:21:28 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[oop]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=683</guid>
		<description><![CDATA[Сегодня мы рассмотрим паттерн абстрактная фабрика, или фабрика, как его часто называют. Этот паттерн относится к группе порождающих и решает проблему создания группы объектов. Классический пример использования фабрики для предоставления приложению элементов интерфейса в зависимости от платформы. Например, приложение на linux будет создавать при помощи фабрики кнопки, поля и прочие элементы через фабрику, которая в [...]]]></description>
			<content:encoded><![CDATA[<p>Сегодня мы рассмотрим паттерн абстрактная фабрика, или фабрика, как его часто называют. Этот паттерн относится к группе порождающих и решает проблему создания группы объектов. Классический пример использования фабрики для предоставления приложению элементов интерфейса в зависимости от платформы. Например, приложение на linux будет создавать при помощи фабрики кнопки, поля и прочие элементы через фабрику, которая в свою очередь, по запросу будет возвращать элементы XWindows, а приложение на windows будет возвращать элементы win32. Таким образом программе становится не важна платформа, платформо-зависимая логика ляжет на плечи фабрики.</p>
<p>Паттерн абстрактная фабрика должен использоваться тогда когда:</p>
<ul>
<li>Конкретный вариант требуемого поведения системы дают не отдельные объекты, а четко выраженное семейство связанных объектов</li>
<li>Объекты одного семейства должны использоваться вместе</li>
<li>Система должна кофигурироваться одним из семейств объектов</li>
</ul>
<p>Вот как это выглядит на диаграмме:</p>
<p><a href="http://sheremetov.com/wp-content/uploads/2010/05/abstract.gif"><img class="alignleft size-full wp-image-686" title="abstract" src="http://sheremetov.com/wp-content/uploads/2010/05/abstract.gif" alt="" width="437" height="471" /></a></p>
<p>В моем примере фабрики мы имеем три вида игровых юнитов Protos, Terran, Zerg (должно быть близко любому кто играл в StarCraft), и некоторое количество игровых юнитов (ботов). Боты создают солдатов нужного типа в зависимости от количества ресурсов добытых работягами, а также боты могут сражаться друг с другом теми юнитами, что были созданы.<br />
Вот код примера, несколько многословный, в силу специфичности синтаксиса явы:</p>
<pre class="java"><span style="color: #808080; font-style: italic;">// IUnit.java</span>
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">factory</span>.<span style="color: #006600;">unit</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> IUnit <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getGroundWeapon<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getAirWeapon<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getShield<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getPrice<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #000000; font-weight: bold;">public</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">String</span></a> toString<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// CustomUnit.java</span>
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">factory</span>.<span style="color: #006600;">unit</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> CustomUnit <span style="color: #000000; font-weight: bold;">implements</span> IUnit <span style="color: #66cc66;">&#123;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getAirWeapon<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">0</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getGroundWeapon<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">0</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getPrice<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">0</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getShield<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">0</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">String</span></a> toString<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #ff0000;">&quot;a:&quot;</span> + getAirWeapon<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> + <span style="color: #ff0000;">&quot; g:&quot;</span> + getGroundWeapon<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> + <span style="color: #ff0000;">&quot; s:&quot;</span> + getShield<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> + <span style="color: #ff0000;">&quot; p:&quot;</span> + getPrice<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// ProtosSoldier.java</span>
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">factory</span>.<span style="color: #006600;">unit</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ProtosSoldier <span style="color: #000000; font-weight: bold;">extends</span> CustomUnit <span style="color: #000000; font-weight: bold;">implements</span> IUnit <span style="color: #66cc66;">&#123;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getAirWeapon<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">10</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getGroundWeapon<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">12</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getPrice<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">100</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getShield<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">10</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// Terransoldier.java</span>
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">factory</span>.<span style="color: #006600;">unit</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TerranSoldier <span style="color: #000000; font-weight: bold;">extends</span> CustomUnit <span style="color: #000000; font-weight: bold;">implements</span> IUnit <span style="color: #66cc66;">&#123;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getPrice<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">35</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getAirWeapon<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">5</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getGroundWeapon<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">8</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getShield<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">3</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// ZergSoldier.java</span>
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">factory</span>.<span style="color: #006600;">unit</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ZergSoldier <span style="color: #000000; font-weight: bold;">extends</span> CustomUnit <span style="color: #000000; font-weight: bold;">implements</span> IUnit <span style="color: #66cc66;">&#123;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getAirWeapon<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">0</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getGroundWeapon<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">6</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getPrice<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">25</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getShield<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">5</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// IArmyFactory.java</span>
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">factory</span>.<span style="color: #006600;">army</span>;
&nbsp;
<span style="color: #a1a100;">import patterns.factory.unit.IUnit;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> IArmyFactory <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> IUnit createSoldier<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// ProtosArmy.java</span>
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">factory</span>.<span style="color: #006600;">army</span>;
&nbsp;
<span style="color: #a1a100;">import patterns.factory.unit.IUnit;</span>
<span style="color: #a1a100;">import patterns.factory.unit.ProtosSoldier;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ProtosArmy <span style="color: #000000; font-weight: bold;">implements</span> IArmyFactory <span style="color: #66cc66;">&#123;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> IUnit createSoldier<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> ProtosSoldier<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// TerranArmy.java</span>
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">factory</span>.<span style="color: #006600;">army</span>;
&nbsp;
<span style="color: #a1a100;">import patterns.factory.unit.IUnit;</span>
<span style="color: #a1a100;">import patterns.factory.unit.TerranSoldier;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TerranArmy <span style="color: #000000; font-weight: bold;">implements</span> IArmyFactory <span style="color: #66cc66;">&#123;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> IUnit createSoldier<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> TerranSoldier<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// ZergArmy.java</span>
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">factory</span>.<span style="color: #006600;">army</span>;
&nbsp;
<span style="color: #a1a100;">import patterns.factory.unit.IUnit;</span>
<span style="color: #a1a100;">import patterns.factory.unit.ZergSoldier;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ZergArmy <span style="color: #000000; font-weight: bold;">implements</span> IArmyFactory <span style="color: #66cc66;">&#123;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> IUnit createSoldier<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> ZergSoldier<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// BotClient.java</span>
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">factory</span>.<span style="color: #006600;">client</span>;
&nbsp;
<span style="color: #a1a100;">import java.util.ArrayList;</span>
<span style="color: #a1a100;">import java.util.Iterator;</span>
&nbsp;
<span style="color: #a1a100;">import patterns.factory.army.IArmyFactory;</span>
<span style="color: #a1a100;">import patterns.factory.unit.IUnit;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> BotClient <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AArrayList+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">ArrayList</span></a> &lt;IUnit&gt; units;
	<span style="color: #000000; font-weight: bold;">private</span> IArmyFactory factory;
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> BotClient<span style="color: #66cc66;">&#40;</span>IArmyFactory army<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		factory = army;
		units = <span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AArrayList+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">ArrayList</span></a> &lt;IUnit&gt; <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> createForMoney<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> money<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ABoolean+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">Boolean</span></a> hasMoney = <span style="color: #000000; font-weight: bold;">false</span>;
		units.<span style="color: #006600;">clear</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #b1b100;">do</span> <span style="color: #66cc66;">&#123;</span>
			IUnit unit = factory.<span style="color: #006600;">createSoldier</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
			hasMoney = money - unit.<span style="color: #006600;">getPrice</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> &gt; <span style="color: #cc66cc;">0</span>;
			<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>hasMoney<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
				units.<span style="color: #006600;">add</span><span style="color: #66cc66;">&#40;</span>unit<span style="color: #66cc66;">&#41;</span>;
				money -= unit.<span style="color: #006600;">getPrice</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
			<span style="color: #66cc66;">&#125;</span>
		<span style="color: #66cc66;">&#125;</span> <span style="color: #b1b100;">while</span><span style="color: #66cc66;">&#40;</span>hasMoney<span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getGroundWeapon<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #993333;">int</span> total = <span style="color: #cc66cc;">0</span>;
		<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AIterator+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">Iterator</span></a>  iter = units.<span style="color: #006600;">iterator</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	    <span style="color: #b1b100;">while</span> <span style="color: #66cc66;">&#40;</span>iter.<span style="color: #006600;">hasNext</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
	    	total += <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>IUnit<span style="color: #66cc66;">&#41;</span>iter.<span style="color: #006600;">next</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">getGroundWeapon</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	    <span style="color: #66cc66;">&#125;</span>
	    <span style="color: #000000; font-weight: bold;">return</span> total;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getShield<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #993333;">int</span> total = <span style="color: #cc66cc;">0</span>;
		<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AIterator+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">Iterator</span></a>  iter = units.<span style="color: #006600;">iterator</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	    <span style="color: #b1b100;">while</span> <span style="color: #66cc66;">&#40;</span>iter.<span style="color: #006600;">hasNext</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
	    	total += <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>IUnit<span style="color: #66cc66;">&#41;</span>iter.<span style="color: #006600;">next</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">getShield</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	    <span style="color: #66cc66;">&#125;</span>
	    <span style="color: #000000; font-weight: bold;">return</span> total;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> unitsCount<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> units.<span style="color: #006600;">size</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ABoolean+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">Boolean</span></a> battle<span style="color: #66cc66;">&#40;</span>BotClient client<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">System</span></a>.<span style="color: #006600;">out</span>.<span style="color: #006600;">println</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Units: &quot;</span> + unitsCount<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> + <span style="color: #ff0000;">&quot; vs &quot;</span> + client.<span style="color: #006600;">unitsCount</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
		<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">System</span></a>.<span style="color: #006600;">out</span>.<span style="color: #006600;">println</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Attack: &quot;</span> + getGroundWeapon<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> + <span style="color: #ff0000;">&quot; vs &quot;</span> + client.<span style="color: #006600;">getGroundWeapon</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
		<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">System</span></a>.<span style="color: #006600;">out</span>.<span style="color: #006600;">println</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Shield: &quot;</span> + getShield<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> + <span style="color: #ff0000;">&quot; vs &quot;</span> + client.<span style="color: #006600;">getShield</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #993333;">float</span> damage = <span style="color: #66cc66;">&#40;</span><span style="color: #993333;">float</span><span style="color: #66cc66;">&#41;</span>client.<span style="color: #006600;">getGroundWeapon</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> / <span style="color: #66cc66;">&#40;</span><span style="color: #993333;">float</span><span style="color: #66cc66;">&#41;</span>getShield<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">System</span></a>.<span style="color: #006600;">out</span>.<span style="color: #006600;">println</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Damage: &quot;</span> + damage<span style="color: #66cc66;">&#41;</span>;
		<span style="color: #993333;">float</span> enemyDamage = <span style="color: #66cc66;">&#40;</span><span style="color: #993333;">float</span><span style="color: #66cc66;">&#41;</span>getGroundWeapon<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> / <span style="color: #66cc66;">&#40;</span><span style="color: #993333;">float</span><span style="color: #66cc66;">&#41;</span>client.<span style="color: #006600;">getShield</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">System</span></a>.<span style="color: #006600;">out</span>.<span style="color: #006600;">println</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Enemy damage: &quot;</span> + enemyDamage<span style="color: #66cc66;">&#41;</span>;
		<span style="color: #000000; font-weight: bold;">return</span> enemyDamage &lt; damage;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// TestApp.java</span>
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">factory</span>;
&nbsp;
<span style="color: #a1a100;">import patterns.factory.army.ProtosArmy;</span>
<span style="color: #a1a100;">import patterns.factory.army.TerranArmy;</span>
<span style="color: #a1a100;">import patterns.factory.army.ZergArmy;</span>
<span style="color: #a1a100;">import patterns.factory.client.BotClient;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TestApp <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #993333;">void</span> main<span style="color: #66cc66;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">String</span></a><span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span> args<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		BotClient bot1 = <span style="color: #000000; font-weight: bold;">new</span> BotClient<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> ProtosArmy<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
		BotClient bot2 = <span style="color: #000000; font-weight: bold;">new</span> BotClient<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> TerranArmy<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
		BotClient bot3 = <span style="color: #000000; font-weight: bold;">new</span> BotClient<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> ZergArmy<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
		bot1.<span style="color: #006600;">createForMoney</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">400</span><span style="color: #66cc66;">&#41;</span>;
		bot2.<span style="color: #006600;">createForMoney</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">400</span><span style="color: #66cc66;">&#41;</span>;
		bot3.<span style="color: #006600;">createForMoney</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">400</span><span style="color: #66cc66;">&#41;</span>;
		<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">System</span></a>.<span style="color: #006600;">out</span>.<span style="color: #006600;">println</span><span style="color: #66cc66;">&#40;</span>bot1.<span style="color: #006600;">battle</span><span style="color: #66cc66;">&#40;</span>bot2<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
		<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">System</span></a>.<span style="color: #006600;">out</span>.<span style="color: #006600;">println</span><span style="color: #66cc66;">&#40;</span>bot1.<span style="color: #006600;">battle</span><span style="color: #66cc66;">&#40;</span>bot3<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span></pre>
<p>Результат работы примера:</p>
<pre>Units: 3 vs 11
Attack: 36 vs 88
Shield: 30 vs 33
Damage: 2.9333334
Enemy damage: 1.0909091
false
Units: 3 vs 15
Attack: 36 vs 90
Shield: 30 vs 75
Damage: 3.0
Enemy damage: 0.48
false</pre>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/oop/oop-pattern-factory/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>ООП для чайников. Паттерны проектирования. Приспособленец (flyweight)</title>
		<link>http://sheremetov.com/oop/%d0%be%d0%be%d0%bf-%d0%b4%d0%bb%d1%8f-%d1%87%d0%b0%d0%b9%d0%bd%d0%b8%d0%ba%d0%be%d0%b2-%d0%bf%d0%b0%d1%82%d1%82%d0%b5%d1%80%d0%bd%d1%8b-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b8%d1%80%d0%be%d0%b2-2/</link>
		<comments>http://sheremetov.com/oop/%d0%be%d0%be%d0%bf-%d0%b4%d0%bb%d1%8f-%d1%87%d0%b0%d0%b9%d0%bd%d0%b8%d0%ba%d0%be%d0%b2-%d0%bf%d0%b0%d1%82%d1%82%d0%b5%d1%80%d0%bd%d1%8b-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b8%d1%80%d0%be%d0%b2-2/#comments</comments>
		<pubDate>Mon, 05 Apr 2010 05:53:03 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[oop]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[паттерн]]></category>
		<category><![CDATA[приспособленец]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=612</guid>
		<description><![CDATA[Следующий паттерн,&#160;&#8212; Приспособленец. Приспособленцы моделируют сущности, число которых слишком велико для представления объектами. В&#160;моем примере это отрисовка игровой карты (или участка карты). Например ваша карта состоит из&#160;плиток пола и&#160;стен, но&#160;по&#160;разному отрисовываются, с&#160;учетом света, времени суток, и&#160;других факторов. Создавать для каждого сегмента карты отдельный экземпляр,&#160;&#8212; слишком большая роскошь. Поэтому мы&#160;создаем по&#160;одному экземпляру каждого типа и&#160;с&#160;их&#160;помощью отрисовываем [...]]]></description>
			<content:encoded><![CDATA[<p>Следующий паттерн,&nbsp;&mdash; Приспособленец. Приспособленцы моделируют сущности, число которых слишком велико для представления объектами. В&nbsp;моем примере это отрисовка игровой карты (или участка карты). Например ваша карта состоит из&nbsp;плиток пола и&nbsp;стен, но&nbsp;по&nbsp;разному отрисовываются, с&nbsp;учетом света, времени суток, и&nbsp;других факторов. Создавать для каждого сегмента карты отдельный экземпляр,&nbsp;&mdash; слишком большая роскошь. Поэтому мы&nbsp;создаем по&nbsp;одному экземпляру каждого типа и&nbsp;с&nbsp;их&nbsp;помощью отрисовываем всю карту.</p>
<p>На&nbsp;диаграмме Приспособленец, выглядит следующим образом:</p>
<p><a href="http://sheremetov.com/wp-content/uploads/2010/03/flyweight.gif"><img src="http://sheremetov.com/wp-content/uploads/2010/03/flyweight.gif" alt="flyweight" title="flyweight" width="467" height="289" class="alignnone size-full wp-image-613" /></a></p>
<p>Имеет использовать Приспособленца если одновременно выполняются следующие условия: </p>
<ul>
<li>в приложении используется большое число обьектов, из-за этого высоки расходы на&nbsp;хранение </li>
<li>большую часть состояния обьектов можно вынести из&nbsp;объекта Приспособленца</li>
</ul>
<p>Код примера:</p>
<pre class="python">&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Wall:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> draw<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">&quot;#&quot;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Floor:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> draw<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">&quot;.&quot;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> MapFactory:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">classes</span> = <span style="color: black;">&#40;</span>Floor<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, Wall<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> getMapClassByNum<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, num<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">classes</span><span style="color: black;">&#91;</span>num<span style="color: black;">&#93;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">'__main__'</span>:
    <span style="color: #008000;">map</span> = <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
111101111111
100000000001
100011110011
101000010001
111111111101&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
&nbsp;
    factory = MapFactory<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">for</span> line <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">map</span>.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>:<span style="color: black;">&#93;</span>:
        <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> line:
            <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span>factory.<span style="color: black;">getMapClassByNum</span><span style="color: black;">&#40;</span><span style="color: #008000;">int</span><span style="color: black;">&#40;</span>i<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>.<span style="color: black;">draw</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>,
        <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
--------------------------------
&nbsp;
<span style="color: #808080; font-style: italic;"># # # # . # # # # # # #</span>
<span style="color: #808080; font-style: italic;"># . . . . . . . . . . #</span>
<span style="color: #808080; font-style: italic;"># . . . # # # # . . # #</span>
<span style="color: #808080; font-style: italic;"># . # . . . . # . . . #</span>
<span style="color: #808080; font-style: italic;"># # # # # # # # # # . #</span>
&nbsp;</pre>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/oop/%d0%be%d0%be%d0%bf-%d0%b4%d0%bb%d1%8f-%d1%87%d0%b0%d0%b9%d0%bd%d0%b8%d0%ba%d0%be%d0%b2-%d0%bf%d0%b0%d1%82%d1%82%d0%b5%d1%80%d0%bd%d1%8b-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b8%d1%80%d0%be%d0%b2-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ООП для чайников. Паттерны проектирования. Декоратор (decorator)</title>
		<link>http://sheremetov.com/oop/oop-pattern-decorato/</link>
		<comments>http://sheremetov.com/oop/oop-pattern-decorato/#comments</comments>
		<pubDate>Tue, 30 Mar 2010 05:48:26 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[oop]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[декоратор]]></category>
		<category><![CDATA[паттерн]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=603</guid>
		<description><![CDATA[Еще один паттерн из&#160;группы структурирующих,&#160;&#8212; декоратор. Его назначение в&#160;том чтобы возложить дополнительные обязанности (прозрачные для клиентов) на&#160;отдельный объект, а&#160;не&#160;на&#160;класс в&#160;целом. Функциональность обязанностей реализуется в&#160;небольших объектах. Преимущество состоит в&#160;возможности динамически добавлять эту функциональность до&#160;или после основной функциональности объекта ConcreteComponent. Декоратор позволяет разгрузить приложение от&#160;классов с&#160;похожей функциональностью. 
Классический пример Декоратора,&#160;&#8212; это какой-нибудь класс, рисующий прямоугольник, с&#160;добавлением декораторов, [...]]]></description>
			<content:encoded><![CDATA[<p>Еще один паттерн из&nbsp;группы структурирующих,&nbsp;&mdash; декоратор. Его назначение в&nbsp;том чтобы возложить дополнительные обязанности (прозрачные для клиентов) на&nbsp;отдельный объект, а&nbsp;не&nbsp;на&nbsp;класс в&nbsp;целом. Функциональность обязанностей реализуется в&nbsp;небольших объектах. Преимущество состоит в&nbsp;возможности динамически добавлять эту функциональность до&nbsp;или после основной функциональности объекта ConcreteComponent. Декоратор позволяет разгрузить приложение от&nbsp;классов с&nbsp;похожей функциональностью. </p>
<p>Классический пример Декоратора,&nbsp;&mdash; это какой-нибудь класс, рисующий прямоугольник, с&nbsp;добавлением декораторов, которые рисуют рамки, заливают цветом или изображением. Причем, применение декоратора, рисующего рамку дважды, нарисует двойную рамку.</p>
<p>На&nbsp;диаграмме Декоратор выглядит так:</p>
<p><a href="http://sheremetov.com/wp-content/uploads/2010/03/decorator.gif"><img src="http://sheremetov.com/wp-content/uploads/2010/03/decorator.gif" alt="decorator" title="decorator" width="431" height="356" class="alignnone size-full wp-image-604" /></a></p>
<p>Пример реализации паттерна Декоратор:</p>
<pre class="python">&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> BaseModel<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">features</span> = <span style="color: black;">&#123;</span><span style="color: #483d8b;">&quot;speakers&quot;</span>:<span style="color: #ff4500;">4</span>, <span style="color: #483d8b;">&quot;airbag&quot;</span>: <span style="color: #ff4500;">1</span>, <span style="color: #483d8b;">&quot;engine&quot;</span>: <span style="color: #483d8b;">&quot;1.2L&quot;</span><span style="color: black;">&#125;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> getPrice<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #ff4500;">12000</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> AmbientModel<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, model<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">price</span> = model.<span style="color: black;">getPrice</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> + <span style="color: #ff4500;">2200</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">features</span> = model.<span style="color: black;">features</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">features</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;airbag&quot;</span><span style="color: black;">&#93;</span> = <span style="color: #ff4500;">2</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">features</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;speakers&quot;</span><span style="color: black;">&#93;</span> = <span style="color: #ff4500;">6</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">features</span>.<span style="color: black;">setdefault</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;ligh&quot;</span>, <span style="color: #483d8b;">&quot;halogen&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> getPrice<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">price</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> SportModel<span style="color: black;">&#40;</span>BaseModel<span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, model<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">price</span> = model.<span style="color: black;">getPrice</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> + <span style="color: #ff4500;">3800</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">features</span> = model.<span style="color: black;">features</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">features</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;airbag&quot;</span><span style="color: black;">&#93;</span> = <span style="color: #ff4500;">4</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">features</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;engine&quot;</span><span style="color: black;">&#93;</span> = <span style="color: #483d8b;">&quot;1.6L&quot;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> getPrice<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">price</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Auto:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, model<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">model</span> = model
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> specification<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">model</span>.<span style="color: black;">features</span>.<span style="color: black;">keys</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
            <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;%-10s: %s&quot;</span> % <span style="color: black;">&#40;</span>i, <span style="color: #008000;">self</span>.<span style="color: black;">model</span>.<span style="color: black;">features</span><span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;price     : %d&quot;</span><span style="color: black;">&#41;</span> % <span style="color: #008000;">self</span>.<span style="color: black;">model</span>.<span style="color: black;">getPrice</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">'__main__'</span>:
    model = BaseModel<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    model = AmbientModel<span style="color: black;">&#40;</span>model<span style="color: black;">&#41;</span>
    model = SportModel<span style="color: black;">&#40;</span>model<span style="color: black;">&#41;</span>
    auto = Auto<span style="color: black;">&#40;</span>model<span style="color: black;">&#41;</span>
    auto.<span style="color: black;">specification</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
-------------------
&nbsp;
airbag    : <span style="color: #ff4500;">4</span>
engine    : <span style="color: #ff4500;">1</span>.6L
speakers  : <span style="color: #ff4500;">6</span>
ligh      : halogen
price     : <span style="color: #ff4500;">18000</span>
&nbsp;</pre>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/oop/oop-pattern-decorato/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ООП для чайников. Паттерны проектирования. Компоновщик (composite)</title>
		<link>http://sheremetov.com/oop/%d0%be%d0%be%d0%bf-%d0%b4%d0%bb%d1%8f-%d1%87%d0%b0%d0%b9%d0%bd%d0%b8%d0%ba%d0%be%d0%b2-%d0%bf%d0%b0%d1%82%d1%82%d0%b5%d1%80%d0%bd%d1%8b-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b8%d1%80%d0%be%d0%b2/</link>
		<comments>http://sheremetov.com/oop/%d0%be%d0%be%d0%bf-%d0%b4%d0%bb%d1%8f-%d1%87%d0%b0%d0%b9%d0%bd%d0%b8%d0%ba%d0%be%d0%b2-%d0%bf%d0%b0%d1%82%d1%82%d0%b5%d1%80%d0%bd%d1%8b-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b8%d1%80%d0%be%d0%b2/#comments</comments>
		<pubDate>Sun, 28 Mar 2010 05:18:23 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[oop]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[компоновщик]]></category>
		<category><![CDATA[паттерн]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=593</guid>
		<description><![CDATA[Следующий паттерн, - компоновщик (composite), тоже из группы структурирующих.
Компоновщик организует объекты в древовидные структуры для представления иерархии часть-целое. Всевозможные иерархии деревьев страниц в каталогах, файлов в папках являются яркими представителями паттерна Компоновщик. 
Диаграмма для Компоновщика, выглядит так:

Реализовывая Компоновщик, нужно помнить о том чтобы интерфейс Component был максимально дополнен используемыми публичными методами, избавляя клиента от приведения [...]]]></description>
			<content:encoded><![CDATA[<p>Следующий паттерн, - компоновщик (composite), тоже из группы структурирующих.</p>
<p>Компоновщик организует объекты в древовидные структуры для представления иерархии часть-целое. Всевозможные иерархии деревьев страниц в каталогах, файлов в папках являются яркими представителями паттерна Компоновщик. </p>
<p>Диаграмма для Компоновщика, выглядит так:</p>
<p><a href="http://sheremetov.com/wp-content/uploads/2010/03/composite.gif"><img src="http://sheremetov.com/wp-content/uploads/2010/03/composite.gif" alt="composite" title="composite" width="449" height="325" class="alignnone size-full wp-image-596" /></a></p>
<p>Реализовывая Компоновщик, нужно помнить о том чтобы интерфейс Component был максимально дополнен используемыми публичными методами, избавляя клиента от приведения к типу или проверки существования метода (в случае скриптовых языков). Также? стоит сразу позаботиться о максимально удобном функционале для управления элементами (помимо стандартных Add, Remove, GetChildIn).</p>
<p>Пример реализации на Python:</p>
<pre class="python">&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> TreeItem:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, name<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">items</span> = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">name</span> = name
        <span style="color: #008000;">self</span>.<span style="color: black;">current</span> = <span style="color: #ff4500;">0</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__iter__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> add<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, item<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">items</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span>item<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> item
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> remove<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, name<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">items</span> = <span style="color: black;">&#91;</span>i <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">items</span> <span style="color: #ff7700;font-weight:bold;">if</span> i.<span style="color: black;">name</span> != name<span style="color: black;">&#93;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__len__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">items</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, i<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">items</span><span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> next<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">current</span> += <span style="color: #ff4500;">1</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">items</span><span style="color: black;">&#41;</span> &gt;= <span style="color: #008000;">self</span>.<span style="color: black;">current</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">items</span><span style="color: black;">&#91;</span><span style="color: #008000;">self</span>.<span style="color: black;">current</span><span style="color: #ff4500;">-1</span><span style="color: black;">&#93;</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">StopIteration</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">'__main__'</span>:
    root = TreeItem<span style="color: black;">&#40;</span><span style="color: #483d8b;">'/'</span><span style="color: black;">&#41;</span>
    root.<span style="color: black;">add</span><span style="color: black;">&#40;</span>TreeItem<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;folder1&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">print</span> root.<span style="color: black;">get</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>.<span style="color: black;">name</span>
    root.<span style="color: black;">remove</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;folder1&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
    root.<span style="color: black;">add</span><span style="color: black;">&#40;</span>TreeItem<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;folder2&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>.<span style="color: black;">add</span><span style="color: black;">&#40;</span>TreeItem<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;folder21&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    root.<span style="color: black;">add</span><span style="color: black;">&#40;</span>TreeItem<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;folder3&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>.<span style="color: black;">add</span><span style="color: black;">&#40;</span>TreeItem<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;folder31&quot;</span><span style="color: black;">&#41;</span>.<span style="color: black;">add</span><span style="color: black;">&#40;</span>TreeItem<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;folder311&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> walk<span style="color: black;">&#40;</span>item, level<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span>level<span style="color: black;">&#41;</span>:
            <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot; &quot;</span><span style="color: black;">&#41;</span>,
        <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span>item.<span style="color: black;">name</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> item:
            walk<span style="color: black;">&#40;</span>i, level + <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
&nbsp;
    walk<span style="color: black;">&#40;</span>root, <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
&nbsp;
-----------------------------
folder1
/
  folder2
    folder21
  folder3
    folder311
&nbsp;</pre>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/oop/%d0%be%d0%be%d0%bf-%d0%b4%d0%bb%d1%8f-%d1%87%d0%b0%d0%b9%d0%bd%d0%b8%d0%ba%d0%be%d0%b2-%d0%bf%d0%b0%d1%82%d1%82%d0%b5%d1%80%d0%bd%d1%8b-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b8%d1%80%d0%be%d0%b2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ООП для чайников. Паттерны проектирования. Мост (bridge)</title>
		<link>http://sheremetov.com/oop/%d0%be%d0%be%d0%bf-pattern-bridge/</link>
		<comments>http://sheremetov.com/oop/%d0%be%d0%be%d0%bf-pattern-bridge/#comments</comments>
		<pubDate>Thu, 25 Mar 2010 05:48:31 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[oop]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[мост]]></category>
		<category><![CDATA[паттерн]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=583</guid>
		<description><![CDATA[Следующий патерн, также относится к&#160;типу структурных, и&#160;называется&#160;&#8212; мост.
Смысл этого паттерна в&#160;том чтобы отделить абстракцию от&#160;реализации. В&#160;каком-то смысле он&#160;очень похож на&#160;адаптер, с&#160;той разницей что адаптер, &#171;адаптирует&#187; интерфейсы классов друг к&#160;другу, а&#160;мост, разделяет&#160;их, для того что&#160;бы сделать возможным изменение интерфейсов независимо от&#160;реализации.
Вот как выглядит он&#160;выглядит на&#160;диаграмме:

Этот патерн следует применять, например, когда нужно отвязать интерфейс от&#160;реализации во&#160;время выполнения. [...]]]></description>
			<content:encoded><![CDATA[<p>Следующий патерн, также относится к&nbsp;типу структурных, и&nbsp;называется&nbsp;&mdash; мост.<br />
Смысл этого паттерна в&nbsp;том чтобы отделить абстракцию от&nbsp;реализации. В&nbsp;каком-то смысле он&nbsp;очень похож на&nbsp;адаптер, с&nbsp;той разницей что адаптер, &laquo;адаптирует&raquo; интерфейсы классов друг к&nbsp;другу, а&nbsp;мост, разделяет&nbsp;их, для того что&nbsp;бы сделать возможным изменение интерфейсов независимо от&nbsp;реализации.</p>
<p>Вот как выглядит он&nbsp;выглядит на&nbsp;диаграмме:</p>
<p><a href="http://sheremetov.com/wp-content/uploads/2010/03/bridge.gif"><img src="http://sheremetov.com/wp-content/uploads/2010/03/bridge.gif" alt="bridge" title="bridge" width="448" height="293" class="alignnone size-full wp-image-586" /></a></p>
<p>Этот патерн следует применять, например, когда нужно отвязать интерфейс от&nbsp;реализации во&nbsp;время выполнения. Мост повышает расширяемость, позволяя независимо расширять абстракции и&nbsp;реализации.</p>
<p>Пример реализации паттарна Мост на Python:</p>
<pre class="python">&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> SortAbstraction:    
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> sortImpl<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, sortImpl<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>._sortImpl = sortImpl
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> sort<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, data<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>._sortImpl.<span style="color: black;">sort</span><span style="color: black;">&#40;</span>data<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> data 
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> SortImpl:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> sort<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, data<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">pass</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> FastSortimpl<span style="color: black;">&#40;</span>SortImpl<span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> sort<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, data<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> data.<span style="color: black;">sort</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> SlowSortImpl<span style="color: black;">&#40;</span>SortImpl<span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> sort<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, data<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> data.<span style="color: black;">sort</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># медленная сортировка</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> FastSortImpl<span style="color: black;">&#40;</span>SortImpl<span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> sort<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, data<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> data.<span style="color: black;">sort</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># якобы быстрая сортировка</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">'__main__'</span>:
    abstraction = SortAbstraction<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    abstraction.<span style="color: black;">sortImpl</span><span style="color: black;">&#40;</span>SlowSortImpl<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span>abstraction.<span style="color: black;">sort</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span>,<span style="color: #ff4500;">1</span>,<span style="color: #ff4500;">3</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
    abstraction.<span style="color: black;">sortImpl</span><span style="color: black;">&#40;</span>FastSortImpl<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span>abstraction.<span style="color: black;">sort</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span>,<span style="color: #ff4500;">1</span>,<span style="color: #ff4500;">3</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
-------------------------
<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">3</span><span style="color: black;">&#93;</span>
<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">3</span><span style="color: black;">&#93;</span>
&nbsp;</pre>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/oop/%d0%be%d0%be%d0%bf-pattern-bridge/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ООП для чайников. Паттерны проектирования. Адаптер (adapter)</title>
		<link>http://sheremetov.com/oop/oop-pattern-adapter/</link>
		<comments>http://sheremetov.com/oop/oop-pattern-adapter/#comments</comments>
		<pubDate>Tue, 23 Mar 2010 05:32:36 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[oop]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[адаптер]]></category>
		<category><![CDATA[паттерн]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=575</guid>
		<description><![CDATA[С&#160;недавнего времени, мы&#160;в&#160;команде завели такую практику как обмен опытом. Сначала мы&#160;пробовали просто готовить доклады, на&#160;всякого рода интересные темы касающиеся технологий, практик и&#160;подходов. Но, этот подход не&#160;совсем себя оправдал, и&#160;мы&#160;стали готовить небольшие доклады на&#160;заранее оговоренные темы, например,&#160;&#8212; паттерны проектирования.
Идея состоит в&#160;том что мы&#160;выбираем несколько паттернов, делаем лаконичный пример использования, на&#160;каком-то языке не&#160;связанной с&#160;основной работой (php). Затем [...]]]></description>
			<content:encoded><![CDATA[<p>С&nbsp;недавнего времени, мы&nbsp;в&nbsp;команде завели такую практику как обмен опытом. Сначала мы&nbsp;пробовали просто готовить доклады, на&nbsp;всякого рода интересные темы касающиеся технологий, практик и&nbsp;подходов. Но, этот подход не&nbsp;совсем себя оправдал, и&nbsp;мы&nbsp;стали готовить небольшие доклады на&nbsp;заранее оговоренные темы, например,&nbsp;&mdash; паттерны проектирования.</p>
<p>Идея состоит в&nbsp;том что мы&nbsp;выбираем несколько паттернов, делаем лаконичный пример использования, на&nbsp;каком-то языке не&nbsp;связанной с&nbsp;основной работой (php). Затем мы&nbsp;собираемся, показываем свои примеры, и&nbsp;обсуждаем конкретный паттерн и&nbsp;реализацию. Так у&nbsp;нас накопилось некоторое количество реализаций на&nbsp;Python, Ruby, Groovy. На&nbsp;самом деле, как мы&nbsp;потом убедились, выбор скриптового языка для иллюстрации паттерна, идея не&nbsp;очень хорошая,&nbsp;&mdash; нельзя выделить интерфейс, абстрактный класс, вследствие отсутствия строгой типизации смысл некоторых паттернов теряется, некоторые патерны трудно отличить один от&nbsp;другого. Наверное в&nbsp;дальнейшем мы&nbsp;ограничимся языками со&nbsp;строгой типизацией для паттернов, а&nbsp;скриптовые будем использовать для иллюстрации алгоритмов. Время покажет.</p>
<p>После столь долгого вступления, расскажу о&nbsp;первом паттерне Адаптер и&nbsp;примере его реализации на&nbsp;питоне. Этот паттерн относится к&nbsp;структурным паттернам (structural). Вот как он&nbsp;выглядит на&nbsp;диаграмме классов:</p>
<p><a href="http://sheremetov.com/wp-content/uploads/2010/03/adapter.gif"><img src="http://sheremetov.com/wp-content/uploads/2010/03/adapter.gif" alt="adapter" title="adapter" width="428" height="249" class="alignnone size-full wp-image-577" /></a></p>
<p>Этот паттерн используется в&nbsp;случае когда надо преобразовать интерфейс одного класса, в&nbsp;интерфейс другого, ожидаемого клиентом. Другими словами,&nbsp;&mdash; делает возможным работу классов с&nbsp;несовместимыми интерфейсами. В&nbsp;моем примере это какая-то, уже написанная и&nbsp;реализованная клиентская библиотека, использующая медленную библиотеку для взаимодействия с&nbsp;базой. новая библиотека отличается способом инициализации и&nbsp;вызова запросов. Используя адаптер, мы&nbsp;позволяем клиентской программе использовать новый движок баз данных, прозрачно для клиента, оставляя возможность использовать старый движок (если надо).</p>
<p>Код примера реализации паттерна:</p>
<pre class="python">&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> SlowDbEngine:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, host, <span style="color: #dc143c;">user</span>, password, db<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">pass</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> runQuery<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, sql<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;row1&quot;</span>, <span style="color: #483d8b;">&quot;row2&quot;</span>, <span style="color: #483d8b;">&quot;row3&quot;</span><span style="color: black;">&#93;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> FastDbEngine:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, connection<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">pass</span>        
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> query<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, sql<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">-1</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> fetch<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, result<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">&quot;row%d&quot;</span> % <span style="color: black;">&#40;</span>result.<span style="color: black;">pop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> recordsCount<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, result<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>result<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> DbAdapter:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, host, <span style="color: #dc143c;">user</span>, password, db, <span style="color: #008000;">type</span> = <span style="color: #483d8b;">&quot;fast&quot;</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>._type = <span style="color: #008000;">type</span>
        <span style="color: #ff7700;font-weight:bold;">if</span><span style="color: black;">&#40;</span><span style="color: #008000;">type</span> == <span style="color: #483d8b;">&quot;slow&quot;</span><span style="color: black;">&#41;</span>:
            <span style="color: #008000;">self</span>._db = SlowDbEngine<span style="color: black;">&#40;</span>host, <span style="color: #dc143c;">user</span>, password, db<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            <span style="color: #008000;">self</span>._db = FastDbEngine<span style="color: black;">&#40;</span><span style="color: black;">&#91;</span>host, <span style="color: #dc143c;">user</span>, password, db<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> runQuery<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, sql<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>._type == <span style="color: #483d8b;">&quot;slow&quot;</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>._db.<span style="color: black;">runQuery</span><span style="color: black;">&#40;</span>sql<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            result = <span style="color: #008000;">self</span>._db.<span style="color: black;">query</span><span style="color: black;">&#40;</span>sql<span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#91;</span><span style="color: #008000;">self</span>._db.<span style="color: black;">fetch</span><span style="color: black;">&#40;</span>result<span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">xrange</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>._db.<span style="color: black;">recordsCount</span><span style="color: black;">&#40;</span>result<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">'__main__'</span>:
    <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span>DbAdapter<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;localhost&quot;</span>, <span style="color: #483d8b;">&quot;root&quot;</span>, <span style="color: #483d8b;">&quot;password&quot;</span>, <span style="color: #483d8b;">&quot;db&quot;</span><span style="color: black;">&#41;</span>.<span style="color: black;">runQuery</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;select * from table&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
-----------------------
&nbsp;
<span style="color: black;">&#91;</span><span style="color: #483d8b;">'row1'</span>, <span style="color: #483d8b;">'row2'</span>, <span style="color: #483d8b;">'row3'</span><span style="color: black;">&#93;</span>
&nbsp;</pre>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/oop/oop-pattern-adapter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google App Engine &#8211; знакомство, плюсы и минусы, полезные советы</title>
		<link>http://sheremetov.com/programming/google-app-engine/</link>
		<comments>http://sheremetov.com/programming/google-app-engine/#comments</comments>
		<pubDate>Sun, 21 Mar 2010 11:33:54 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=569</guid>
		<description><![CDATA[Google App Engine это платформа предлагаемая компанией Google для веб-разработчиков. Не&#160;будет преувеличением, сказать, что проблема роста и&#160;разумной экономии на&#160;масштабируемости и&#160;производительности стоит перед разработчиками с&#160;самого начала работы над проектом. С&#160;одной стороны, огромное количество стартапов, разработчики которых даже приблизительно не&#160;могут представить себе характер и&#160;объем нагрузок на&#160;сайт, а&#160;желая иметь некоторый запас производительности оптимизация, зачастую, начинается с&#160;первых строк кода. [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://code.google.com/appengine/">Google App Engine</a> это платформа предлагаемая компанией Google для веб-разработчиков. Не&nbsp;будет преувеличением, сказать, что проблема роста и&nbsp;разумной экономии на&nbsp;масштабируемости и&nbsp;производительности стоит перед разработчиками с&nbsp;самого начала работы над проектом. С&nbsp;одной стороны, огромное количество стартапов, разработчики которых даже приблизительно не&nbsp;могут представить себе характер и&nbsp;объем нагрузок на&nbsp;сайт, а&nbsp;желая иметь некоторый запас производительности оптимизация, зачастую, начинается с&nbsp;первых строк кода. С&nbsp;другой стороны, надо сказать что приложения, которые должны легко масштабироваться имеют весьма сложную архитектуру внутри, и&nbsp;написание такого кода, тоже весьма специфично. Отдельо нужно упомянуть&nbsp;то, что поддержание такой, горизонтально масштабарованной, инфраструктуры в&nbsp;рабочем состоянии, довольно хлопотное и&nbsp;дорогое мероприятие. В&nbsp;индустрии создания высоконагруженных приложений, безусловным флагманом, является Google. Свой опыт они предлагают разработчикам в&nbsp;виде <a href="http://code.google.com/appengine/">Google App Engine</a>.</p>
<p>Для тех, кто совсем ничего не&nbsp;слышал про GAE, рекомендую ознакомится со&nbsp;статьями про <a href="http://habrahabr.ru/blogs/gae/81895/">быстрый старт с&nbsp;GAE</a>, <a href="http://habrahabr.ru/blogs/gae/81920/">модель</a> и&nbsp;<a href="http://habrahabr.ru/blogs/gae/81933/">контроллер</a>.</p>
<p>Поговорим немного о&nbsp;достоинствах платформы:</p>
<ul>
<li>в&nbsp;первую очередь, это, конечно масштабируемость &laquo;из&nbsp;коробки&raquo;, о&nbsp;которой абсолютно не&nbsp;надо заботится. Гарантированный uptime 99.9%, никаких бекапов, репликаций и&nbsp;прочих мук в&nbsp;высоконагруженых приложениях.</li>
<li>все разработчики, как один, восхищаются тем как хорошо документирован GAE, и&nbsp;тем как просто сделать свой первых hello world</li>
<li>прозрачная интеграция с&nbsp;аккаунтом Google и&nbsp;многочисленными сервисами</li>
<li></li>
<li>поддержка Java и&nbsp;Python &laquo;из&nbsp;коробки&raquo; и&nbsp;огромное количество скриптовых языком &laquo;из&nbsp;под Java&raquo;</li>
<li>удобный сервер для разработки и&nbsp;простая утилита деплоя</li>
<li><a href="http://groups.google.com/group/google-appengine/web/google-app-engine-open-source-projects?pli=1">огромное количество open source проектов</a> являются хорошим подспорьем в&nbsp;разработке на&nbsp;GAE</li>
</ul>
<p>Как обычно в&nbsp;бочке меда, окажется ложка дегтя.</p>
<ul>
<li>ограничеие на&nbsp;размер файла: 1&nbsp;мегабайт</li>
<li>еще одно интересное ограничение,&nbsp;&mdash; на&nbsp;запрос, не&nbsp;более миллиона циклов CPU на&nbsp;запрос. У&nbsp;вас нет никакких инсрументов, позволяющих оценить, профилировать эти самые циклы, и&nbsp;на&nbsp;локальном сервере этого ограничения нет. Таким образом, приготовьтесь к&nbsp;тому что ваше сложное приложение начнет разваливаться после деплоя, вероятно, случайным образом.</li>
<li>очень медленное локальное хранилище даных, хотя на&nbsp;сервере, после деплоя работа с&nbsp;хранилищем тоже неоднозначна, плюс на&nbsp;работу с&nbsp;хранилищем также налагаются ограничения и&nbsp;квоты</li>
<li>загрузчик (bulk uploader) довольно медленный и&nbsp;часто генерирует 500ю ошибку.</li>
<li>надо&nbsp;ли говорить&nbsp;&mdash; но&nbsp;у&nbsp;вас нет рутовых прав</li>
<li>подробнее про ограничения можно почитать <a href="http://code.google.com/appengine/docs/quotas.html">здесь</a></li>
</ul>
<p>Исходя из&nbsp;сего вышеперечисленного, я&nbsp;думаю идеальное применение для GAE это маленькие стартапы, неспособные спланировать трафик на&nbsp;свои приложения и&nbsp;построить дорогую инфраструктуру, способную выдержать &laquo;наплыв&raquo;, в&nbsp;случае успеха. Это могут быть всевозможные виджеты, приложения для социальных сетей, игры, с&nbsp;нересурсоемкой серверной логикой.</p>
<p>Некоторые выводы, о&nbsp;том как использовать GAE более эффективно:</p>
<ul>
<li>переносите логику и&nbsp;функционал на&nbsp;клиент,&nbsp;&mdash; всякого рода логика на&nbsp;JS, Flash, Flex, Silverlight, etc</li>
<li>используйте <a href="http://code.google.com/appengine/articles/scaling/memcache.html">memcache</a> для кеширования запросов к&nbsp;хранилищу</li>
<li>используйте <a href="http://code.google.com/appengine/articles/sharding_counters.html">sharded counters</a> для статистики</li>
<li>отсылка писем забирает много CPU, лучше использовать <a href="http://code.google.com/appengine/docs/python/config/queue.html">tasks</a> или <a href="http://code.google.com/appengine/docs/python/config/cron.html">cron</a></li>
<li>используйте несколько GAE приложений, для разных нужд, вместо одного большого. Это имеет смысл для увеличения квот и&nbsp;разделения статистики.</li>
<li>используйте пакетное сохранение и&nbsp;извлечение данных из&nbsp;хранилища</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/programming/google-app-engine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
