tag:blogger.com,1999:blog-45003003898912773912024-02-19T08:41:35.528+04:00Android software developmentAnonymoushttp://www.blogger.com/profile/07767399673328608941noreply@blogger.comBlogger17125tag:blogger.com,1999:blog-4500300389891277391.post-47447050154528637682015-04-16T02:42:00.000+04:002015-04-16T02:42:05.057+04:00Как вручную изменить версию БД SQLiteДля упрощения отладки иногда удобно иметь возможность изменить версию БД без переустановки приложения.<br />
<br />
Для этого достаточно выполнить SQL запрос<br />
<pre class="lang-sql prettyprint prettyprinted" style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, sans-serif; font-size: 13px; margin-bottom: 1em; max-height: 600px; overflow: auto; padding: 5px; width: auto; word-wrap: normal;"><code style="border-image-outset: initial; border-image-repeat: initial; border-image-slice: initial; border-image-source: initial; border-image-width: initial; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, sans-serif; margin: 0px; padding: 0px; white-space: inherit;"><span class="pln" style="border-image-outset: initial; border-image-repeat: initial; border-image-slice: initial; border-image-source: initial; border-image-width: initial; border: 0px; color: black; margin: 0px; padding: 0px;">PRAGMA user_version </span><span class="pun" style="border-image-outset: initial; border-image-repeat: initial; border-image-slice: initial; border-image-source: initial; border-image-width: initial; border: 0px; color: black; margin: 0px; padding: 0px;">=</span><span class="pln" style="border-image-outset: initial; border-image-repeat: initial; border-image-slice: initial; border-image-source: initial; border-image-width: initial; border: 0px; color: black; margin: 0px; padding: 0px;"> </span><span class="pln" style="border-image-outset: initial; border-image-repeat: initial; border-image-slice: initial; border-image-source: initial; border-image-width: initial; border: 0px; margin: 0px; padding: 0px;"><span style="color: maroon;">number;</span></span></code></pre>
Аналогично можно узнать и текущую версию БД.<div>
<pre class="lang-sql prettyprint prettyprinted" style="background-color: #eeeeee; border: 0px; color: #393318; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, sans-serif; font-size: 13px; margin-bottom: 1em; max-height: 600px; overflow: auto; padding: 5px; width: auto; word-wrap: normal;"><code style="border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, sans-serif; margin: 0px; padding: 0px; white-space: inherit;"><span class="pln" style="border: 0px; color: black; margin: 0px; padding: 0px;">PRAGMA user_version;</span></code></pre>
</div>
Anonymoushttp://www.blogger.com/profile/07767399673328608941noreply@blogger.com0tag:blogger.com,1999:blog-4500300389891277391.post-51344940492292043522015-03-20T00:50:00.000+04:002015-03-20T00:50:07.734+04:00Genymotion и Charles proxy<span style="background-color: white; font-family: inherit;">Включается проксирование так же, как и в обычном телефоне, но и там это не очень очевидно делается:</span><br />
<span style="background-color: white; font-family: inherit;"><br /></span>
<br />
<ul style="box-sizing: border-box; line-height: 24px; list-style-position: outside; margin: 0px 0px 24px 48px; padding: 0px;">
<li style="box-sizing: border-box;"><span style="background-color: white; font-family: inherit;">Настройки -> Wi-Fi -> долгое нажатие на активной сети</span></li>
<li style="box-sizing: border-box;"><span style="background-color: white; font-family: inherit;">"Изменить сеть"</span></li>
<li style="box-sizing: border-box;"><span style="background-color: white; font-family: inherit;">"Дополнительно"</span></li>
<li style="box-sizing: border-box;"><span style="background-color: white; font-family: inherit;">"Прокси-сервер" -> "Вручную"</span></li>
<li style="box-sizing: border-box;"><span style="background-color: white; font-family: inherit;">Прокси: 10.0.3.2 (адрес локальной машины в Genymotion)</span></li>
<li style="box-sizing: border-box;"><span style="background-color: white; font-family: inherit;">Порт: 8888</span></li>
<li style="box-sizing: border-box;"><span style="background-color: white; font-family: inherit;">"Сохранить"</span></li>
</ul>
Anonymoushttp://www.blogger.com/profile/07767399673328608941noreply@blogger.com0tag:blogger.com,1999:blog-4500300389891277391.post-89814821733194103252014-12-19T12:38:00.000+04:002014-12-19T12:38:06.214+04:00AndroidStudio - Gradle DSL method not found 'runProguard()'<span style="font-family: inherit;">С обновлением Android Studio до версии 1.0 произошли изменения и в gradle. В результате появляется такая вот ошибка:</span><br />
<div style="background-color: white; line-height: 21.3333320617676px;">
</div>
<blockquote class="tr_bq">
<span style="font-family: inherit;">Gradle DSL method not found: 'runProguard()'</span></blockquote>
<br />
<span style="font-family: inherit;"><br />
</span> <br />
<div class="separator" style="clear: both; text-align: center;">
<span style="font-family: inherit; margin-left: 1em; margin-right: 1em;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgY-GhTG3QIdbsmeCGIMcrJxqTe-XL8kqgAxCUSkUJus3VPTxMmqPB4cNb4DXN7naRUtTMNa94V26IHa3zlV16qFhKjk2SE8St18FDYKAqbnn9ThNFqFVq-KnRoSMbXupi0NjraWdzrXQ/s1600/gradle-run-proguard.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgY-GhTG3QIdbsmeCGIMcrJxqTe-XL8kqgAxCUSkUJus3VPTxMmqPB4cNb4DXN7naRUtTMNa94V26IHa3zlV16qFhKjk2SE8St18FDYKAqbnn9ThNFqFVq-KnRoSMbXupi0NjraWdzrXQ/s320/gradle-run-proguard.png" /></a></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: inherit;"><br />
</span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: inherit;">Для исправления нужно всего лишь изменить "<b style="line-height: 13.3333320617676px;">runProguard"</b><span style="line-height: 13.3333320617676px;"> на "</span><b style="line-height: 13.3333320617676px;">minifyEnabled".</b></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="line-height: 13.3333320617676px;"><span style="font-family: inherit;">Все изменившиеся свойства:</span></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="line-height: 13.3333320617676px;"><span style="font-family: inherit;"><br />
</span></span></div>
<blockquote class="tr_bq" style="clear: both; text-align: left;">
<code style="background-color: white; line-height: 21.3333320617676px;">runProguard => minifyEnabled</code> </blockquote>
<blockquote class="tr_bq" style="clear: both; text-align: left;">
<span style="line-height: 1.6;"><code>zipAlign => zipAlignEnabled</code></span> </blockquote>
<blockquote class="tr_bq" style="clear: both; text-align: left;">
<code style="background-color: white; line-height: 21.3333320617676px;">jniDebugBuild => jniDebuggable</code> </blockquote>
<blockquote class="tr_bq" style="clear: both; text-align: left;">
<code style="background-color: white; line-height: 21.3333320617676px;">renderscriptDebug => renderscriptDebuggable</code></blockquote>
<div class="separator" style="clear: both; text-align: left;">
<span style="line-height: 13.3333320617676px;"><span style="font-family: inherit;"><br />
</span></span></div>
<span style="font-family: inherit;">Описано это всё здесь: <a href="http://tools.android.com/tech-docs/new-build-system/migrating-to-1-0-0" target="_blank">tools.android.com</a></span>Anonymoushttp://www.blogger.com/profile/07767399673328608941noreply@blogger.com0tag:blogger.com,1999:blog-4500300389891277391.post-28639956109169047362014-10-08T23:54:00.000+04:002014-10-09T00:17:06.005+04:00Почему не отображается PhotoShareDialogДля того, чтобы расшарить изображение в FB из своего приложения через SDK недостаточно использования <pre class="brush:java">new FacebookDialog.PhotoShareDialogBuilder(...).addPhotos(...).build().present();</pre>В этом случае диалог просто не появляется, а в логах добавляется ошибка <blockquote>Warning: Error: com.facebook.FacebookException: Failed to copy image.</blockquote>Нужно ещё объявить в манифесте провайдер:<br />
<br />
<pre class="brush:xml"><provider
android:authorities="com.facebook.app.NativeAppCallContentProvider355198514515820"
android:name="com.facebook.NativeAppCallContentProvider"
android:exported="true" />
</pre><br />
Нужно только заменить цифровую часть на id своего приложения.<br />
<br />
Подробнее прочитать можно в <a href="https://developers.facebook.com/docs/reference/android/current/class/NativeAppCallContentProvider/">документации</a>.Anonymoushttp://www.blogger.com/profile/07767399673328608941noreply@blogger.com0tag:blogger.com,1999:blog-4500300389891277391.post-40379029312279009192011-12-01T09:57:00.001+04:002011-12-01T15:09:25.281+04:00Проверка доступности сайта/хоста<pre class="brush:java" >boolean isHostReachable(String address) {
try {
URL url = new URL(address);
HttpURLConnection urlc =
(HttpURLConnection) url.openConnection();
urlc.setRequestProperty("User-Agent", "userAgent");
urlc.setRequestProperty("Connection", "close");
urlc.setConnectTimeout(1000 * 10);
urlc.connect();
if (urlc.getResponseCode() == 200) {
urlc.disconnect();
return true;
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
</pre><br />
В коде ничего сложного нет: создаём подключение к интересующему хосту, задаём user agent, таймайт в миллисекундах, подключаемся и проверяем код ответа, после чего тут же отключаемся.Anonymoushttp://www.blogger.com/profile/07767399673328608941noreply@blogger.com2tag:blogger.com,1999:blog-4500300389891277391.post-11838780293890996702011-09-27T18:06:00.000+04:002011-12-01T15:11:30.093+04:00Выделение текста в WebView или как выстрелить себе в ногу.<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUB0_lxUUgbtcq_H4bppCzkBO30-i2QSlZLu3VGKMLTeuNN777WKNw4t7adyrOBvNTkHPjgTDh5YGJWxfg5RBtQiXoo7Yhae7Hv1C9KlG72NBHSlo7nEZUaoMdBSLC1YpWcdF2bYt5LA/s1600/picard-facepalm.jpg" imageanchor="1" style="clear:right; float:right; margin-left:1em; margin-bottom:1em"><img border="0" height="207" width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUB0_lxUUgbtcq_H4bppCzkBO30-i2QSlZLu3VGKMLTeuNN777WKNw4t7adyrOBvNTkHPjgTDh5YGJWxfg5RBtQiXoo7Yhae7Hv1C9KlG72NBHSlo7nEZUaoMdBSLC1YpWcdF2bYt5LA/s320/picard-facepalm.jpg" /></a></div><br />
Понадобилось выделять текст в WebView. Потратил почти два дня поочередных запросов к гуглу, поисков на StackOverflow и изучения исходников стандартного браузера. Решение в итоге нашёл, даже два, но осадок остался. Задача довольно часто нужна и можно было бы описать её решение в документации.<br />
<br />
<a name='more'></a><br />
<br />
<a href="http://stackoverflow.com/questions/6058843/android-how-to-select-texts-from-webview"><b>Решение №1.</b></a> Quick and dirty hack, лежащий на поверхности.<br />
У WebView есть метод <a href="http://developer.android.com/reference/android/webkit/WebView.html#emulateShiftHeld()">emulateShiftHeld()</a>, доступен он только начиная с версии 2.2 (cамое странное, что он был тут же объявлен deprecated), но появился он раньше и можно попробовать достать его через reflection. Этот метод переводит WebView в режим выделения текста, появляется курсор мыши (sic!), и можно выделить текст.<br />
<br />
<pre class="brush:java">public void selectAndCopyText() {
try {
Method m = WebView.class.getMethod("emulateShiftHeld", Boolean.TYPE);
m.invoke(BookView.mWebView, false);
} catch (Exception e) {
e.printStackTrace();
// fallback
KeyEvent shiftPressEvent = new KeyEvent(0,0,
KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_SHIFT_LEFT,0,0);
shiftPressEvent.dispatch(this);
}
}
</pre><br />
Вызов этого метода можно повесить, например, на лонг тап.<br />
Однако, в стандартном браузере лонг тап вызывает сразу выделение текста, без всяких курсоров. Значит можно как-то улучшить существующее решение.<br />
<br />
<b>Решение №2.</b> Это решение мне нравится больше, т.к. имитирует поведение системного браузера и нужно писать меньше кода :) Но есть и минус -- используется private API.<br />
К вечеру второго дня нашёл наконец-таки код в исходниках, который не даёт выделять текст в WebView. <a href="http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3.4_r1/android/webkit/WebChromeClient.java#WebChromeClient.onSelectionStart%28android.webkit.WebView%29">Вот он:</a><br />
<br />
<pre class="brush:java">public void onSelectionStart(WebView view) {
// By default we cancel the selection again, thus disabling
// text selection unless the chrome client supports it.
view.notifySelectDialogDismissed();
}
</pre><br />
В комментариях собственно всё сказано. Однако метод помечен аннотацией @hide, что как бы намекает нам, что использовать его не рекомендуется. Если очень нужно, то можно всё же переопределить этот метод.<br />
<br />
<pre class="brush:java">setWebChromeClient(new WebChromeClient() {
public void onSelectionStart(WebView view) {
// Именно так, без @Override и с пустым телом
}
});
</pre><br />
В дополнение можно переопределить метод onSelectionDone(), чтобы выполнить какие-либо действия после завершения выделения.<br />
<br />
Используйте это способ на свой страх и риск. В завершение процитирую, что думает Dianne Hackborn про использование private API (взято <a href="http://stackoverflow.com/questions/4951146/is-it-possible-to-use-android-sdk-methods-with-hide-annotation/4951343#4951343">отсюда</a>, из комментариев):<br />
<br />
<blockquote>DO NOT DO THIS. It's not just "you are not supposed to use them," it is "an app relying on this will randomly break on different devices and platform versions" because there is no guarantee that these private symbols will remain.<br />
<br />
To be clear -- when we are doing compatibility testing with new versions of the Android platform, if we have an app that is breaking and see anywhere it is using private APIs, we stop testing it and consider it a broken app, end of story. You have a very good chances of painfully shooting yourself in the foot by using private APIs.</blockquote><br />
P.S.: Я не претендую на истину в последней инстанции, возможно есть более человеческие способы доступа к выделению в webView, но я их не нашёл. Буду благодарен, если подскажете что-нибудь ещё.Anonymoushttp://www.blogger.com/profile/07767399673328608941noreply@blogger.com3tag:blogger.com,1999:blog-4500300389891277391.post-84908294381161525702011-09-13T19:19:00.000+04:002011-09-28T00:10:12.358+04:00Справочно-правовая система Право.ruСегодня наконец-то вышла версия мобильного приложения СПС «<a href="http://docs.pravo.ru/" style="color: #6da3bd;">Право.ru</a>». Теперь все кодексы, федеральные законы, указы и иные нормативные акты всегда под рукой в красивом приложении с user-friendly интерфейсом…<br />
<br />
Основа приложения была написана мной еще полгода назад, но позже я перешёл в другую компанию, и дорабатывалось приложение другими разработчиками.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://i5.pixs.ru/storage/2/0/4/ScreensApn_8767223_2961204.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="270" src="http://i5.pixs.ru/storage/2/0/4/ScreensApn_8767223_2961204.png" width="400" /></a></div><a name='more'></a><br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://i5.pixs.ru/storage/2/5/2/ScreensDpn_2189579_2961252.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="270" src="http://i5.pixs.ru/storage/2/5/2/ScreensDpn_2189579_2961252.png" width="400" /></a></div><br />
Обзор на хабре: <a href="http://habrahabr.ru/company/pravo/blog/128257/">http://habrahabr.ru/company/pravo/blog/128257/</a><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://habrastorage.org/storage1/48713f74/90496a23/b7f41d3b/f19e14b1.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="135" src="http://habrastorage.org/storage1/48713f74/90496a23/b7f41d3b/f19e14b1.gif" width="135" /></a></div><br />
Ссылка на маркет: <a href="http://market.android.com/details?id=com.parcsis.asps">http://market.android.com/details?id=com.parcsis.asps</a>Anonymoushttp://www.blogger.com/profile/07767399673328608941noreply@blogger.com0tag:blogger.com,1999:blog-4500300389891277391.post-77663578443477066642011-09-13T18:17:00.000+04:002011-09-27T18:10:57.804+04:00Отображение индикатора ошибки в EditTextСегодня я узнал, что в EditText можно очень просто отобразить индикатор ошибки и разъясняющий текст. Выглядит это так:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7qbQvrt00uXXUUmPoQPt8C0fViy7hj68Q5x3DfBxr5HpQTq8aGJKbc2geRMPUE268N3yaYS-iQDjkKFW9WfGPFVOnNdms8wzx7b3xcrw-H3KDM7CcxNFlHpRjn5r-1EmaRQPWt-ftrA/s1600/device-2011-09-13-180155.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7qbQvrt00uXXUUmPoQPt8C0fViy7hj68Q5x3DfBxr5HpQTq8aGJKbc2geRMPUE268N3yaYS-iQDjkKFW9WfGPFVOnNdms8wzx7b3xcrw-H3KDM7CcxNFlHpRjn5r-1EmaRQPWt-ftrA/s320/device-2011-09-13-180155.png" /></a></div><a name='more'></a><br />
Текст с описанием ошибки отображается при получении EditText'ом фокуса.<br />
<br />
Делается это вызовом метода <a href="http://developer.android.com/reference/android/widget/TextView.html#setError(java.lang.CharSequence)">setError(CharSequence)</a>. Перегруженного метода, принимающего идентификатор ресурса нет, но это легко обходится вызовом getString(int). Сбрасывается индикатор ошибки вызовом setError(null).<br />
<br />
В документации написано, что при любом изменении текста ошибка сбрасывается, однако это не так, по крайней мере на моём устройстве. Поэтому лучше <a href="http://sergey-glotov.blogspot.com/2010/09/edittext.html">подключить TextWatcher</a> и сбрасывать ошибку в null вручную.Anonymoushttp://www.blogger.com/profile/07767399673328608941noreply@blogger.com0tag:blogger.com,1999:blog-4500300389891277391.post-58462294270785980942011-09-13T14:24:00.000+04:002011-09-27T18:10:05.517+04:00Отладка через WiFiКак известно, отладка приложений под Android требует подключения устройства через USB-кабель. Однако, недавно я узнал, что кабель вовсе не обязателен. Всё, что для этого нужно - это рутованный девайс и общая WiFi сеть между устройством и компьютером. Рутованный девайс, доступный через сеть, может быть не для всех приемлемым по соображениям безопасности. В любом случае, я бы не стал пользоваться этим способом в публичных сетях.<br />
<a name='more'></a><br />
<b>Как это сделать.</b> Понадобится установить на устройство приложение <a href="https://market.android.com/details?id=siir.es.adbWireless">adbWireless</a>, которое и позволяет подключаться к девайсу через adb. Запускаем приложение (возможно, оно попросит root-привилегий, естественно, их надо разрешить) и нажимаем большую кнопку. <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLs6ES262ze53btOlmp_Ux-voKhv3zrcbpmhvna77uzWjZiLycXiZmY2FbbsKf3iBKn3ztkgzEH1pq1FYdCLF9z1CGn-qNe1ghpvfvxVpdY0kLRol_0p-jiitdNlk9oAMzQ_abfCJs6Q/s1600/device-2011-09-13-134317.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="400" width="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLs6ES262ze53btOlmp_Ux-voKhv3zrcbpmhvna77uzWjZiLycXiZmY2FbbsKf3iBKn3ztkgzEH1pq1FYdCLF9z1CGn-qNe1ghpvfvxVpdY0kLRol_0p-jiitdNlk9oAMzQ_abfCJs6Q/s1600/device-2011-09-13-134317.png" /></a></div>Выведется подсказка по дальнейшим действиям "adb connect 192.168.1.5:5555", что и нужно выполнить в консоли (adb находится в каталоге "android_sdk/platform-tools"). <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJA8Riv3H7OrFvn5H95GrXQ1wkyP2pIt_qkmhkgilcrqVs-DBF0x8jtBB1K9nFFFSM-HrTN_04viFtvasUosmFd-i7-YDtJtUUAkHIK5IOgFrY0HDYC_8lHSr6zvLLdzoOmB1Ic1R7cw/s1600/Screenshot.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="206" width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJA8Riv3H7OrFvn5H95GrXQ1wkyP2pIt_qkmhkgilcrqVs-DBF0x8jtBB1K9nFFFSM-HrTN_04viFtvasUosmFd-i7-YDtJtUUAkHIK5IOgFrY0HDYC_8lHSr6zvLLdzoOmB1Ic1R7cw/s320/Screenshot.png" /></a></div>Чтобы убедиться в успешном подключении можно воспользоваться командой adb devices.</br> Этот способ прекрасно работает в Eclipse - приложение загружается на телефон, все команды отладки выполняются. Батарея сверх меры не разряжается. В общем, теперь это основной способ подключения устройства для меня.</br> Найдено в <a href="http://www.jessechen.net/blog/debugging-your-android-app-wirelessly-on-an-android-smartphone/" >блоге Jesse Chen</a>. Anonymoushttp://www.blogger.com/profile/07767399673328608941noreply@blogger.com6tag:blogger.com,1999:blog-4500300389891277391.post-21924773502816330092011-07-07T11:36:00.000+04:002011-08-27T03:46:58.975+04:00Поиск кириллицы в файлах проектаКонечно, все строки надо выносить в ресурсы. Так и стараюсь делать, но бывает, что в спешке оставляю в коде, да и другие разработчики в команде иногда забывают.<br />
<br />
Тем не менее под linux'ом легко найти все файлы, где остались строковые ресурсы. Делается это одной командой: <br />
grep -nirE --exclude-dir="gen" --exclude-dir="bin" "[а-я]" /path/to/project/<br />
<br />
-n включает отображение номеров строк в выводе<br />
-i игнорирование регистра символов<br />
-r рекурсивный поиск по всем файлам и директориям<br />
-E указывает на то, что шаблон задан в виде регулярного выражения (extended regexp)<br />
--exclude-dir задаёт директории, в которых поиск производить не нужно. Помимо bin и gen, cюда можно включить .svn или .git (конечно, если вы используете соответствующую VCS), а также каталоги assets, lib и raw (ничего полезного в применении к нашей задаче там не найдётся).Anonymoushttp://www.blogger.com/profile/07767399673328608941noreply@blogger.com0tag:blogger.com,1999:blog-4500300389891277391.post-33461755938479269502011-07-01T19:22:00.000+04:002011-09-28T00:07:18.398+04:00SellobySelloby - мобильный сервис частных объявлений для быстрого и увлекательного поиска всего на свете: для покупки и продажи вещей, аренды квартир, поиска работы, знакомств и развлечений.<br />
<br />
Написано мной в команде с двумя разработчиками.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://ssl.gstatic.com/android/market/com.parcsis.aCeller/ss-320-0-3" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://ssl.gstatic.com/android/market/com.parcsis.aCeller/ss-320-0-3" width="213" /></a><a href="https://g0.gstatic.com/android/market/com.parcsis.aCeller/ss-320-2-3" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://g0.gstatic.com/android/market/com.parcsis.aCeller/ss-320-2-3" width="213" /></a></div><a name='more'></a><br />
Features:<br />
<ul><li>Геолокация</li>
<li>Интеграция с Facebook и Twitter</li>
<li>Hashtags: 4 базовых символа (#объект, !действие, $цена и @город) позволят сократить время создания объявления до 30 секунд.</li>
</ul>Объявления публикуются мгновенно, никакой премодерации или регистрации - можно публиковать объявления анонимно.<br />
Умная система настроек и подписок позволяет задать самый точный поиск - можно создать собственные кастомные фильтры, указав в них все необходимые условия - предмет поиска, город, диапазон цен, а также любые свои условия.<br />
Эффективная блокировка спама - любое спам-объяление можно заблокировать. Блокируя объявление, пользователь автоматически блокирует устройство спамера.<br />
Быстрая обратная связь - задать вопрос, получить ответ, обсудить условия и договориться о встрече можно не выходя из приложения - для этого есть внутренний мессенджер и возможность позвонить по конкретному объявлению.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://qrcode.kaywa.com/img.php?s=6&d=http%3A%2F%2Fmarket.android.com%2Fdetails%3Fid%3Dcom.parcsis.aCeller" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://qrcode.kaywa.com/img.php?s=6&d=http%3A%2F%2Fmarket.android.com%2Fdetails%3Fid%3Dcom.parcsis.aCeller" /></a></div><br />
<br />
Ссылка на маркет: <a href="http://market.android.com/details?id=com.parcsis.aCeller">http://market.android.com/details?id=com.parcsis.aCeller</a><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/w74qW39kV5Y?feature=player_embedded' frameborder='0'></iframe></div><br />
Anonymoushttp://www.blogger.com/profile/07767399673328608941noreply@blogger.com3tag:blogger.com,1999:blog-4500300389891277391.post-49806905883358566822010-11-29T18:05:00.001+03:002010-11-29T18:25:29.127+03:00Как проверить доступность интернета<div class="post-text">Неоднократно на просторах интернета встречал примеры по теме проверки доступности интернета на устройстве. В них обычно создавали подключение к какому-нибудь сайту и ловили исключения. Если всё прошло без исключения, значит интернет доступен.<br />
<br />
По моему мнению, это неверно. Можно использовать стандартные методы из SDK. Конкретнее, класс <a href="http://developer.android.com/reference/android/net/ConnectivityManager.html">ConnectivityManager</a>. Он как раз и предназначен для получения информации об активных подключениях.<br />
<br />
<a name='more'></a><br />
Для использования класса необходимо добавить разрешение android.permission.ACCESS_NETWORK_STATE в манифест.<br />
Данный класс можно использовать, например, так (проверка доступности мобильного интернета):<br />
<blockquote><code><font size="2" face="Courier New" color="black"><font color="#2B91AF">String</font> cs = Context.CONNECTIVITY_SERVICE;<br />
ConnectivityManager cm = (ConnectivityManager)<br />
getSystemService(cs);<br />
cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); </font><br />
<br />
<font size="1" color="gray">* This source code was highlighted with <a href="http://virtser.net/blog/post/source-code-highlighter.aspx"><font size="1" color="gray">Source Code Highlighter</font></a>.</font></code></blockquote>или так (проверка доступности WiFi): <br />
<blockquote><code><font size="2" face="Courier New" color="black"><font color="#2B91AF">String</font> cs = Context.CONNECTIVITY_SERVICE;<br />
ConnectivityManager cm = (ConnectivityManager)<br />
getSystemService(cs);<br />
cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);</font><br />
<br />
<font size="1" color="gray">* This source code was highlighted with <a href="http://virtser.net/blog/post/source-code-highlighter.aspx"><font size="1" color="gray">Source Code Highlighter</font></a>.</font></code></blockquote>и проверить состояние DetailedState возвращаемого объекта NetworkInfo.<br />
<br />
Для проверки доступности конкретного хоста можно использовать следующий код:<br />
<blockquote><code><font size="2" face="Courier New" color="black"><font color="#2B91AF">String</font> cs = Context.CONNECTIVITY_SERVICE;<br />
ConnectivityManager cm = (ConnectivityManager)<br />
getSystemService(cs);<br />
cm.requestRouteToHost(TYPE_WIFI, <font color="#0000ff">int</font> hostAddress);</font><br />
<br />
<font size="1" color="gray">* This source code was highlighted with <a href="http://virtser.net/blog/post/source-code-highlighter.aspx"><font size="1" color="gray">Source Code Highlighter</font></a>.</font></code></blockquote>где hostAddress - IP адрес хоста.<br />
<br />
Ну а если совсем всё упростить, то можно воспользоваться примерно таким методом:<br />
<blockquote><code><span style="color: black; font-family: Courier New; font-size: 2;"><span style="color: blue;">public</span> boolean isOnline() {<br />
<span style="color: #2b91af;">String</span> cs = Context.CONNECTIVITY_SERVICE;<br />
ConnectivityManager cm = (ConnectivityManager)<br />
getSystemService(cs);<br />
<span style="color: blue;">if</span> (cm.getActiveNetworkInfo() == <span style="color: blue;">null</span>) {<br />
<span style="color: blue;">return</span> <span style="color: blue;">false</span>;<br />
}<br />
<span style="color: blue;">return</span> cm.getActiveNetworkInfo().isConnectedOrConnecting();<br />
}</span><br />
<br />
<span style="color: grey; font-size: xx-small;">* This source code was highlighted with <a href="http://virtser.net/blog/post/source-code-highlighter.aspx"><span style="color: grey; font-size: xx-small;">Source Code Highlighter</span></a>.</span></code></blockquote></div>Anonymoushttp://www.blogger.com/profile/07767399673328608941noreply@blogger.com4tag:blogger.com,1999:blog-4500300389891277391.post-82250118452688036292010-10-19T16:41:00.002+04:002011-09-28T00:09:40.691+04:00Картотека арбитражных дел<div class="separator" style="clear: both; text-align: center;"><a href="http://habreffect.ru/files/489/2b238056e/splash.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://habreffect.ru/files/489/2b238056e/splash.png" width="182" /></a></div><br />
<b>Описание:</b><br />
«Картотека арбитражных дел» представляет полную информацию о делах, рассматриваемых во всех 113 арбитражных судах России. Данные о движении дел обновляются каждый час. Уже сейчас вы можете получить доступ к нескольким миллионам судебных дел.<br />
<a name='more'></a><br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://habreffect.ru/files/ed8/e4737470c/screen_05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="242" src="http://habreffect.ru/files/ed8/e4737470c/screen_05.png" width="400" /></a></div><br />
Приложение написано полностью мной, в одиночку.<br />
<br />
Обзор на хабре: <a href="http://habrahabr.ru/company/pravo/blog/106210/">http://habrahabr.ru/company/pravo/blog/106210/</a><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://qrcoder.ru/code/?market%3A%2F%2Fdetails%3Fid%3Dcom.parcsis.kad&6&0" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://qrcoder.ru/code/?market%3A%2F%2Fdetails%3Fid%3Dcom.parcsis.kad&6&0" /></a></div><br />
Ссылка на маркет: <a href="https://market.android.com/details?id=com.parcsis.kad">https://market.android.com/details?id=com.parcsis.kad</a><br />
<br />
Для тех, у кого нет маркета либо по каким-то причинам приложение не находится там, можно скачать тут: <a href="http://4pda.ru/forum/index.php?showtopic=194053">http://4pda.ru/forum/index.php?showtopic=194053</a>Anonymoushttp://www.blogger.com/profile/07767399673328608941noreply@blogger.com0tag:blogger.com,1999:blog-4500300389891277391.post-85165236850515514112010-09-29T12:18:00.000+04:002011-09-13T18:18:05.472+04:00Ellipsize и TextViewНе секрет, что у мобильных устройств экран невелик, и поэтому часто длинный текст не умещается на экране целиком. Можно на это забить и оставить текст обрезанным либо можно поставить многоточие на месте обрезки (см. рисунок). Для этого есть метод setEllipsize() и соответствующий ему атрибут android:ellipsize.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd5bN31jgZnr2ojkoZ6tSvlMoaPx_nSeHS9aSr0VNU9v5JlXZzUxaI1ZSLXM6f3TXH3KxCVEOnr2fJltzvJH_oXFZnyNZzhN8hrRqhK24UA62FCy-ZyqTs-m5dKhVDfFMFSch3uzT53Q/s1600/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="96" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd5bN31jgZnr2ojkoZ6tSvlMoaPx_nSeHS9aSr0VNU9v5JlXZzUxaI1ZSLXM6f3TXH3KxCVEOnr2fJltzvJH_oXFZnyNZzhN8hrRqhK24UA62FCy-ZyqTs-m5dKhVDfFMFSch3uzT53Q/s320/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA.png" width="320" /></a></div><br />
<br />
Всё бы хорошо, но при попытке применения их я столкнулся с неожиданным поведением метода setEllipsize() у TextView: для однострочного текста из нескольких слов метод не работает. Строка обрезается, но многоточие в конце не появляется. То же самое и с XML-атрибутом android:ellipsize. Вот так это выглядит:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi23gJR7KsmJkiwfAk0jywHFdysc7k1VimdTYHUIzpA2DgAa_UBLSCRfm6jlQ0S_8LDsoB5Q1A1UfkwDGLJlH2O2RlxW-wquQ6VOrpzCjY6VnVzZFo1PpGIGHGLyWdw2AGulp-ZcK81Sg/s1600/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="48" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi23gJR7KsmJkiwfAk0jywHFdysc7k1VimdTYHUIzpA2DgAa_UBLSCRfm6jlQ0S_8LDsoB5Q1A1UfkwDGLJlH2O2RlxW-wquQ6VOrpzCjY6VnVzZFo1PpGIGHGLyWdw2AGulp-ZcK81Sg/s320/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA-2.png" width="320" /></a></div><br />
Можно заметить, что метод работает, но работает неверно: неуместившийся остаток текста просто отбрасывается.<br />
<br />
Выяснил, что это давний баг, который не исправляется в течение двух лет. В багтрекере андроида есть соответствующие записи: <a href="http://code.google.com/p/android/issues/detail?id=882">http://code.google.com/p/android/issues/detail?id=882</a> и <a href="http://code.google.com/p/android/issues/detail?id=10554">http://code.google.com/p/android/issues/detail?id=10554</a><br />
<br />
Одним из вариантов обхода бага является установка атрибута android:singleLine="true", но он объявлен deprecated (хотя и замечательно работает до сих пор).<br />
Другой обходной путь - имитировать поведение атрибута android:singleLine другими атрибутами: android:lines="1" и android:scrollHorizontally="true".<br />
<br />
Советую пройти в <a href="http://code.google.com/p/android/issues/detail?id=10554">багтрекер</a> и проголосовать за баг. Может его и исправят когда-нибудь.Anonymoushttp://www.blogger.com/profile/07767399673328608941noreply@blogger.com0tag:blogger.com,1999:blog-4500300389891277391.post-34537534282695506132010-09-20T16:29:00.001+04:002010-09-20T16:42:37.487+04:00Получение числа непрочитанных СМСОтвечал на вопросы на StackOverflow и среди них попался вопрос по теме поста. Как ни странно, в документации этот вопрос не освещён. Путём исследования исходников Андроида нашёл решение, оказалось, что это несложно.<br />
<br />
<br />
Требуется выполнить простой запрос к SMS ContentProvider. Код будет выглядеть так:<br />
<br />
<code></code><br />
<blockquote><code><span style="color: black; font-family: Courier New; font-size: x-small;"></span></code><br />
<ol><span style="color: black; font-family: Courier New; font-size: x-small;">
<li>final <span style="color: #2b91af;">Uri</span> SMS_INBOX = <span style="color: #2b91af;">Uri</span>.parse(<span style="color: #a31515;">"content://sms/inbox"</span>);</li>
<li> </li>
<li>Cursor c = getContentResolver().query(SMS_INBOX, <span style="color: blue;">null</span>, <span style="color: #a31515;">"read = 0"</span>, <span style="color: blue;">null</span>, <span style="color: blue;">null</span>);</li>
<li><span style="color: blue;">int</span> unreadMessagesCount = c.getCount();</li>
<li>c.deactivate();</li>
</span></ol><span style="color: grey; font-size: xx-small;">* This source code was highlighted with <a href="http://virtser.net/blog/post/source-code-highlighter.aspx"><span style="color: grey; font-size: xx-small;">Source Code Highlighter</span></a>.</span></blockquote><br />
Условие прочтения сообщения задаётся в третьей строке параметром "read = 0", для получения числа прочитанных сообщений нужно заменить 0 на 1.Anonymoushttp://www.blogger.com/profile/07767399673328608941noreply@blogger.com0tag:blogger.com,1999:blog-4500300389891277391.post-12426029475365278642010-09-16T17:03:00.000+04:002011-09-13T18:17:57.850+04:00Отслеживание изменений в EditTextВ компоненте EditText, использующемся для редактирования текста, как нетрудно догадаться, нет методов позволяющих отслеживать изменение текста в поле ввода. Но реализовать этот функционал конечно же возможно.<br />
<br />
Для отслеживания изменений в EditText нужно создать класс, реализующий интерфейс TextWatcher. Интерфейс содержит определения методов afterTextChanged, beforeTextChanged, onTextChanged, вызываемых соответственно после изменения текста, перед изменением и собственно во время изменения. Затем этот класс нужно зарегистрировать для отслеживаемого контрола EditText при помощи метода addTextChangedListener().<br />
<br />
Рассмотрим на примере. Имеется несколько EditText'ов. Изначально видимым является только один, остальные скрыты. Требуется отслеживать в них изменения и при условии наличия текста в первом, показывать второй контрол, и наоборот, при условии отсутствия текста в первом контроле скрывать второй. Реализуется это несложным кодом:<br />
<br />
<blockquote><code><span style="color: black; font-family: Courier New; font-size: x-small;"> <span style="color: blue;">private</span> <span style="color: blue;">class</span> Watcher implements TextWatcher {<br />
<span style="color: blue;">protected</span> EditText linkedView;<br />
<br />
<span style="color: blue;">public</span> Watcher(EditText linkedView) {<br />
<span style="color: blue;">this</span>.linkedView = linkedView;<br />
}<br />
<br />
<span style="color: blue;">public</span> <span style="color: blue;">void</span> afterTextChanged(Editable s) {<br />
<span style="color: blue;">if</span> (s.length() > 0) {<br />
linkedView.setVisibility(View.VISIBLE);<br />
} <span style="color: blue;">else</span> {<br />
linkedView.setVisibility(View.GONE);<br />
}<br />
}<br />
<br />
<span style="color: blue;">public</span> <span style="color: blue;">void</span> beforeTextChanged(CharSequence s, <span style="color: blue;">int</span> start, <span style="color: blue;">int</span> count, <span style="color: blue;">int</span> after) { }<br />
<span style="color: blue;">public</span> <span style="color: blue;">void</span> onTextChanged(CharSequence s, <span style="color: blue;">int</span> start, <span style="color: blue;">int</span> before, <span style="color: blue;">int</span> count) { }<br />
};<br />
<br />
participantEdits[0].addTextChangedListener(<span style="color: blue;">new</span> Watcher(participantEdits[1]));</span><br />
<br />
<span style="color: grey; font-size: xx-small;">* This source code was highlighted with <a href="http://virtser.net/blog/post/source-code-highlighter.aspx"><span style="color: grey; font-size: xx-small;">Source Code Highlighter</span></a>.</span></code></blockquote><br />
<br />
Код довольно прост: отлавливаем событие после изменения текста и в зависимости от длины текста скрываем или отображаем привязанный контрол.Anonymoushttp://www.blogger.com/profile/07767399673328608941noreply@blogger.com0tag:blogger.com,1999:blog-4500300389891277391.post-14361898567400088702010-07-27T16:07:00.002+04:002010-09-16T17:10:12.843+04:00Непрограммные примеры шаблонов проектирования программного обеспеченияПеревод статьи <a href="http://translated.by/you/authors/1886/">Michael Duell</a>, “<a href="http://translated.by/you/non-software-examples-of-software-design-patterns/original/">Non-Software Examples of Software Design Patterns</a>”,<br />
<br />
<a href="http://www.cours.polymtl.ca/inf3700/divers/nonSoftwareExample/patexamples.html">Оригинал</a>.<br />
<div class="fragment">Перевод взят <a href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/">отсюда</a>.<br />
<br />
<div style="font-weight: bold;">Аннотация</div></div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=1#part713053" name="part713053"><span class="p-s-"></span></a><br />
<div class="fragment">Шаблоны проектирования программного обеспечения уходят корнями в архитектурные шаблоны Кристофера Александера, и в вопросы перехода к объектам. Согласно Александеру, шаблоны повторяют самих себя, поскольку они являются обобщенным решением для задаваемой системы сил. Вопросы перехода к объектам рассматривается в реальном мире для того, чтобы проникнуть в суть взаимоотношений при моделировании программного обеспечения. С такими двойственными корнями, вполне логичным будет найти повторяемость шаблонов проектирования программного обеспечения в объектах реального мира. В этой статье представлен реальный мир, не программные экземпляры каждого шаблона проектирования из книги "Приемы объектно-ориентированного проектирования. Паттерны проектирования" [13]. В статье также приводятся выводы о не программных примерах как эффективной основе языка шаблонов для взаимообщения и обучения проектированию шаблонов.<br />
<br />
<a name='more'></a> </div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=1#part713054" name="part713054"><span class="p-s-"></span></a><br />
<div class="fragment" style="font-weight: bold;">1. Введение</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=1#part713055" name="part713055"><span class="p-s-"></span></a><br />
<div class="fragment">В индустрии программного обеспечения существует растущее сообщество сторонников применения шаблонов. Корни перехода к шаблонам можно найти в работах архитектора Кристофера Александера, который описывал шаблоны как обобщенное решение для задаваемой системы сил в мире [1]. Шаблоны Александера можно обнаружить в повседневных структурах. Каждый из шаблонов в "Языке шаблонов" [2], включает в себя картину архетипического примера шаблона.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=1#part713056" name="part713056"><span class="p-s-"></span></a><br />
<div class="fragment">Поскольку объекты были преобладающим взглядом на мир в то время, когда мир программного обеспечения знакомился с шаблонами, они тоже имеют корни в переходе к объектам [9]. К сожалению примеров шаблонов моделирования программного обеспечения было не так много как у Александера, а они представляли собой более элегантные модели, в отличие от моделей, что люди генерировали в самом начале [13]. Доступ к элегантным моделям часто ограничивался в связи с проприетарным характером большей части программного обеспечения, разработанного сегодня.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=1#part713057" name="part713057"><span class="p-s-"></span></a><br />
<div class="fragment">Согласно Александеру, реальный мир шаблонов всегда повторяет самого себя, поскольку в соответствии с заданным набором обстоятельств, всегда существует определенные поля взаимосвязей, которые являются наиболее хорошо приспособленными к силам, которые уже существуют [1]. В программном обеспечении, задачи реального мира либо моделируются целиком, либо объекты реального мира сводят к аппаратному программному обеспечению, а программы выводят результаты реального мира [5]. Поскольку шаблоны моделирования программного обеспечения имеют корни как в шаблонах Александера, так и в вопросах перехода к объектам, представляется вполне логичным, что шаблоны моделирования программного обеспечения могут быть найдены и в объектах реального мира. Это не означает, что шаблонам моделирования программного обеспечения необходимы модели объектов реального мира, но взаимосвязи между объектами, которые приспособлены для работы с определенными силами, могут быть обнаружены как в "реальном мире", так и в объектах программного обеспечения. Чтобы проверить эту гипотезу, были найдены примеры из реального мира для каждого из 23 шаблонов "Банды Четырех" [13]. Эти примеры приводятся далее в разделах со 2 по 4. </div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=2#part713058" name="part713058"><span class="p-s-"></span></a><br />
<div class="fragment" style="font-weight: bold;">2. Порождающие шаблоны</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=2#part713059" name="part713059"><span class="p-s-"></span></a><br />
<div class="fragment">Пять порождающих шаблонов были задокументированы группой авторов, называвших себя "Бандой Четырех". Примеры таких порождающих шаблонов могут быть найдены в обрабатывающей промышленности, на предприятиях быстрого питания, в биологии и в политических институтах.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=2#part713060" name="part713060"><span class="p-s-"></span></a><br />
<div class="fragment" style="font-weight: bold;">2.1 Пример "Абстрактной фабрики"</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=2#part713061" name="part713061"><span class="p-s-"></span></a><br />
<div class="fragment">Целью "Абстрактной фабрики" является предоставление интерфейса для создания семейств связанных объектов, без указания конкретных классов. Этот шаблон можно соотнести с оборудованием для штамповки из листового металла, используемого при производстве японских автомобилей. Штамповочное оборудование является "Абстрактной фабрикой", которая создает части корпуса автомобиля. Один и тот же механизм используется для штамповки правых дверей, левых дверей, правых передних крыльев, левых передних крыльев, капота и т.п. у различных моделей машин. С помощью роликов для изменения формы штампа, конкретные классы производятся механизмами, которые могут изменяться за три минуты [16].</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=2#part713062" name="part713062"><span class="p-s-"></span></a><br />
<div class="fragment"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFedQz41qGOlELHcDK83yEinp4tnjkZ_6nw0EedERKGPqgakqpiT1eEV6be_DHaTnr-BoQzIef_DK5T0AWgH2GNxUOarntj0ALh8VDnnYQjNuqpgK8N1bq7_97XMJtwFJIRyzKfpep4g/s1600/pateximg1.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5498558151701970994" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFedQz41qGOlELHcDK83yEinp4tnjkZ_6nw0EedERKGPqgakqpiT1eEV6be_DHaTnr-BoQzIef_DK5T0AWgH2GNxUOarntj0ALh8VDnnYQjNuqpgK8N1bq7_97XMJtwFJIRyzKfpep4g/s320/pateximg1.gif" style="cursor: pointer; display: block; height: 286px; margin: 0px auto 10px; text-align: center; width: 320px;" /></a><br />
Рис.1. Пример штамповки "Абстрактной фабрикой".</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=2#part713063" name="part713063"><span class="p-s-"></span></a><br />
<div class="fragment" style="font-weight: bold;">2.2 Пример "Строителя"</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=2#part713064" name="part713064"><span class="p-s-"></span></a><br />
<div class="fragment">Шаблон "Строитель" отделяет построение сложного объекта от его представления так, что одно и то же построение процесса может создавать различные представления. Этот шаблон применяется ресторанами быстрого питания для комплектования детского меню. Детское питание обычно состоит из главного блюда, гарнира, напитка и игрушки (например, гамбургер, картофель фри, кока-кола и автомобильная игрушка). Заметьте, что в содержание детского меню могут вводиться вариации, но процесс комплектования остается одинаковым. Заказывает ли потребитель гамбургер, чизбургер или курицу — процесс один и тот же. Работник за прилавком указывает команде собрать главное блюдо, гарнир и игрушку. Эти предметы помещаются в пакет. Напиток наливается в чашку и ставится рядом с пакетом. Этот же самый процесс используется и конкурирующими ресторанами.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=2#part713065" name="part713065"><span class="p-s-"></span></a><br />
<div class="fragment"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTDPYvuuUXE5RF3Jrb5-MdBLPsDKM_w4ELKk_wn5e0Q2NtyPlRtS4_z34yrzWGc24DpD-OcPHuLjLDpagpPt1beDVfWxIxBZgezpDJllB_LPgYaUZxd2fnWGzxSL4ObWeRH3YbDTyH9A/s1600/pateximg2.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5498558160667303346" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTDPYvuuUXE5RF3Jrb5-MdBLPsDKM_w4ELKk_wn5e0Q2NtyPlRtS4_z34yrzWGc24DpD-OcPHuLjLDpagpPt1beDVfWxIxBZgezpDJllB_LPgYaUZxd2fnWGzxSL4ObWeRH3YbDTyH9A/s320/pateximg2.gif" style="cursor: pointer; display: block; height: 260px; margin: 0px auto 10px; text-align: center; width: 320px;" /></a><br />
Рис.2. Диаграмма взаимодействий объектов для "Строителя" на примере комплектования детского меню.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=2#part713066" name="part713066"><span class="p-s-"></span></a><br />
<div class="fragment" style="font-weight: bold;">2.3 Пример "Фабричного метода"</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=2#part713067" name="part713067"><span class="p-s-"></span></a><br />
<div class="fragment">"Фабричный метод" задает интерфейс для создания объектов, но оставляет подклассам решать, какие именно классы будут создавать экземпляры. Отливка формовочного пресса демонстрирует такой шаблон. Производители пластмассовых игрушек подвергают обработке пластмассовый формовочный порошок, и заливая пластмассу в пресс, придают ей желаемую форму [15]. Класс игрушки (автомобиль, фигурка и т.п.) определяется прессом.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=3#part713068" name="part713068"><span class="p-s-"></span></a><br />
<div class="fragment"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHDQj4XtUNEJ1lhwU1aoC3pjZHS1KBaYf_hH9AWRutv0XK3-7CWK6u-1Y1PGOO1Vj1w8abcYwnRiXy9Ta1eAAdp924lQApQ5ojPtdD-cLBLnHq6w6rVU0U_WkyPbA5vMAf6DtKO5abEQ/s1600/pateximg3.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5498558164769241202" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHDQj4XtUNEJ1lhwU1aoC3pjZHS1KBaYf_hH9AWRutv0XK3-7CWK6u-1Y1PGOO1Vj1w8abcYwnRiXy9Ta1eAAdp924lQApQ5ojPtdD-cLBLnHq6w6rVU0U_WkyPbA5vMAf6DtKO5abEQ/s320/pateximg3.gif" style="cursor: pointer; display: block; height: 320px; margin: 0px auto 10px; text-align: center; width: 319px;" /></a><br />
Рис.3. Объектная диаграмма для "Фабричного метода" на примере отливки формы.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=3#part713069" name="part713069"><span class="p-s-"></span></a><br />
<div class="fragment" style="font-weight: bold;">2.4 Пример "Прототипа"</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=3#part713070" name="part713070"><span class="p-s-"></span></a><br />
<div class="fragment">Шаблон "Прототип" задает вид создаваемых объектов, используя прототипичный экземпляр. Прототипы новых продуктов часто собирают еще до полноценного производства, но в таком примере прототип является пассивным, и он не участвует в копировании самого себя. Митотическое деление клетки, которое порождает две одинаковых клетки, является примером прототипа, играющего активную роль в копирования себя самого и, таким образом, демонстрирует шаблон "Прототип". Когда клетка делится, в результате появляются две клетки идентичного генотипа. Другими словами, клетка клонирует саму себя.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=3#part713071" name="part713071"><span class="p-s-"></span></a><br />
<div class="fragment"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTee1kxYGfV6tz-ymlFz1a2v2IipFcM_IwvrEIXya832wGEwrZmqh4GgJzp553cWL7yslcYKbq9Nrk7kQe-eQ-4K5bZ6voMf952Fe_2FgjA-V7EJ5C44Linh7Ey5raZnzHp_t5doChKw/s1600/pateximg4.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5498558169765776162" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTee1kxYGfV6tz-ymlFz1a2v2IipFcM_IwvrEIXya832wGEwrZmqh4GgJzp553cWL7yslcYKbq9Nrk7kQe-eQ-4K5bZ6voMf952Fe_2FgjA-V7EJ5C44Linh7Ey5raZnzHp_t5doChKw/s320/pateximg4.gif" style="cursor: pointer; display: block; height: 207px; margin: 0px auto 10px; text-align: center; width: 320px;" /></a><br />
Рис.4. Объектная диаграмма для "Прототипа" на примере деления клетки.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=3#part713072" name="part713072"><span class="p-s-"></span></a><br />
<div class="fragment" style="font-weight: bold;">2.5 Пример "Одиночки"</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=3#part713073" name="part713073"><span class="p-s-"></span></a><br />
<div class="fragment">Шаблон "Одиночка" гарантирует, что класс имеет лишь один экземпляр, и обеспечивает глобальную точку доступа к этому экземпляру. Шаблон "Одиночка" назван в честь одиночного множества, которое определяется множеством, содержащим один элемент. Офис Президента Соединенных Штатов является "Одиночкой". Конституция Соединенных Штатов определяет механизмы, посредством которых избирается президент, ограничивает срок его пребывания в должности и задает порядок преемственности. В результате, в любой момент времени не может оказаться более одного президента. Независимо от конкретной личности действующего президента, звание Президента Соединенных Штатов является глобальной точкой доступа, которое конкретизирует личность в офисе.<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqcKAwGERya6zcmi9FfL96jSNM7u8s4hAx_dWVCj9melELgW182KChu3qUSsj2UPuz0v_5HRsT_EK9iR7NcCq2-aVt3Or6mxBBuFt5UwByQP7rrmji8qRdOWXVYpGNUsh5DkB1XYC8-g/s1600/pateximg5.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5498559589026969426" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqcKAwGERya6zcmi9FfL96jSNM7u8s4hAx_dWVCj9melELgW182KChu3qUSsj2UPuz0v_5HRsT_EK9iR7NcCq2-aVt3Or6mxBBuFt5UwByQP7rrmji8qRdOWXVYpGNUsh5DkB1XYC8-g/s320/pateximg5.gif" style="cursor: pointer; display: block; height: 141px; margin: 0px auto 10px; text-align: center; width: 320px;" /></a></div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=3#part713074" name="part713074"><span class="p-s-"></span></a><br />
<div class="fragment">Рис.5. Объектная диаграмма для "Одиночки" на примере Института Президентства.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=3#part713075" name="part713075"><span class="p-s-"></span></a><br />
<div class="fragment" style="font-weight: bold;">3. Структурные шаблоны</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=3#part713076" name="part713076"><span class="p-s-"></span></a><br />
<div class="fragment">Семь структурных шаблонов были задокументированы "Бандой Четырех". Примеры таких шаблонов могут быть найдены в ручных инструментах, проводке в зданиях, математике, праздновании традиций, торговых каталогах и в банковском деле.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=3#part713077" name="part713077"><span class="p-s-"></span></a><br />
<div class="fragment" style="font-weight: bold;">3.1 Пример "Адаптера"</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=3#part713078" name="part713078"><span class="p-s-"></span></a><br />
<div class="fragment">Шаблон "Адаптер" позволяет в случае несовместимых классов работать им вместе, преобразуя интерфейс одного класса в интерфейс, ожидаемый клиентом. Гнездовой ключ представляет собой такой пример "Адаптера". Гнездо присоединенное к храповому механизму, обеспечивает чтобы размер насадки был точно таким же. Типичные размеры гнезд в Соединенных Штатах — 1/2" или 1/4". Очевидно, что 1/2" насадка ключа не подойдет к 1/4" насадке гнезда, если не пользоваться адаптером. 1/2" — 1/4" адаптер имеет 1/2" гнездовой контакт ("мама") для 1/2" насадки ключа, и 1/4" штыревой контакт ("папа") для 1/4" гнезда.<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgno1tnwAB-wyjfMw0EAuiNzE0WvUTPat5SqXjnLSnwQiB2mAlgAHxFABs-znQVB0YrYrbiM2apbL_W0JhT3RM4K4UlhiWXvgtZ7pOejQnkbG-ULfC7udVrBsgmElaYGBM0RIuQXN6eeg/s1600/pateximg6.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5498559899814721538" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgno1tnwAB-wyjfMw0EAuiNzE0WvUTPat5SqXjnLSnwQiB2mAlgAHxFABs-znQVB0YrYrbiM2apbL_W0JhT3RM4K4UlhiWXvgtZ7pOejQnkbG-ULfC7udVrBsgmElaYGBM0RIuQXN6eeg/s320/pateximg6.gif" style="cursor: pointer; display: block; height: 126px; margin: 0px auto 10px; text-align: center; width: 320px;" /></a></div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=4#part713079" name="part713079"><span class="p-s-"></span></a><br />
<div class="fragment">Рис.6. Объектная диаграмма для "Адаптера" на примере гнездового адаптера.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=4#part713080" name="part713080"><span class="p-s-"></span></a><br />
<div class="fragment" style="font-weight: bold;">3.2 Пример "Моста"</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=4#part713081" name="part713081"><span class="p-s-"></span></a><br />
<div class="fragment">Шаблон "Мост" отделяет абстракцию от ее реализации так, чтобы они оба могли изменяться независимо. Домашний переключатель, управляющий освещением, потолочным вентилятором и т.п. является примером "Моста". Назначением переключателя является включение или выключение устройства. Действующий переключатель может быть реализован как замыкатель цепи, как простой двухпозиционный переключатель или как переключатель реостатного типа.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=4#part713082" name="part713082"><span class="p-s-"></span></a><br />
<div class="fragment"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi56a90ir8na9PjTK6CIZyAgspWC_2QYfXfviO7Dz55cP3pkVRoxTa4GjVMAf1uj768MVri0nmrhGzQLm70DkDKqb6D9P3VpDu0wuXTmo-7RG4b5P1iXvKSUrXZvx5Lmv9k2De2oBXbdg/s1600/pateximg7.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5498559903340104178" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi56a90ir8na9PjTK6CIZyAgspWC_2QYfXfviO7Dz55cP3pkVRoxTa4GjVMAf1uj768MVri0nmrhGzQLm70DkDKqb6D9P3VpDu0wuXTmo-7RG4b5P1iXvKSUrXZvx5Lmv9k2De2oBXbdg/s320/pateximg7.gif" style="cursor: pointer; display: block; height: 224px; margin: 0px auto 10px; text-align: center; width: 320px;" /></a><br />
Рис.7. Объектная диаграмма для "Моста" на примере электрического переключателя.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=4#part713083" name="part713083"><span class="p-s-"></span></a><br />
<div class="fragment" style="font-weight: bold;">3.3 Пример "Компоновщика"</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=4#part713084" name="part713084"><span class="p-s-"></span></a><br />
<div class="fragment">"Компоновщик" сводит объекты в древовидную структуру, и позволяет клиентам обращаться к отдельным объектам и их группам одинаковым образом. "Компоновщиками" являются арифметические выражения, хотя и такой пример является абстрактным. Арифметическое выражение состоит из операнда, оператора (+-*/), и другого операнда. Операнд может быть числом или другим арифметическим выражением. То есть, 2+3 и (2+3)+(4*6), — оба выражения являются правильными.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=4#part713085" name="part713085"><span class="p-s-"></span></a><br />
<div class="fragment"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSaDsWnf7wBVPQFCaZt2G5kExKf7RvNu3Wvi1gCCgkFxSOuojAnMJ9Eq4hdsEemtoMNORs4QO9PesFOOMIFRv1g4qf3YxFWpFHT3geTlz4OSI9O-pD1mPAh8jYoBRVVV_Bq-YjSArr-A/s1600/pateximg8.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5498559913082646482" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSaDsWnf7wBVPQFCaZt2G5kExKf7RvNu3Wvi1gCCgkFxSOuojAnMJ9Eq4hdsEemtoMNORs4QO9PesFOOMIFRv1g4qf3YxFWpFHT3geTlz4OSI9O-pD1mPAh8jYoBRVVV_Bq-YjSArr-A/s320/pateximg8.gif" style="cursor: pointer; display: block; height: 237px; margin: 0px auto 10px; text-align: center; width: 320px;" /></a><br />
Рис.8. Объектная диаграмма "Компоновщика" на примере арифметического выражения.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=4#part713086" name="part713086"><span class="p-s-"></span></a><br />
<div class="fragment" style="font-weight: bold;">3.4 Пример "Декоратора"</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=4#part713087" name="part713087"><span class="p-s-"></span></a><br />
<div class="fragment">"Декоратор" динамически подключает к объектам дополнительные функции. Хотя картины могут быть повешены на стену как в рамке, так и без, рамками пользуются часто, и как раз за рамку картину вешают на стену. Перед тем как вешать, картина могут быть украшена багетом или установлены в рамку так, чтобы и картина, и багет, и рамка образовали единую визуальную композицию.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=4#part713088" name="part713088"><span class="p-s-"></span></a><br />
<div class="fragment"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDIag9iXeiADYR6oYh12X8PmM8jv0RLPHMoLbxLMHSmn1wsP3OZfct9JihoFI3EfDK3mTkK6uyCTzFJs6yGY68q_gFUxGeN5T549GrKj-bzl_UaqQ2cDd4CQLzVO1xNk1A3c6Sh4FIUQ/s1600/pateximg9.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5498559918591908434" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDIag9iXeiADYR6oYh12X8PmM8jv0RLPHMoLbxLMHSmn1wsP3OZfct9JihoFI3EfDK3mTkK6uyCTzFJs6yGY68q_gFUxGeN5T549GrKj-bzl_UaqQ2cDd4CQLzVO1xNk1A3c6Sh4FIUQ/s320/pateximg9.gif" style="cursor: pointer; display: block; height: 320px; margin: 0px auto 10px; text-align: center; width: 278px;" /></a><br />
Рис.9. Объектная диаграмма для "Декоратора" на примере обрамленной картины.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=4#part713089" name="part713089"><span class="p-s-"></span></a><br />
<div class="fragment" style="font-weight: bold;">3.5 Пример "Фасада"</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=4#part713090" name="part713090"><span class="p-s-"></span></a><br />
<div class="fragment">"Фасад" задает единообразный, высокоуровневый интерфейс для подсистем, что делает его применение проще. Заказчики сталкиваются с "Фасадом", когда заказывают товар по каталогу. Заказчик набирает единый номер и разговаривает с обслуживающим клиентов персоналом. Обслуживающий клиентов сервис действует как "Фасад", обеспечивая интерфейс к подразделению исполнения заказов, подразделению финансовых расчетов и подразделению доставки.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=4#part713091" name="part713091"><span class="p-s-"></span></a><br />
<div class="fragment"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_sD3Q5YTgEPzRwn606VREGLRxfP_Ic0XpYtFTbfZoTaAg4whus_wijlhB-0_B4U9rqOvaxEw3Uhvtj2QN6rcz9DXi3LxW4d0h9s07uhGcFzmcwSqh_yfik-kkm7SLWxeBQrreRIb1mg/s1600/pateximg10.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5498559930359900946" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_sD3Q5YTgEPzRwn606VREGLRxfP_Ic0XpYtFTbfZoTaAg4whus_wijlhB-0_B4U9rqOvaxEw3Uhvtj2QN6rcz9DXi3LxW4d0h9s07uhGcFzmcwSqh_yfik-kkm7SLWxeBQrreRIb1mg/s320/pateximg10.gif" style="cursor: pointer; display: block; height: 225px; margin: 0px auto 10px; text-align: center; width: 320px;" /></a><br />
Рис.10. Объектная диаграмма для "Фасада" на примере заказа по телефону.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=4#part713092" name="part713092"><span class="p-s-"></span></a><br />
<div class="fragment" style="font-weight: bold;">3.6 Пример "Приспособленца"</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=4#part713093" name="part713093"><span class="p-s-"></span></a><br />
<div class="fragment">"Приспособленец" эффективно использует большое количество объектов совместно. Примером "Приспособленца" является общая коммутируемая телефонная сеть. Имеется несколько устройств, таких как тоновые генераторы звонка, импульсные генераторы и цифровые приемники, которые могут использоваться абонентами совместно. Абонент не знает сколько устройств объединены в пул, когда он поднимает трубку, совершая вызов. Все, что имеет значение для абонента — что тоновый набор работает, сигнал отзыва получен и тогда вызов совершен.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=5#part713094" name="part713094"><span class="p-s-"></span></a><br />
<div class="fragment"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5_EHnxJ3pY0TnL2FxXX3LeR9ak9HsnmEzi9mpNOslNZN5_gdoiFCY9UAZdH_53C5gaqW1le1iqgdv01WZlQL0ykMoTKDzTu7-XGW9eGqelEN6Qad02kTbFP6-duum_FR0TJgtctf09A/s1600/pateximg11.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5498560834792397330" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5_EHnxJ3pY0TnL2FxXX3LeR9ak9HsnmEzi9mpNOslNZN5_gdoiFCY9UAZdH_53C5gaqW1le1iqgdv01WZlQL0ykMoTKDzTu7-XGW9eGqelEN6Qad02kTbFP6-duum_FR0TJgtctf09A/s320/pateximg11.gif" style="cursor: pointer; display: block; height: 137px; margin: 0px auto 10px; text-align: center; width: 320px;" /></a><br />
Рис.11. "Приспособленец" на примере тонового генератора звонка.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=5#part713095" name="part713095"><span class="p-s-"></span></a><br />
<div class="fragment" style="font-weight: bold;">3.7 Пример "Заместителя"</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=5#part713096" name="part713096"><span class="p-s-"></span></a><br />
<div class="fragment">"Заместитель" вводит заменителя или обладающего полномочиями для обеспечения доступа к объекту. Чек или банковское поручение является заменителем денежных средств на счету. Чек может использоваться вместо наличных денег для совершения покупок и первичного контроля доступа к суммам на текущем счету.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=5#part713097" name="part713097"><span class="p-s-"></span></a><br />
<div class="fragment"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTI5WSOF-Tji2BtMH5zXHMH7H690eD4UesYa5FGYfp2YAA7U-7dQg9Gn8AQRclu4GsiQ_iuLY0MJF-ozBwCOS6xAKYvYyvmDU6OnRSdUWeJJpez-2LQ7kGgwuJjnsdSzueD6VN7AFrfA/s1600/pateximg12.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5498560841774986994" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTI5WSOF-Tji2BtMH5zXHMH7H690eD4UesYa5FGYfp2YAA7U-7dQg9Gn8AQRclu4GsiQ_iuLY0MJF-ozBwCOS6xAKYvYyvmDU6OnRSdUWeJJpez-2LQ7kGgwuJjnsdSzueD6VN7AFrfA/s320/pateximg12.gif" style="cursor: pointer; display: block; height: 168px; margin: 0px auto 10px; text-align: center; width: 320px;" /></a><br />
Рис.12. Объектная диаграмма для "Заместителя" на примере банковского поручения.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=5#part713098" name="part713098"><span class="p-s-"></span></a><br />
<div class="fragment" style="font-weight: bold;">4. Поведенческие шаблоны</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=5#part713099" name="part713099"><span class="p-s-"></span></a><br />
<div class="fragment">"Бандой Четырех" были задокументированы одиннадцать поведенческих шаблонов. Примеры таких шаблонов можно найти в сортировке монет в банке, в ресторанных заказах, в музыке, на транспорте, в автомастерской, в торговых автоматах и в жилищном строительстве.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=5#part713100" name="part713100"><span class="p-s-"></span></a><br />
<div class="fragment" style="font-weight: bold;">4.1 Пример "Цепочки ответственности"</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=5#part713101" name="part713101"><span class="p-s-"></span></a><br />
<div class="fragment">Шаблон "Цепочка обязанностей" избегает прямого запроса отправителя к получателю, давая возможность обработать запрос более чем одному объекту. Механическая сортировка монет в банке использует "Цепочку ответственности". В отличие от отдельной щели для монеты каждого достоинства с накопителем, используется единственная щель. Когда монета падает, она автоматически направляется механизмом в соответствующий накопитель внутри банка.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=5#part713102" name="part713102"><span class="p-s-"></span></a><br />
<div class="fragment"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFam87yW69E4g6SSauObY9luBCT7wV8INB-DB4C7WKSmeFOLzxzqhoRBft7MqqWu8vh7AjDL3xBPrcmRd0MmYJ7RQRE44BZGjfMaOgfMKBalbczqB3PmiBa6bXHqefhNw3lvXB6uIpFA/s1600/pateximg13.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5498560848792257026" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFam87yW69E4g6SSauObY9luBCT7wV8INB-DB4C7WKSmeFOLzxzqhoRBft7MqqWu8vh7AjDL3xBPrcmRd0MmYJ7RQRE44BZGjfMaOgfMKBalbczqB3PmiBa6bXHqefhNw3lvXB6uIpFA/s320/pateximg13.gif" style="cursor: pointer; display: block; height: 234px; margin: 0px auto 10px; text-align: center; width: 320px;" /></a><br />
Рис.13. Объектная диаграмма для "Цепочки ответственности" на примере сортировки монет.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=5#part713103" name="part713103"><span class="p-s-"></span></a><br />
<div class="fragment" style="font-weight: bold;">4.2 Пример "Команды"</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=5#part713104" name="part713104"><span class="p-s-"></span></a><br />
<div class="fragment">Шаблон "Команда" позволяет запросам быть инкапсулированными в виде объекта, тем самым позволяя клиентам указывать параметры к различным запросами. Обеденный "счет" является шаблоном "Команды". Официант или официантка принимает заказ, или указания от потребителя, и инкапсулирует этот заказ, записывая его на чеке. Затем заказ на короткое время попадает в очередь на кухню. Заметьте, что "счета" заполняются для разных обедающих и не зависят от меню, а потому они могут обслуживаться командой для приготовления множества различных блюд.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=5#part713105" name="part713105"><span class="p-s-"></span></a><br />
<div class="fragment"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJBiYmIsLzMy1U8nO5hR43B0rZdVe5p8S7k1QIWL0oaey8FHR-hOZhqBdfFSvVGk2As1LON4hLer6o2lp4J_hv4LZL5flV4fNqOZqvoG71AbSKU7v8gSc9bYLUSsfweBCZ1DSPr4PEBg/s1600/pateximg14.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5498560858863846594" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJBiYmIsLzMy1U8nO5hR43B0rZdVe5p8S7k1QIWL0oaey8FHR-hOZhqBdfFSvVGk2As1LON4hLer6o2lp4J_hv4LZL5flV4fNqOZqvoG71AbSKU7v8gSc9bYLUSsfweBCZ1DSPr4PEBg/s320/pateximg14.gif" style="cursor: pointer; display: block; height: 165px; margin: 0px auto 10px; text-align: center; width: 320px;" /></a><br />
Рис.14. Диаграмма взаимодействия объекта "Команды" на примере обедающего.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=5#part713106" name="part713106"><span class="p-s-"></span></a><br />
<div class="fragment" style="font-weight: bold;">4.3 Пример "Интерпретатора"</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=5#part713107" name="part713107"><span class="p-s-"></span></a><br />
<div class="fragment">Шаблон "Интерпретатор" задает грамматическое представление для языка и интерпретатора для интерпретирования грамматики. Музыканты являются примерами "Интерпретатора". Высота звука и его продолжительность может быть представлена в музыкальной нотации на нотном стане. Эта нотация представляет собой музыкальный язык [14]. Музыканты, играя музыку с нот, способны воспроизвести оригинальную высоту и продолжительность каждого записанного в нотации звука.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=6#part713108" name="part713108"><span class="p-s-"></span></a><br />
<div class="fragment"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvsOi7c0EaHmXX35AwZnr3s9fTTFLC0QdZFMPa74uAVr323Xw0ZHZ1J9TdT0HTDqJkvIJnTnF3DN6NHrCKdDmPtkXGPulhIezZ_BMGhImRdZt_CmUz2UA_wJDXv5rHk4bb4G6QpzNM4Q/s1600/pateximg15.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5498560856961255810" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvsOi7c0EaHmXX35AwZnr3s9fTTFLC0QdZFMPa74uAVr323Xw0ZHZ1J9TdT0HTDqJkvIJnTnF3DN6NHrCKdDmPtkXGPulhIezZ_BMGhImRdZt_CmUz2UA_wJDXv5rHk4bb4G6QpzNM4Q/s320/pateximg15.gif" style="cursor: pointer; display: block; height: 248px; margin: 0px auto 10px; text-align: center; width: 320px;" /></a><br />
Рис.15. Объектная диаграмма для "Интерпретатора" на музыкальном примере .</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=6#part713109" name="part713109"><span class="p-s-"></span></a><br />
<div class="fragment" style="font-weight: bold;">4.4 Пример "Итератора"</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=6#part713110" name="part713110"><span class="p-s-"></span></a><br />
<div class="fragment">"Итератор" предоставляет последовательный доступ к элементам составного объекта, не раскрывая нижележащей структуры этого объекта. У телевизоров первого поколения, для переключения каналов использовался циферблат. При переходе к нужному каналу, телезрителю требовалось двигать переключатель через каждую позицию канала, независимо от того, есть ли вещание по текущему каналу или нет. В современных телевизорах используются кнопки "Next" и "Prev". Когда телезритель нажимает кнопку "Next", будет показан следующий канал. Если вы смотрите телевизор в отеле незнакомого города и ищете интересную передачу или фильм, номер канала вас не интересует. Если содержание вас не устраивает — вы будете пользоваться кнопкой "Next", при этом номер канала не так важен.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=6#part713111" name="part713111"><span class="p-s-"></span></a><br />
<div class="fragment"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisbgEukoCNQK1eHVNFPDcw9Ab0S018rrVcK2CBML8JbtKsSG6F0CF5WOsdLiPU6tMarblWmbmw2y0ZN71-6UvyoZWFiLgACcl_OvAhx8zi5RW73fMYgLA6g9JMYgQeUfCK2wdmSBb-YQ/s1600/pateximg16.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5498561545734944066" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisbgEukoCNQK1eHVNFPDcw9Ab0S018rrVcK2CBML8JbtKsSG6F0CF5WOsdLiPU6tMarblWmbmw2y0ZN71-6UvyoZWFiLgACcl_OvAhx8zi5RW73fMYgLA6g9JMYgQeUfCK2wdmSBb-YQ/s320/pateximg16.gif" style="cursor: pointer; display: block; height: 194px; margin: 0px auto 10px; text-align: center; width: 320px;" /></a><br />
Рис.16. Объектная диаграмма для "Итератора" на примере переключателя каналов.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=6#part713112" name="part713112"><span class="p-s-"></span></a><br />
<div class="fragment" style="font-weight: bold;">4.5 Пример "Посредника"</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=6#part713113" name="part713113"><span class="p-s-"></span></a><br />
<div class="fragment">"Посредник" задает объект, который управляет взаимодействием множества объектов. Взаимодействующие объекты избавляются от прямых связей друг с другом, эти функции передаются отдельному объекту — "Посреднику". Этот шаблон очень хорошо представляет диспетчерская вышка аэропорта. Пилоты самолетов, покидая или приближаясь к терминалу связываются с вышкой, а напрямую не друг с другом. Разрешения тем, кто может совершить посадку или взлет, выдаются из вышки. Важно отметить, что на вышке не контролируется весь полет в целом. Там отслеживают и управляют поведением самолетов только в пределах терминала. </div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=6#part713114" name="part713114"><span class="p-s-"></span></a><br />
<div class="fragment"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKS24nLpon7w8wmOjYSEbGR6GtBvp_Ji16GQ6GqiVELuzvYwxDc2pjtutbhb_6zolxZWFWrChiqseJW8pOH7AtspuH2dI5XBJvmpEUa6_ckpOYEEZbQxNJnuRFKYT7tmchbuDfwN_1jg/s1600/pateximg17.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5498561549887553586" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKS24nLpon7w8wmOjYSEbGR6GtBvp_Ji16GQ6GqiVELuzvYwxDc2pjtutbhb_6zolxZWFWrChiqseJW8pOH7AtspuH2dI5XBJvmpEUa6_ckpOYEEZbQxNJnuRFKYT7tmchbuDfwN_1jg/s320/pateximg17.gif" style="cursor: pointer; display: block; height: 174px; margin: 0px auto 10px; text-align: center; width: 276px;" /></a><br />
Рис.17. "Посредник" на примере диспетчерской вышки аэропорта.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=6#part713115" name="part713115"><span class="p-s-"></span></a><br />
<div class="fragment" style="font-weight: bold;">4.6 Пример "Хранителя"</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=6#part713116" name="part713116"><span class="p-s-"></span></a><br />
<div class="fragment">"Хранитель" делает снимок и облекает в конкретную форму внутреннее состояние объекта, с тем чтобы восстановить это его состояние позднее. Такой шаблон широко распространен в "сделай сам" механике восстановления автомобильных барабанных тормозов. Барабаны снимаются с обеих сторон, открывая вид как левого, так и правого тормозов. Разбирается только одна сторона, а другая используется в качестве "Хранителя" того, как детали тормозов соединены вместе [8]. Только когда работа с одной стороны полностью завершена, разбирается вторая сторона. Когда разбирается вторая сторона, первая служит в качестве "Хранителя". </div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=7#part713117" name="part713117"><span class="p-s-"></span></a><br />
<div class="fragment"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFDaPUETHXXCQ0m7GcADHc_0Bv8ZmY1fOg2ix89kPX-PcPumtKT3s2UOgezwxAyCaXTyASlbcpx5dbfG1MNTgtCskfKR9zSTJjRn4FL4FyJRQZS7Nk_twKsypD08uzsT2xs4FLzEAevw/s1600/pateximg18.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5498561551126294850" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFDaPUETHXXCQ0m7GcADHc_0Bv8ZmY1fOg2ix89kPX-PcPumtKT3s2UOgezwxAyCaXTyASlbcpx5dbfG1MNTgtCskfKR9zSTJjRn4FL4FyJRQZS7Nk_twKsypD08uzsT2xs4FLzEAevw/s320/pateximg18.gif" style="cursor: pointer; display: block; height: 178px; margin: 0px auto 10px; text-align: center; width: 320px;" /></a><br />
Рис.18. Объектная диаграмма "Хранителя" на примере ремонта тормозов.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=7#part713118" name="part713118"><span class="p-s-"></span></a><br />
<div class="fragment" style="font-weight: bold;">4.7 Пример "Наблюдателя"</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=7#part713119" name="part713119"><span class="p-s-"></span></a><br />
<div class="fragment">"Наблюдатель" задает отношение "один ко многим" так, чтобы когда один объект меняет свое состояние, другие получают уведомления и автоматически обновляются. Некоторые аукционы представляют собой такой шаблон. Каждый участник торгов имеет карточку с номером, которая используется для указания ставки. Аукционист начинает торги, и "наблюдает" когда карточка будет поднята, подтверждая ставку. Подтверждение ставки изменяет цену предложения, которая передается всем участникам торгов в форме новой ставки.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=7#part713120" name="part713120"><span class="p-s-"></span></a><br />
<div class="fragment"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYJzH0hBEN6q9NTOnx06IhRqhncJpwHb32yOvvF9d9B28_eLBK0IkQP0E14fwixMQ4zF9DU7FuVomPVLKQkrsvb627vx73Av6MY5fPs3gLiLObwrrRrK1TeSh7jlgqkajofgXTe8wsDg/s1600/pateximg19.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5498561555490224418" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYJzH0hBEN6q9NTOnx06IhRqhncJpwHb32yOvvF9d9B28_eLBK0IkQP0E14fwixMQ4zF9DU7FuVomPVLKQkrsvb627vx73Av6MY5fPs3gLiLObwrrRrK1TeSh7jlgqkajofgXTe8wsDg/s320/pateximg19.gif" style="cursor: pointer; display: block; height: 230px; margin: 0px auto 10px; text-align: center; width: 250px;" /></a><br />
Рис.19. "Наблюдатель" на примере аукциона.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=7#part713121" name="part713121"><span class="p-s-"></span></a><br />
<div class="fragment" style="font-weight: bold;">4.8 Пример "Состояния"</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=7#part713122" name="part713122"><span class="p-s-"></span></a><br />
<div class="fragment">Шаблон "Состояние" позволяет объекту менять свое поведение, когда его внутреннее состояние изменилось . Этот шаблон можно наблюдать в торговом автомате. Торговые автоматы определяют свое состояние основываясь на реестре товаров, количестве полученных денег, возможности вносить изменения и т.д. Когда деньги приняты и выбор сделан, торговый автомат либо выдаст товар и не изменит свое состояние, либо выдаст продукт и изменит свое состояние, либо не выдаст продукт из-за недостаточного количества денег или исчерпания запасов продукта. </div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=7#part713123" name="part713123"><span class="p-s-"></span></a><br />
<div class="fragment"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFKBj1v6oTxQuPuCzGFp9cRT7JOCazEFs6xFb2s7B0C3SoZIbaBpipf8KEmUZ_xvIyHnW19oaaiypDLNdNbL93zMQ5C7qoVQ6MGAEoyPlcf4MjNd6OYtPlOhtcIyRH5FAUXoFmYw-wSw/s1600/pateximg20.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5498561563336992130" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFKBj1v6oTxQuPuCzGFp9cRT7JOCazEFs6xFb2s7B0C3SoZIbaBpipf8KEmUZ_xvIyHnW19oaaiypDLNdNbL93zMQ5C7qoVQ6MGAEoyPlcf4MjNd6OYtPlOhtcIyRH5FAUXoFmYw-wSw/s320/pateximg20.gif" style="cursor: pointer; display: block; height: 180px; margin: 0px auto 10px; text-align: center; width: 320px;" /></a><br />
Рис.20. Объектная диаграмма для "Состояния" на примере торгового автомата.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=7#part713124" name="part713124"><span class="p-s-"></span></a><br />
<div class="fragment" style="font-weight: bold;">4.9 Пример "Стратегии"</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=7#part713125" name="part713125"><span class="p-s-"></span></a><br />
<div class="fragment">"Стратегия" задает набор алгоритмов, которые могут быть использованы как взаимозаменяемые. Вид доставки в аэропорт является примером "Стратегии". Существует несколько вариантов: на собственном автомобиле, вызвать такси, на межаэропортном спецтранспорте, на городском автобусе или лимузине. До некоторых аэропортов также можно добраться и на метро или даже на вертолете. Любой из этих видов доставки путешественников в аэропорт может стать взаимозаменяемым. Пассажир должен выбрать "Стратегию", основываясь на компромиссе между ценой, удобством и временем.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=7#part713126" name="part713126"><span class="p-s-"></span></a><br />
<div class="fragment"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMAoPuhUgz_O4KVWL-Z2NTu_jChllEPiwlh2AqV4K_x-B3VSsI2PVkL6hMbm2IgjoBq7rJkQm-VX_4MJi03IdksdMwyV9g9X8dilrh-GCY-5zIR69K5S86O3TwjEQX7K7fk9TPAJJQXw/s1600/pateximg21.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5498562227300083986" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMAoPuhUgz_O4KVWL-Z2NTu_jChllEPiwlh2AqV4K_x-B3VSsI2PVkL6hMbm2IgjoBq7rJkQm-VX_4MJi03IdksdMwyV9g9X8dilrh-GCY-5zIR69K5S86O3TwjEQX7K7fk9TPAJJQXw/s320/pateximg21.gif" style="cursor: pointer; display: block; height: 139px; margin: 0px auto 10px; text-align: center; width: 320px;" /></a><br />
Рис.21. Объектная диаграмма для "Стратегии" на примере доставки в аэропорт.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=7#part713127" name="part713127"><span class="p-s-"></span></a><br />
<div class="fragment" style="font-weight: bold;">4.10 Пример "Шаблонного метода"</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=7#part713128" name="part713128"><span class="p-s-"></span></a><br />
<div class="fragment">"Шаблонный метод" задает каркас алгоритма в отдельных операциях, и уступает некоторые шаги субклассам. В жилищном строительстве "Шаблонный метод" используется при разработке новых типовых проектов. Типовой проект состоит из ограниченного количества планов помещений, с различными вариациями для каждого плана. Внутри такого плана, фундаменты, окна, сантехника и проводка будут для каждого дома идентичными. Вариации вводятся на последних стадиях разработки, для производства более широкого спектра моделей.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=8#part713129" name="part713129"><span class="p-s-"></span></a><br />
<div class="fragment"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8fJz7J46Namz3Tzo1sSqpSc31GGrR5YcU_6ZJE_aYf2HyZoHap2D1uONP5rp-R5Oeis-Tzbk_Vt3huWmzW3ZjXSQs4qh-_6HUHQSbn-PcjD6kJPaNUkAt5qhjEinEXIxJCYLM0OImgQ/s1600/pateximg22.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5498562234044215682" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8fJz7J46Namz3Tzo1sSqpSc31GGrR5YcU_6ZJE_aYf2HyZoHap2D1uONP5rp-R5Oeis-Tzbk_Vt3huWmzW3ZjXSQs4qh-_6HUHQSbn-PcjD6kJPaNUkAt5qhjEinEXIxJCYLM0OImgQ/s320/pateximg22.gif" style="cursor: pointer; display: block; height: 200px; margin: 0px auto 10px; text-align: center; width: 320px;" /></a><br />
Рис.22. "Шаблонный метод" на примере базового типового проекта.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=8#part713130" name="part713130"><span class="p-s-"></span></a><br />
<div class="fragment" style="font-weight: bold;">4.11 Пример "Посетителя"</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=8#part713131" name="part713131"><span class="p-s-"></span></a><br />
<div class="fragment">Шаблон "Посетитель" представляет собой операцию, исполняемую на элементах объектной структуры, без изменения классов, с которыми он работает. Этот шаблон можно обнаружить в работе службы такси. Когда кто-либо звонит в службу такси, он становится частью списка заказчиков службы. Затем служба направляет машину заказчику (принимает посетителя). Садясь в такси, или становясь его Посетителем, заказчик уже не контролирует свое перемещение, это делает (водитель) такси.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=8#part713132" name="part713132"><span class="p-s-"></span></a><br />
<div class="fragment"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhD0ZuUxQ-ug5W6fbaZig3tNQ6IgnplkCEslGz4QAlsfIXIiVPNOiNlsXK_JC2__VVhe3ELZwjvaKEth4V1Zyf8XYjGravvh46i7Bgiz0sbJsg7q818xKc6fgaZgPXKtL7IMGXG9xs8qQ/s1600/pateximg23.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5498562239465840594" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhD0ZuUxQ-ug5W6fbaZig3tNQ6IgnplkCEslGz4QAlsfIXIiVPNOiNlsXK_JC2__VVhe3ELZwjvaKEth4V1Zyf8XYjGravvh46i7Bgiz0sbJsg7q818xKc6fgaZgPXKtL7IMGXG9xs8qQ/s320/pateximg23.gif" style="cursor: pointer; display: block; height: 192px; margin: 0px auto 10px; text-align: center; width: 320px;" /></a><br />
Рис.23. Диаграмма взаимодействия объектов для "Посетителя" на примере вызова такси.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=8#part713133" name="part713133"><span class="p-s-"></span></a><br />
<div class="fragment" style="font-weight: bold;">5. Выводы</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=8#part713134" name="part713134"><span class="p-s-"></span></a><br />
<div class="fragment">Не программные примеры каждого шаблона проектирования программного обеспечения, каталогизированные "Бандой Четырех", показаны реально существующими. Можно теперь удивиться практическому смыслу этих примеров. Эти не программные примеры способствуют повышению коммуникативной способности языка шаблонов и полезны как средство обучения шаблонам.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=8#part713135" name="part713135"><span class="p-s-"></span></a><br />
<div class="fragment" style="font-weight: bold;">5.1 Повышение коммуникативной способности языка шаблонов</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=8#part713136" name="part713136"><span class="p-s-"></span></a><br />
<div class="fragment">Александер надеялся, что правильные шаблоны приведут к появлению общего языка, который будет поддержан всеми [2]. Внутри сообщества проектирования программного обеспечения, шаблоны рассматриваются как путь разработки набора языков для эффективной коммуникации между коллегами [4, 17]. Шаблоны, как ожидается, предоставят общий словарь для обсуждения структур, больших чем модули, процедуры и объекты [10].</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=8#part713137" name="part713137"><span class="p-s-"></span></a><br />
<div class="fragment">Одним из важнейших элементов языка являются ментальные образы, связанные с символами языка. В языке, задаваемая конфигурация символов имеет смысл только тогда, когда можно легко понять ее содержание, которое включает и его ментальное представление [7]. Важность ментальных образов для языка шаблонов не отрицал и Александер. Он утверждал, что язык не является морфологически полным, пока типы построений, которые язык генерирует, не смогут быть визуализированы конкретным образом [1]. В проектировании программного обеспечения, Дирк Риле (Dirk Riehle) и Хайнц Цуллигхофен (Heinz Züllighoven) признают важность конкретных примеров в ознакомлении нашего восприятия с предметной областью [18].</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=9#part713138" name="part713138"><span class="p-s-"></span></a><br />
<div class="fragment">Если шаблоны проектирования программного обеспечения станут всеобщим языком среди программистов, то станут важными и совместно используемые ими смысловые значения. Если проектные решения станут обсуждать, но не понимать, проектировщики будут вынуждены снимать с себя ответственность за завершение работы [19]. Обыденные примеры облегчают понимание, поскольку в ходе понимания чего-либо, люди должны найти в памяти ближайший предмет, с которым оно соотносится [20]. Проекты в AG Communication Systems, там где широко используются шаблоны проектирования, часто сопровождаются не программными примерами для иллюстрации связей в шаблонах. Примеры помогают прийти к общему пониманию между проектировщиками. Установив общее понимание на раннем этапе процесса проектирования, обсуждение между проектировщиками становится намного более эффективным на протяжении всего жизненного цикла проекта. </div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=9#part713139" name="part713139"><span class="p-s-"></span></a><br />
<div class="fragment" style="font-weight: bold;">5.2 Не программные примеры как средство обучения шаблонам</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=9#part713140" name="part713140"><span class="p-s-"></span></a><br />
<div class="fragment">Студентам требуются примеры, когда им представляют новые концепции. Это стало очевидным во время испытательного курса по изучению шаблонов проведенного в AG Communication Systems, и то же самое отмечалось другими [12]. Когда изучается что-то новое, студент естественно стремится использовать предыдущие знания в попытках понять новые концепции [6]. По этой причине, при первом знакомстве с шаблонами проектирования программного обеспечения нужно приводить больше примеров [12]. Конкретные примеры должны быть хорошо знакомы студентам, а не экспертам [3]. Приводя знакомые примеры мы не увеличиваем объем материала, который нужно будет изучить еще. В то же время, выбор примера вне компетенции студента, оставляет его за рамками вовлечения в приводимый пример и цель нового материала теряется. Поскольку шаблоны, в конечном счете, должны постоянно находиться в собственной голове [11], используйте те примеры, которые понятны и знакомы как можно большому количеству людей, а учебные материалы могут быть построены на уже закрепившихся в памяти примерах.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=9#part713141" name="part713141"><span class="p-s-"></span></a><br />
<div class="fragment" style="font-weight: bold;">6. Заключение</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=9#part713142" name="part713142"><span class="p-s-"></span></a><br />
<div class="fragment">Повторяемость шаблонов проектирования программного обеспечения в не программных примерах делает очевидным то, что шаблоны не ограничиваются какой-то специфической областью. Примеры этих шаблонов в повседневных объектах могут принести пользу проектировщикам, даже не смотря на то, что такие примеры не выражены на программном языке. Приведенные в этой статье примеры нацелены на то, чтобы они стали знакомыми как можно большему количеству людей (даже тем, чья культура может довольно сильно отличаться от северо-американской). Опираясь на общий реальный опыт, такие примеры облегчают понимание специфичных шаблонов проектирования, и, таким образом, облегчают взаимопонимание в общении и служат средством обучения шаблонам.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=10#part713143" name="part713143"><span class="p-s-"></span></a><br />
<div class="fragment" style="font-weight: bold;">7. Благодарности</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=10#part713144" name="part713144"><span class="p-s-"></span></a><br />
<div class="fragment">Автор выражает глубокую благодарность Брэндону Голдфиддеру из "Dalmatian Group", Линде Райсинг из "AG Communication Systems", Алистеру Кокберну из "Humans and Technology" и Ральфу Джонсону из Иллинойского Университета в Урбане, за их полезные замечания для этой статьи.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=10#part713145" name="part713145"><span class="p-s-"></span></a><br />
<div class="fragment" style="font-weight: bold;">8. Ссылки</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=10#part713146" name="part713146"><span class="p-s-"></span></a><br />
<div class="fragment">1. Alexander, C. "The Timeless Way of Building", Oxford University Press, 1979.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=10#part713147" name="part713147"><span class="p-s-"></span></a><br />
<div class="fragment">2. Alexander, C., и др. "A Pattern Language", Oxford University Press, 1977.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=10#part713148" name="part713148"><span class="p-s-"></span></a><br />
<div class="fragment">3. Anthony, D. "Patterns for Classroom Education", в "Pattern Languages of Program Design II", Addison-Wesley, 1996.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=10#part713149" name="part713149"><span class="p-s-"></span></a><br />
<div class="fragment">4. Berczuk, S. "Finding solutions through pattern languages", Computer, Vol. 27, No. 12. December, 1994.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=10#part713150" name="part713150"><span class="p-s-"></span></a><br />
<div class="fragment">5. Booch, G. "Object Oriented Design" в "Tutorial on Software Design Techniques", стр. 420-437, IEEE Computer Society, 1984.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=10#part713151" name="part713151"><span class="p-s-"></span></a><br />
<div class="fragment">6. Carroll, J. "The Nurnberg funnel: Designing minimalist instruction for practical computer skill", MIT Press, 1990.<br />
<div class="published-content"><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=10#part713152" name="part713152"><span class="p-s-"></span></a><br />
<div class="fragment">7. Chierchia, G. and McConnel-Ginnet, S., "Meaning and Grammar: An Introduction to Semantics", MIT Press, 1990.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=10#part713153" name="part713153"><span class="p-s-"></span></a><br />
<div class="fragment">8. Chilton, "Chilton's Auto Repair Manual", Chilton Book Company, 1985.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=10#part713154" name="part713154"><span class="p-s-"></span></a><br />
<div class="fragment">9. Coplien, J. "Broadening beyond objects to patterns and to other paradigms", Position statement for the ACM Workshop on Strategic Directions in Computing Research, MIT, June 14-15, 1996.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=10#part713155" name="part713155"><span class="p-s-"></span></a><br />
<div class="fragment">10. Coplien, J. "Idioms, Patterns, and Other Architectural Literature", IEEE Software, November, 1996.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=10#part713156" name="part713156"><span class="p-s-"></span></a><br />
<div class="fragment">11. Cunningham W., Johnson, R., "Introduction to Pattern Languages of Program Design", Addison-Wesley, 1995.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=10#part713157" name="part713157"><span class="p-s-"></span></a><br />
<div class="fragment">12. DeBruler, D. "A Generative Pattern Language for Distributed Processing", в "Pattern Languages of Program Design", Addison-Wesley, 1995.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=10#part713158" name="part713158"><span class="p-s-"></span></a><br />
<div class="fragment">13. Gamma, E., Helm, R., Johnson, R., Vlissides, J., "Design Patterns - Elements of Reusable Object-Oriented Software", Addison-Wesley, 1995. Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес "Приемы объектно-ориентированного проектирования. Паттерны проектирования", СПб: «Питер», 2007.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=10#part713159" name="part713159"><span class="p-s-"></span></a><br />
<div class="fragment">14. Leonhardt, C. "Discovering Music Together 7", California State Department of Education, 1967.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=10#part713160" name="part713160"><span class="p-s-"></span></a><br />
<div class="fragment">15. President and Fellows of Harvard College, "Good Time Toy Company", Publishing Division, Harvard Business School, 1986.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=10#part713161" name="part713161"><span class="p-s-"></span></a><br />
<div class="fragment">16. Hill, C.W.L. "Toyota: The Evolution of Toyota's Production System" в "Cases in Strategic Management", Houghton Mifflin, 1993.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=11#part713162" name="part713162"><span class="p-s-"></span></a><br />
<div class="fragment">17. OOPSLA '95 "Patterns: Cult to Culture?", Panel Discussion in the Addendum to the Proceedings, ACM Press, 1996.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=11#part713163" name="part713163"><span class="p-s-"></span></a><br />
<div class="fragment">18. Richle, D, Züllighoven, H. "A Pattern Language for Tool Construction and Integration Based on the Tools and Materials Metaphor", in Pattern Languages of Program Design, Addison-Wesley, 1995.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=11#part713164" name="part713164"><span class="p-s-"></span></a><br />
<div class="fragment">19. Ross, D., and Schoman Jr., K. "Structured Analysis for Requirements Definition," IEEE Transactions on Software Engineering, Vol. SE3, No 1., January, 1977.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=11#part713165" name="part713165"><span class="p-s-"></span></a><br />
<div class="fragment">20. Schank, R. "Tell Me a Story: A New Look at Real and Artificial Memory", Charles Scribner's Sons, 1990.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=11#part713166" name="part713166"><span class="p-s-"></span></a><br />
<div class="fragment">"Non-Software Examples of Software Design Patterns," Object Magazine, Vol. 7, No. 5, July 1997, pp. 52-57.</div><a class="p-l-" href="http://translated.by/you/non-software-examples-of-software-design-patterns/into-ru/trans/?page=11#part713167" name="part713167"><span class="p-s-"></span></a></div></div>Anonymoushttp://www.blogger.com/profile/07767399673328608941noreply@blogger.com0