<?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>Tue, 03 Jan 2012 21:36:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>Актуальность применения ООП сегодня</title>
		<link>http://sheremetov.com/programming/oop-today/</link>
		<comments>http://sheremetov.com/programming/oop-today/#comments</comments>
		<pubDate>Mon, 03 Jan 2011 17:47:49 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=798</guid>
		<description><![CDATA[Хочу поблагодарить Сергея, одного из своих читателей, задавших интересный вопрос. Я решил ответить на него в блоге, так как тема может быть интересна еще кому-нибудь. Вопрос был о том, насколько актуальна сегодня парадигма ООП, и что ждет программирование дальше. Сергей ссылался на интересное обсуждение здесь. Из комментариев этого обсуждения можно видеть, насколько тема неоднозначна и противоречива. Я, ни в коем случае не считаю себя большим экспертом в этой [...]]]></description>
			<content:encoded><![CDATA[<p>Хочу поблагодарить Сергея, одного из своих читателей, задавших интересный вопрос. Я решил ответить на него в блоге, так как тема может быть интересна еще кому-нибудь.</p>
<p><a href="http://sheremetov.com/wp-content/uploads/2011/01/WrongProgramming.jpg"><img align="left" style="padding-right:20px;" class="alignleft size-full wp-image-806" title="WrongProgramming" src="http://sheremetov.com/wp-content/uploads/2011/01/WrongProgramming.jpg" alt="" width="400" height="518" /></a> Вопрос был о том, насколько актуальна сегодня парадигма ООП, и что ждет программирование дальше. Сергей ссылался на интересное обсуждение здесь. Из комментариев этого обсуждения можно видеть, насколько тема неоднозначна и противоречива. Я, ни в коем случае не считаю себя большим экспертом в этой области, но есть некоторые мысли, которыми хочу поделиться, надеюсь это будет интересно, ведь недаром, спору «нужен ли C++» уже почти пол века.</p>
<p>Первое, о чем хочется упомянуть, это ни функциональные языки программирования, ни DSL, не являются чем-либо новым, равно как и многие другие «новые подходы», вновь ставшие популярными последние годы. Многие из них берут начало в 60х годах, когда программистов было мало, и пришли они, в основном, из среды математиков и физиков. Тогда было легко изобретать новое, и это быстро подхватывалось пытливыми умами, развивалось и применялось. Сейчас количество программистов значительно выросло, и как следствие, уровень среднего программиста стал значительно ниже. Программирование проделало длинный путь от искусства и науки к ремеслу. Программистская среда стала более инертной, с трудом принимая новые подходы, и чем сложнее подход, тем менее он популярен. Именно поэтому, уже завоевавшая популярность, несложная концепция объектного проектирования по-прежнему остается такой востребованной. Несколько слов в защиту ООП, — во-первых, это работает. Так или иначе, программисты научились понимать друг-друга, строить сложные системы и создавать абстракции при помощи паттернов. Множество программистов начало думать в терминах ООП, множество кода написано и протестировано. Это то, что делает ООП актуальным еще долгое время, особенно для решения классических задач. Но для задач нетривиальных, всегда необходимо пробовать и применять новые подходы. «Серебряной пули» не существует. Более того, понимание подходов функционального программирования, макроязыков, алгоритмов, устройства компиляторов-интерпретаторов дают программисту неоспоримые преимущества для написание качественного и гибкого кода. Поэтому изучайте, пробуйте, и эти знания изменят ваш код и подходы к работе.</p>
<p>Несколько слов о том, как я вижу развитие программирования:</p>
<ul>
<li> Я думаю что постепенно программирование будет смещаться от императивных языков к декларативным. Я имею ввиду, что человек не будет фокусироваться на пути реализации, не будет описывать «как делать», а лишь, «что должно получиться». Профессия программиста трансформируется, — будут своего рода аналитики, описывающие требования к системе, на основании которых система будет работать, без всякого дополнительного кодирования.</li>
<li>В связи с тем, что развитие современных процессоров вступило в фазу экстенсивного развития (от гонки частот мы переходим к гонке количества ядер), скоро мы должны увидеть взлет популярности простого функционального языка, к сожалению это не будет ни haskel и erlang, а вероятнее всего javascript. Хотя тут, очень легко ошибиться.</li>
<li>Еще раньше, я думаю, мы увидим то, как средства визуального проектирования вновь войдут в моду. С одной стороны, это немного противоречит «декларативной природе», с другой — я думаю нам еще долго не удастся настолько специфицировать интерфейсы, чтобы стало возможным генерировать их.</li>
<li>Интерфейсы взаимодействия пользователя с системой будут стандартизироваться все больше и больше. Роль дизайна будет решающей, и попытки специфицировать UI будут способствовать как обучению пользователей взаимодействовать с системами, так и проектировщиков, строить их максимально предсказуемо.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/programming/oop-today/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>AppEngine, преодоление лимита в 1000 элементов на запрос</title>
		<link>http://sheremetov.com/programming/appengine-more-than-1000/</link>
		<comments>http://sheremetov.com/programming/appengine-more-than-1000/#comments</comments>
		<pubDate>Sun, 07 Nov 2010 08:15:10 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=792</guid>
		<description><![CDATA[Google app engine, очень удобная и гибкая платформа, для веб разработки, но к сожалению постоянно приходится думать об ограничениях, налагаемых на процессорное время, объем занимаемой памяти, запросы к хранилищу, тем самым, организовывая нас, заставляя писать более оптимизированный код. С другой стороны, а что если действительно нужно выполнять сложную операцию, или «тяжелый запрос»? Тогда хотелось бы «спрятать», сложности и ограничения app engine внутрь изящного синтаксиса python. [...]]]></description>
			<content:encoded><![CDATA[<p>Google app engine, очень удобная и гибкая платформа, для веб разработки, но к сожалению постоянно приходится думать об ограничениях, налагаемых на процессорное время, объем занимаемой памяти, запросы к хранилищу, тем самым, организовывая нас, заставляя писать более оптимизированный код. С другой стороны, а что если действительно нужно выполнять сложную операцию, или «тяжелый запрос»? Тогда хотелось бы «спрятать», сложности и ограничения app engine внутрь изящного синтаксиса python. В данном случае предлагается использовать питоновые итератиры, для того, что бы прозрачно для пользователя, выбирать неограниченное количество записей из app engine. Хотя, как видно из кода, все-таки некоторые ограничения встроены в класс, в ствойстве _debug_limit.</p>
<p>Вот код итератора:</p>
<pre class="python">&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> QueryIter<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
&nbsp;
    _limit_fetch = <span style="color: #ff4500;">1000</span>
    _items = <span style="color: #008000;">None</span>
    _cursor = <span style="color: #008000;">None</span>
    _debug_limit = <span style="color: #ff4500;">10000</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>, query<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>._query = query
        <span style="color: #008000;">self</span>._fetchNext<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>        
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> _fetchNext<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>._items = <span style="color: #008000;">iter</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>._query.<span style="color: black;">fetch</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>._limit_fetch<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>._cursor = <span style="color: #008000;">self</span>._query.<span style="color: black;">cursor</span><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;">__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> 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>._debug_limit -= <span style="color: #ff4500;">1</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>._debug_limit &lt; = <span style="color: #ff4500;">0</span>:
            <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">StopIteration</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            <span style="color: #ff7700;font-weight:bold;">try</span>:
                result = <span style="color: #008000;">self</span>._items.<span style="color: black;">next</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">StopIteration</span>, e:
                <span style="color: #008000;">self</span>._query.<span style="color: black;">with_cursor</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>._cursor<span style="color: black;">&#41;</span>
                <span style="color: #008000;">self</span>._fetchNext<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
                result = <span style="color: #008000;">self</span>._items.<span style="color: black;">next</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># raised exception stop the loop</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> result</pre>
<p>А вот, пример применения:</p>
<pre class="python">query = MyModel.<span style="color: black;">all</span><span style="color: black;">&#40;</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> QueryIter<span style="color: black;">&#40;</span>query<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">print</span> i</pre>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/programming/appengine-more-than-1000/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Google app engine как платформа для вебразработки. Мониторинг сайтов при помощи app engine.</title>
		<link>http://sheremetov.com/programming/app-engine-monitoring/</link>
		<comments>http://sheremetov.com/programming/app-engine-monitoring/#comments</comments>
		<pubDate>Sat, 02 Oct 2010 06:59:53 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=780</guid>
		<description><![CDATA[Какое-то время назад я&#160;увлекся экспериментами с&#160;платформой google app engine. Впечатления очень положительные. Безусловно не&#160;всякое приложение можно сделать в&#160;силу ограничение на&#160;скорость работы скрипта, время работы, некоторые возможности (например сокетные коннекты). Подкупает простота. Сделано программистами для программистов. Масса возможностей и&#160;ничего лишнего. Очень легко настраиваются задачи запускаемые по&#160;времени (типа отложенных задач и&#160;типа задач по&#160;крону). Очень просто работать с&#160;хранилище, [...]]]></description>
			<content:encoded><![CDATA[<p>Какое-то время назад я&nbsp;увлекся экспериментами с&nbsp;платформой <a href="http://code.google.com/appengine/">google app engine</a>. Впечатления очень положительные. Безусловно не&nbsp;всякое приложение можно сделать в&nbsp;силу ограничение на&nbsp;скорость работы скрипта, время работы, некоторые возможности (например сокетные коннекты). Подкупает простота. Сделано программистами для программистов. Масса возможностей и&nbsp;ничего лишнего. Очень легко настраиваются задачи запускаемые по&nbsp;времени (типа отложенных задач и&nbsp;типа задач по&nbsp;крону). Очень просто работать с&nbsp;хранилище, которое не&nbsp;совсем SQL, что конечно дает свои достоинства и&nbsp;недостатки, но&nbsp;надо не&nbsp;забывать что это хранилище с&nbsp;неограниченным горизонтальным масштабированием, что само по&nbsp;себе нечто. Кеш, авторизация, язык темплейтов&nbsp;&mdash; из&nbsp;коробки. Средства для логирования, мониторинга, переключения версий по&nbsp;одному клику. Единственная причина почему это не&nbsp;становится массовой платформой для веба это инертность программистов, я&nbsp;думаю. Но&nbsp;тем не&nbsp;менее по&nbsp;тем изменениям что я&nbsp;вижу вокруг себя, популярность понемногу приходит к&nbsp;app engine. </p>
<p>Вот небольшой пример приложения, которое мониторит ваш сайт, и&nbsp;в&nbsp;случае если сайт не&nbsp;отдается или на&nbsp;сайте не&nbsp;находится эталонная строка, высылает вам письмо. Идеальное средство для получения извещений о&nbsp;любых проблемах с&nbsp;вашим сайтом.</p>
<pre class="python">&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> google.<span style="color: black;">appengine</span>.<span style="color: black;">api</span> <span style="color: #ff7700;font-weight:bold;">import</span> users
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span>
<span style="color: #ff7700;font-weight:bold;">import</span> wsgiref.<span style="color: black;">handlers</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">cgi</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">datetime</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">httplib</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">time</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> google.<span style="color: black;">appengine</span>.<span style="color: black;">api</span>.<span style="color: black;">labs</span> <span style="color: #ff7700;font-weight:bold;">import</span> taskqueue
<span style="color: #ff7700;font-weight:bold;">from</span> google.<span style="color: black;">appengine</span>.<span style="color: black;">ext</span>.<span style="color: black;">webapp</span> <span style="color: #ff7700;font-weight:bold;">import</span> template
<span style="color: #ff7700;font-weight:bold;">from</span> google.<span style="color: black;">appengine</span>.<span style="color: black;">ext</span> <span style="color: #ff7700;font-weight:bold;">import</span> db
<span style="color: #ff7700;font-weight:bold;">from</span> google.<span style="color: black;">appengine</span>.<span style="color: black;">ext</span> <span style="color: #ff7700;font-weight:bold;">import</span> webapp
<span style="color: #ff7700;font-weight:bold;">from</span> google.<span style="color: black;">appengine</span>.<span style="color: black;">api</span> <span style="color: #ff7700;font-weight:bold;">import</span> memcache
<span style="color: #ff7700;font-weight:bold;">from</span> google.<span style="color: black;">appengine</span>.<span style="color: black;">api</span> <span style="color: #ff7700;font-weight:bold;">import</span> mail
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> MonitoringHandler<span style="color: black;">&#40;</span>BaseHandler<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><span style="color: black;">&#41;</span>:
        today = <span style="color: #dc143c;">datetime</span>.<span style="color: #dc143c;">datetime</span>.<span style="color: black;">now</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">strftime</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;%d-%m-%y %H:%M:%S&quot;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">response</span>.<span style="color: black;">headers</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'Content-Type'</span><span style="color: black;">&#93;</span> = <span style="color: #483d8b;">'text/plain'</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">response</span>.<span style="color: black;">out</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span>today<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">try</span>:
            conn = <span style="color: #dc143c;">httplib</span>.<span style="color: black;">HTTPSConnection</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;site.com&quot;</span>, timeout=<span style="color: #ff4500;">1000</span><span style="color: black;">&#41;</span>
            conn.<span style="color: black;">request</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;GET&quot;</span>, <span style="color: #483d8b;">&quot;/&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
            <span style="color: #ff7700;font-weight:bold;">if</span><span style="color: black;">&#40;</span>conn.<span style="color: black;">getresponse</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">read</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">find</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;some text string&quot;</span><span style="color: black;">&#41;</span> &lt; = <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>:
                <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">Exception</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;String not found&quot;</span><span style="color: black;">&#41;</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">response</span>.<span style="color: black;">out</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot; Everything is ok&quot;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">Exception</span>, e:
			<span style="color: #008000;">self</span>.<span style="color: black;">response</span>.<span style="color: black;">out</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot; Send email&quot;</span><span style="color: black;">&#41;</span>
			mail.<span style="color: black;">send_mail</span><span style="color: black;">&#40;</span>sender=<span style="color: #483d8b;">&quot;from@email.com&quot;</span>,
						  to=<span style="color: #483d8b;">&quot;your@email.com&quot;</span>,
						  subject=<span style="color: #483d8b;">&quot;ServerFail&quot;</span>,
						  body=<span style="color: #483d8b;">&quot;[%s] %s&quot;</span> % <span style="color: black;">&#40;</span>today, e<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>:
    application = webapp.<span style="color: black;">WSGIApplication</span><span style="color: black;">&#40;</span>
        <span style="color: black;">&#91;</span>
            <span style="color: black;">&#40;</span><span style="color: #483d8b;">'/'</span>, MonitoringHandler<span style="color: black;">&#41;</span>
        <span style="color: black;">&#93;</span>, debug=<span style="color: #008000;">True</span>
    <span style="color: black;">&#41;</span>
    wsgiref.<span style="color: black;">handlers</span>.<span style="color: black;">CGIHandler</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">run</span><span style="color: black;">&#40;</span>application<span style="color: black;">&#41;</span>
&nbsp;</pre>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/programming/app-engine-monitoring/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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;являюсь. Устанавливается [...]]]></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>5</slash:comments>
		</item>
		<item>
		<title>ООП для чайников. Паттерны проектирования. Прокси (proxy)</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-3/</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-3/#comments</comments>
		<pubDate>Wed, 07 Apr 2010 05:58:17 +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=621</guid>
		<description><![CDATA[Последний паттерн из группы структурных, — Прокси. Его назначение в том, что бы добавлять дополнительный слой функциональности между клиентом и подсистемой (субъектом). В такой, казалось бы избыточной работе есть масса смысла и пользы, приведу несколько примеров когда это оправдано: субъект находится на другой машине и Прокси скрывает протокол доступа, при обращениях создает экземпляр субъекта, только когда это действительно надо, кеширует результаты. может контролировать права доступа [...]]]></description>
			<content:encoded><![CDATA[<p>Последний паттерн из группы структурных, — Прокси. Его назначение в том, что бы добавлять дополнительный слой функциональности между клиентом и подсистемой (субъектом). В такой, казалось бы избыточной работе есть масса смысла и пользы, приведу несколько примеров когда это оправдано:</p>
<ul>
<li>субъект находится на другой машине и Прокси скрывает протокол доступа, при обращениях</li>
<li>создает экземпляр субъекта, только когда это действительно надо, кеширует результаты.</li>
<li>может контролировать права доступа при вызовах</li>
<li>производит синхронные вызовы в асинхронной среде</li>
</ul>
<p>На диаграмме прокси выглядит так:</p>
<p><a href="http://sheremetov.com/wp-content/uploads/2010/03/proxy.gif"><img class="alignnone size-full wp-image-622" title="proxy" src="http://sheremetov.com/wp-content/uploads/2010/03/proxy.gif" alt="proxy" width="405" height="252" /></a></p>
<p>Короткий пример Прокси:</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">class</span> XMPPRequest<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>, connect<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> send<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, to, text<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> XmppProxy<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> send<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, who, to, text<span style="color: black;">&#41;</span>:
        xmpp = XMPPRequest<span style="color: black;">&#40;</span>who<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> xmpp.<span style="color: black;">send</span><span style="color: black;">&#40;</span>to, text<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">'__main__'</span>:
    proxy = XmppProxy<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>proxy.<span style="color: black;">send</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;mrjazz&quot;</span>, <span style="color: #483d8b;">&quot;team&quot;</span>, <span style="color: #483d8b;">&quot;hi all&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></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-3/feed/</wfw:commentRss>
		<slash:comments>0</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>2</slash:comments>
		</item>
	</channel>
</rss>

