SlideShare a Scribd company logo
1 of 35
Download to read offline
Design Patterns
Денис Княжев 
Java (Java EE, Swing (desktop), JBoss, Tomcat, Glassfish, Spring, Hibernate, Google App Engine) 
Javascript (JQuery, JavascriptMVC) 
Databases (MySQL, PostgreSQL, Cassandra, Google Cloud Datastore) 
Android 
PHP (half-trainee: Apache, Zend 1x) 
IOS (trainee) 
C/C++ (trainee) 
Areas 
Healthcare 
GIS 
e-commerce 
Social Networking 
Gaming (sometime...) 
Open source 
Github -> denisk20 
http://programmer-dvorak.appspot.com/ (Javascript) 
Bullshit Bingo Champion (Android) 
Draw Graph (Java desktop) 
Developer, open source enthusiast
1. Паттерны придумали умники у которых слишком 
много времени? 
2. Немного паттернов 
a. Template method 
b. Command 
c. Composite 
d. Visitor 
3. Q&A
1. Паттерны придумали умники у которых 
слишком много времени?
1994 
C++, Smalltalk 
Стандартные 
решения 
стандартных 
проблем 
Слишком часто 
используются не к 
месту
2. Немного паттернов 
a. Template method 
b. Command 
c. Composite 
d. Visitor
Template Method (Hollywood principle) 
Don’t call us, we’ll call you 
Challenge: сохранить заметку. 
Заметки могут быть разных видов (текстовые, голосовые, 
фото и т.д.)
class TextNote 
{ 
private $date; 
private $text; 
public function save() 
{ 
class PhotoNote extends TextNote 
{ 
private $photo; 
$dbNote = new DB_Note(); 
$dbNote->setDate($this->date); 
$dbNote->setText($this->text); 
$dbNote->save(); 
} 
protected function saveExtra(DB_Note 
class VideoNote extends TextNote 
{ 
private $video; 
$this->saveExtra($dbNote); 
protected function saveExtra( 
DB_Note $dbNote){} 
$dbNote) 
{ 
$dbNote->setPhoto($this->photo)); 
} 
protected function saveExtra(DB_Note 
$dbNote) 
{ 
$dbNote->setVideo($this->video); 
}
class TextNote 
{ 
private $date; 
private $text; 
public function save() 
{ 
$dbNote = new DB_Note(); 
$dbNote->setDate($this->date); 
$dbNote->setText($this->text); 
$dbNote->save(); 
} 
class PhotoNote extends TextNote 
{ 
private $photo; 
class VideoNote extends TextNote 
{ 
private $video; 
$dbNote->setTag($this->getTag()); 
protected abstract function getTag(); 
protected function getTag() 
{ 
return "Photo"; 
} 
protected function getTag() 
{ 
return "Video"; 
}
Template Method: Summary 
Позволяет вынести в 
Parent class очень 
много логики => 
эффективный DRY 
(Do not Repeat Yourself) 
Навязывает наследование
Command (Execute something later) 
Challenge: 
● возможность batch-сохранения изменения в заметках 
● возможность отмены изменений в заметках
interface Command 
{ 
public function execute(); 
} 
interface UndoableCommand extends Command 
{ 
public function undo(); 
}
class EditTextCommand implements Command 
{ 
private $note; 
private $oldText; 
private $newText; 
public function execute() 
{ 
if(strcmp($this->note->text, 
$this->newText) === 0) 
{ 
return; 
} 
$this->oldText = $this->note->text; 
$this->note->text = $this->newText; 
$this->note->save(); 
} 
$commands = array(); 
$commands[] = $command1; 
$commands[] = $command2; 
$commands[] = $command3; 
//... 
public function executeAll() 
{ 
foreach($commands as 
$command) 
{ 
$command->execute(); 
} 
}
class UndoableEditTextCommand 
extends EditCommand 
implements UndoableCommand 
{ 
public function undo() 
{ 
if(strcmp($this->note->text, 
$this->oldText) === 0) 
{ 
return; 
} 
$this->newText = $this->note->text; 
$this->note->text = $this->oldText; 
$this->note->save(); 
} 
} 
$commands = array(); 
$commands[] = $command1; 
$commands[] = $command2; 
$commands[] = $command3; 
//... 
public function undoAll() 
{ 
foreach($commands as 
$command) 
{ 
$command->undo(); 
} 
}
In Javascript the life is easier 
Все функции - команды 
vag command = function(param1, param2) {...}; 
command.call(this, “hello”, “world”); 
Манипулировать функциями - естественно 
function doSomething(value1, value2, comparator) { 
if(comparator.call(this, value1, value2) > 0) { 
//do something 
} else { 
//do something else 
} 
}
Command: Summary 
● Абстрагирует не данные, а 
действие 
● “Отложенное” выполнение 
● Batch-запуск 
● Возможность отмены и т.д. 
● Память
Composite: иерархии объектов 
Challenge: 
● возможность сохранения всего дерева заметок 
(Заметку, её комментарии, комментарии на 
комментарии и т.д.)
interface Note 
{ 
public function save(); 
} 
abstract class AbstractNote implements 
Note 
{ 
private $childNotes = array(); 
public function addChild(Note $note) 
{ 
$this->childNotes[] = $note; 
} 
private function saveInternal() 
{ 
//saves this note 
} 
public function save() 
{ 
$this->saveInternal(); 
foreach($this->childNotes as $child) 
{ 
$child->save(); 
} 
} 
}
class TextNote extends AbstractNote 
{ 
//... 
} 
class PhotoNote extends AbstractNote 
{ 
//... 
} 
class VideoNote extends AbstractNote 
{ 
//... 
} 
$parent = new VideoNote(); 
$comment = new TextNote(); 
$videoResponse = new VideoNote(); 
$commentOnVideoResponse = 
new TextNote(); 
$videoResponse->addChild( 
$commentOnVideoResponse); 
$parent->addChild($videoResponse); 
$parent->addChild($comment); 
$parent->save();
Composite: Summary 
● Позволяет выполнять 
операции над всей 
иерархией объектов 
● Поощряет делать много 
небольших классов вместо 
нескольких больших 
● Вся иерархия хранится в 
памяти 
● Поощряет наследование
Visitor: разные операции над 
разными объектами 
Challenge: 
Text notes Photo notes 
Render 
Share
interface Visitor 
{ 
public function visitTextNote(TextNote $note); 
public function visitPhotoNote(PhotoNote $note); 
} 
interface Note 
{ 
public function accept(Visitor $visitor); 
}
class TextNote implements Note 
{ 
private $text; 
//... 
public function accept(Visitor $visitor) 
{ 
$visitor->visitTextNote($this); 
} 
} 
class PhotoNote implements Note 
{ 
private $photo; 
//... 
public function accept(Visitor $visitor) 
{ 
$visitor->visitPhotoNote($this); 
} 
}
class RenderVisitor implements Visitor 
{ 
public function visitTextNote(TextNote $note) 
{ 
echo "<p>{$note->getText()}</p>"; 
} 
public function visitPhotoNote(PhotoNote $note) 
{ 
echo "<img src='{$note->getPhoto()->src}'></img>"; 
} 
}
class ShareVisitor implements Visitor 
{ 
private $account; 
//... 
public function visitTextNote(TextNote $note) 
{ 
$account->shareText($note->getText()); 
} 
public function visitPhotoNote(PhotoNote $note) 
{ 
$image = $note->getImage(); 
$image = self::resizeImage($image); 
$account->shareImage($image); 
} 
}
$notes = array(); 
$notes[] = new TextNote(); 
$notes[] = new PhotoNote(); 
Visitor renderVisitor = new RenderVisitor(); 
Visitor shareVisitor = new ShareVisitor($account); 
function processAllTextNotes(Visitor $visitor, array $notes) 
{ 
foreach($notes as $note) 
{ 
$note->accept($visitor); //magic (double dispatch) 
} 
} 
$this->processAllNotes($renderVisitor, $notes); //render all 
$this->processAllNotes($shareVisitor, $notes); //share all
Visitor: Summary 
● Полностью разделяет 
алгоритм и структуру 
данных 
● Выделяет “разные вкусы” 
одного и того же алгоритма 
для разных типов данных 
● Большой 
● Страшный 
● Сложный
Big summary 
Использовать pattern не по назначению - 
большее зло, чем не использовать вообще 
● Template Method - “don’t call us, we’ll call you” 
● Command - отложенный запуск 
● Composite - иерархии объектов 
● Visitor - разделение алторитма и структуры 
данных
Thank you! 
http://goo.gl/39FhrR

More Related Content

What's hot

JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.Igor Shkulipa
 
DUMP-2013 Frontend - Возможности последних WEB-стандартов в API Яндекс.Карт -...
DUMP-2013 Frontend - Возможности последних WEB-стандартов в API Яндекс.Карт -...DUMP-2013 Frontend - Возможности последних WEB-стандартов в API Яндекс.Карт -...
DUMP-2013 Frontend - Возможности последних WEB-стандартов в API Яндекс.Карт -...it-people
 
Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"
Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"
Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"Yandex
 
Making Scalable JavaScript Application
Making Scalable JavaScript ApplicationMaking Scalable JavaScript Application
Making Scalable JavaScript ApplicationMikhail Davydov
 
Windows Azure and node js
Windows Azure and node jsWindows Azure and node js
Windows Azure and node jsAlex Tumanoff
 
basis.js - почему я не бросил разрабатывать свой фреймворк
basis.js - почему я не бросил разрабатывать свой фреймворкbasis.js - почему я не бросил разрабатывать свой фреймворк
basis.js - почему я не бросил разрабатывать свой фреймворкRoman Dvornov
 
Работа с БД в Drupal 7
Работа с БД в Drupal 7Работа с БД в Drupal 7
Работа с БД в Drupal 7Eugene Fidelin
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Яковенко Кирилл
 
Эффективное программирование на NodeJS
Эффективное программирование на NodeJSЭффективное программирование на NodeJS
Эффективное программирование на NodeJSYura Bogdanov
 
"Рекомендации по проектированию API" — Марина Степанова, Яндекс
"Рекомендации по проектированию API" — Марина Степанова, Яндекс"Рекомендации по проектированию API" — Марина Степанова, Яндекс
"Рекомендации по проектированию API" — Марина Степанова, ЯндексYandex
 
Toolbar (Lecture 16 – toolbar)
Toolbar (Lecture 16 – toolbar)Toolbar (Lecture 16 – toolbar)
Toolbar (Lecture 16 – toolbar)Noveo
 
Yii development
Yii developmentYii development
Yii developmentMageCloud
 
DOM-шаблонизаторы – не только "быстро"
DOM-шаблонизаторы – не только "быстро"DOM-шаблонизаторы – не только "быстро"
DOM-шаблонизаторы – не только "быстро"Roman Dvornov
 
Mobile Fest#spb 2012
Mobile Fest#spb 2012Mobile Fest#spb 2012
Mobile Fest#spb 2012dmalykhanov
 
Android Development Course in HSE lecture #3
Android Development Course in HSE lecture #3Android Development Course in HSE lecture #3
Android Development Course in HSE lecture #3Empatika
 
FPUG Dzyga presentation
FPUG Dzyga presentationFPUG Dzyga presentation
FPUG Dzyga presentationIvan Filimonov
 

What's hot (20)

Cocos2d-x и Lua
Cocos2d-x и LuaCocos2d-x и Lua
Cocos2d-x и Lua
 
JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.
 
DUMP-2013 Frontend - Возможности последних WEB-стандартов в API Яндекс.Карт -...
DUMP-2013 Frontend - Возможности последних WEB-стандартов в API Яндекс.Карт -...DUMP-2013 Frontend - Возможности последних WEB-стандартов в API Яндекс.Карт -...
DUMP-2013 Frontend - Возможности последних WEB-стандартов в API Яндекс.Карт -...
 
Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"
Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"
Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"
 
Making Scalable JavaScript Application
Making Scalable JavaScript ApplicationMaking Scalable JavaScript Application
Making Scalable JavaScript Application
 
Windows Azure and node js
Windows Azure and node jsWindows Azure and node js
Windows Azure and node js
 
Асинхронный JavaScript
Асинхронный JavaScriptАсинхронный JavaScript
Асинхронный JavaScript
 
basis.js - почему я не бросил разрабатывать свой фреймворк
basis.js - почему я не бросил разрабатывать свой фреймворкbasis.js - почему я не бросил разрабатывать свой фреймворк
basis.js - почему я не бросил разрабатывать свой фреймворк
 
Работа с БД в Drupal 7
Работа с БД в Drupal 7Работа с БД в Drupal 7
Работа с БД в Drupal 7
 
Javascript
JavascriptJavascript
Javascript
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3
 
Эффективное программирование на NodeJS
Эффективное программирование на NodeJSЭффективное программирование на NodeJS
Эффективное программирование на NodeJS
 
"Рекомендации по проектированию API" — Марина Степанова, Яндекс
"Рекомендации по проектированию API" — Марина Степанова, Яндекс"Рекомендации по проектированию API" — Марина Степанова, Яндекс
"Рекомендации по проектированию API" — Марина Степанова, Яндекс
 
Decorators' recipes
Decorators' recipesDecorators' recipes
Decorators' recipes
 
Toolbar (Lecture 16 – toolbar)
Toolbar (Lecture 16 – toolbar)Toolbar (Lecture 16 – toolbar)
Toolbar (Lecture 16 – toolbar)
 
Yii development
Yii developmentYii development
Yii development
 
DOM-шаблонизаторы – не только "быстро"
DOM-шаблонизаторы – не только "быстро"DOM-шаблонизаторы – не только "быстро"
DOM-шаблонизаторы – не только "быстро"
 
Mobile Fest#spb 2012
Mobile Fest#spb 2012Mobile Fest#spb 2012
Mobile Fest#spb 2012
 
Android Development Course in HSE lecture #3
Android Development Course in HSE lecture #3Android Development Course in HSE lecture #3
Android Development Course in HSE lecture #3
 
FPUG Dzyga presentation
FPUG Dzyga presentationFPUG Dzyga presentation
FPUG Dzyga presentation
 

Viewers also liked

Stay yourself, just converse
Stay yourself, just converseStay yourself, just converse
Stay yourself, just converseKailin Chang
 
19.03.2014 odf first_ukrainian_soldier_killed_in_crimea_eng
19.03.2014 odf first_ukrainian_soldier_killed_in_crimea_eng19.03.2014 odf first_ukrainian_soldier_killed_in_crimea_eng
19.03.2014 odf first_ukrainian_soldier_killed_in_crimea_engodfoundation
 
VI sympozjum chemiczne
VI sympozjum chemiczneVI sympozjum chemiczne
VI sympozjum chemicznezso2pl
 
03.02.2014 odf regions_en (1)
03.02.2014 odf regions_en (1)03.02.2014 odf regions_en (1)
03.02.2014 odf regions_en (1)odfoundation
 
03.02.2014 odf regions_pl
03.02.2014 odf regions_pl03.02.2014 odf regions_pl
03.02.2014 odf regions_plodfoundation
 
Media Studies - In what ways does your media product use, develop or challeng...
Media Studies - In what ways does your media product use, develop or challeng...Media Studies - In what ways does your media product use, develop or challeng...
Media Studies - In what ways does your media product use, develop or challeng...Sana Khurshid
 
Defensem els animals
Defensem els animals Defensem els animals
Defensem els animals martita56
 
Solubility of constituents - lisa ganora
Solubility of constituents - lisa ganoraSolubility of constituents - lisa ganora
Solubility of constituents - lisa ganorabetrina
 
小小說書人
小小說書人小小說書人
小小說書人yuruli
 
23 06-2014-odf-report-russian-federation-supports-terrorists-in-eastern-ukrai...
23 06-2014-odf-report-russian-federation-supports-terrorists-in-eastern-ukrai...23 06-2014-odf-report-russian-federation-supports-terrorists-in-eastern-ukrai...
23 06-2014-odf-report-russian-federation-supports-terrorists-in-eastern-ukrai...odfoundation
 
Baths
BathsBaths
Bathsmhr56
 
SEO-АПОКАЛИПСИС: Как выживать при новом поиске (2014, К. Скобеев, "Интернет и...
SEO-АПОКАЛИПСИС: Как выживать при новом поиске (2014, К. Скобеев, "Интернет и...SEO-АПОКАЛИПСИС: Как выживать при новом поиске (2014, К. Скобеев, "Интернет и...
SEO-АПОКАЛИПСИС: Как выживать при новом поиске (2014, К. Скобеев, "Интернет и...Скобеев и Партнеры
 
Raport euromajdan pl
Raport euromajdan plRaport euromajdan pl
Raport euromajdan plodfoundation
 
Russia starts a_war_with_ukraine_eng
Russia starts a_war_with_ukraine_engRussia starts a_war_with_ukraine_eng
Russia starts a_war_with_ukraine_engodfoundation
 
12 hadits lemah dan palsu seputar ramadhan
12 hadits lemah dan palsu seputar ramadhan12 hadits lemah dan palsu seputar ramadhan
12 hadits lemah dan palsu seputar ramadhanJaka Supriyanta
 
25 08-2014-odf-report-case-of-nadezhda-savchenko-ua
25 08-2014-odf-report-case-of-nadezhda-savchenko-ua25 08-2014-odf-report-case-of-nadezhda-savchenko-ua
25 08-2014-odf-report-case-of-nadezhda-savchenko-uaodfoundation
 
25 04-2014-odf-45-days-of-russian-occupation-of-crimea-eng
25 04-2014-odf-45-days-of-russian-occupation-of-crimea-eng25 04-2014-odf-45-days-of-russian-occupation-of-crimea-eng
25 04-2014-odf-45-days-of-russian-occupation-of-crimea-engodfoundation
 
Our week in istanbul
Our week in istanbulOur week in istanbul
Our week in istanbulmhr56
 

Viewers also liked (20)

Stay yourself, just converse
Stay yourself, just converseStay yourself, just converse
Stay yourself, just converse
 
Demo ppt
Demo pptDemo ppt
Demo ppt
 
19.03.2014 odf first_ukrainian_soldier_killed_in_crimea_eng
19.03.2014 odf first_ukrainian_soldier_killed_in_crimea_eng19.03.2014 odf first_ukrainian_soldier_killed_in_crimea_eng
19.03.2014 odf first_ukrainian_soldier_killed_in_crimea_eng
 
VI sympozjum chemiczne
VI sympozjum chemiczneVI sympozjum chemiczne
VI sympozjum chemiczne
 
03.02.2014 odf regions_en (1)
03.02.2014 odf regions_en (1)03.02.2014 odf regions_en (1)
03.02.2014 odf regions_en (1)
 
03.02.2014 odf regions_pl
03.02.2014 odf regions_pl03.02.2014 odf regions_pl
03.02.2014 odf regions_pl
 
Media Studies - In what ways does your media product use, develop or challeng...
Media Studies - In what ways does your media product use, develop or challeng...Media Studies - In what ways does your media product use, develop or challeng...
Media Studies - In what ways does your media product use, develop or challeng...
 
Defensem els animals
Defensem els animals Defensem els animals
Defensem els animals
 
Solubility of constituents - lisa ganora
Solubility of constituents - lisa ganoraSolubility of constituents - lisa ganora
Solubility of constituents - lisa ganora
 
小小說書人
小小說書人小小說書人
小小說書人
 
23 06-2014-odf-report-russian-federation-supports-terrorists-in-eastern-ukrai...
23 06-2014-odf-report-russian-federation-supports-terrorists-in-eastern-ukrai...23 06-2014-odf-report-russian-federation-supports-terrorists-in-eastern-ukrai...
23 06-2014-odf-report-russian-federation-supports-terrorists-in-eastern-ukrai...
 
Baths
BathsBaths
Baths
 
SEO-АПОКАЛИПСИС: Как выживать при новом поиске (2014, К. Скобеев, "Интернет и...
SEO-АПОКАЛИПСИС: Как выживать при новом поиске (2014, К. Скобеев, "Интернет и...SEO-АПОКАЛИПСИС: Как выживать при новом поиске (2014, К. Скобеев, "Интернет и...
SEO-АПОКАЛИПСИС: Как выживать при новом поиске (2014, К. Скобеев, "Интернет и...
 
Raport euromajdan pl
Raport euromajdan plRaport euromajdan pl
Raport euromajdan pl
 
Russia starts a_war_with_ukraine_eng
Russia starts a_war_with_ukraine_engRussia starts a_war_with_ukraine_eng
Russia starts a_war_with_ukraine_eng
 
12 hadits lemah dan palsu seputar ramadhan
12 hadits lemah dan palsu seputar ramadhan12 hadits lemah dan palsu seputar ramadhan
12 hadits lemah dan palsu seputar ramadhan
 
Vasquez_Juan_PPP
Vasquez_Juan_PPPVasquez_Juan_PPP
Vasquez_Juan_PPP
 
25 08-2014-odf-report-case-of-nadezhda-savchenko-ua
25 08-2014-odf-report-case-of-nadezhda-savchenko-ua25 08-2014-odf-report-case-of-nadezhda-savchenko-ua
25 08-2014-odf-report-case-of-nadezhda-savchenko-ua
 
25 04-2014-odf-45-days-of-russian-occupation-of-crimea-eng
25 04-2014-odf-45-days-of-russian-occupation-of-crimea-eng25 04-2014-odf-45-days-of-russian-occupation-of-crimea-eng
25 04-2014-odf-45-days-of-russian-occupation-of-crimea-eng
 
Our week in istanbul
Our week in istanbulOur week in istanbul
Our week in istanbul
 

Similar to Techtalk#8: Design patterns in real life

Принципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.DПринципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.DAndreyGeonya
 
ES2015+: давно пора!
ES2015+: давно пора!ES2015+: давно пора!
ES2015+: давно пора!Vitebsk Miniq
 
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин Sigma Software
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПKirill Chebunin
 
Кирилл Харьков
Кирилл ХарьковКирилл Харьков
Кирилл ХарьковCodeFest
 
Groovy presentation.
Groovy presentation.Groovy presentation.
Groovy presentation.Infinity
 
YiiConf: Миграции и инсталляции
YiiConf: Миграции и инсталляцииYiiConf: Миграции и инсталляции
YiiConf: Миграции и инсталляцииPaul Klimov
 
Yii: миграции и инсталляции
Yii: миграции и инсталляцииYii: миграции и инсталляции
Yii: миграции и инсталляцииPaul Klimov
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobileUA Mobile
 
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationAndrii Dzynia
 
«Buzzwords everywhere, или Борьба с ветряными мельницами», Артём Дроздов, Mai...
«Buzzwords everywhere, или Борьба с ветряными мельницами», Артём Дроздов, Mai...«Buzzwords everywhere, или Борьба с ветряными мельницами», Артём Дроздов, Mai...
«Buzzwords everywhere, или Борьба с ветряными мельницами», Артём Дроздов, Mai...Mail.ru Group
 
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"Yandex
 
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)ZFConf Conference
 
Шаблоны разработки ПО. Часть 3. Шаблоны GoF
Шаблоны разработки ПО. Часть 3. Шаблоны GoFШаблоны разработки ПО. Часть 3. Шаблоны GoF
Шаблоны разработки ПО. Часть 3. Шаблоны GoFSergey Nemchinsky
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммыPlatonov Sergey
 

Similar to Techtalk#8: Design patterns in real life (20)

Принципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.DПринципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.D
 
ES2015+: давно пора!
ES2015+: давно пора!ES2015+: давно пора!
ES2015+: давно пора!
 
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОП
 
UWDC 2013, Yii2
UWDC 2013, Yii2UWDC 2013, Yii2
UWDC 2013, Yii2
 
Кирилл Харьков
Кирилл ХарьковКирилл Харьков
Кирилл Харьков
 
Tdd php
Tdd phpTdd php
Tdd php
 
Groovy presentation.
Groovy presentation.Groovy presentation.
Groovy presentation.
 
JSSDK: Начало
JSSDK: НачалоJSSDK: Начало
JSSDK: Начало
 
Паттерны проектирования
Паттерны проектированияПаттерны проектирования
Паттерны проектирования
 
YiiConf: Миграции и инсталляции
YiiConf: Миграции и инсталляцииYiiConf: Миграции и инсталляции
YiiConf: Миграции и инсталляции
 
Yii: миграции и инсталляции
Yii: миграции и инсталляцииYii: миграции и инсталляции
Yii: миграции и инсталляции
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobile
 
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test Automation
 
«Buzzwords everywhere, или Борьба с ветряными мельницами», Артём Дроздов, Mai...
«Buzzwords everywhere, или Борьба с ветряными мельницами», Артём Дроздов, Mai...«Buzzwords everywhere, или Борьба с ветряными мельницами», Артём Дроздов, Mai...
«Buzzwords everywhere, или Борьба с ветряными мельницами», Артём Дроздов, Mai...
 
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"
 
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
 
Шаблоны разработки ПО. Часть 3. Шаблоны GoF
Шаблоны разработки ПО. Часть 3. Шаблоны GoFШаблоны разработки ПО. Часть 3. Шаблоны GoF
Шаблоны разработки ПО. Часть 3. Шаблоны GoF
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммы
 
Render API.
Render API.Render API.
Render API.
 

More from DA-14

Express js clean-controller
Express js clean-controllerExpress js clean-controller
Express js clean-controllerDA-14
 
Express js api-versioning
Express js api-versioningExpress js api-versioning
Express js api-versioningDA-14
 
Tech talk Angular 2
Tech talk Angular 2Tech talk Angular 2
Tech talk Angular 2DA-14
 
AngularJS: what is underneath the hood
AngularJS: what is underneath the hood AngularJS: what is underneath the hood
AngularJS: what is underneath the hood DA-14
 
Firebase not really_yohoho
Firebase not really_yohohoFirebase not really_yohoho
Firebase not really_yohohoDA-14
 
Techtalk#7: Architecture principles by Steve McConnell's book "Code Complete"
Techtalk#7: Architecture principles by Steve McConnell's book "Code Complete"Techtalk#7: Architecture principles by Steve McConnell's book "Code Complete"
Techtalk#7: Architecture principles by Steve McConnell's book "Code Complete"DA-14
 
Mysql, MongoDb feat. Doctrine2
Mysql, MongoDb feat. Doctrine2Mysql, MongoDb feat. Doctrine2
Mysql, MongoDb feat. Doctrine2DA-14
 
Web Components: back to the future
Web Components: back to the futureWeb Components: back to the future
Web Components: back to the futureDA-14
 
Techtalk#6: NodeJs: pitfalls (based on game project)
Techtalk#6: NodeJs: pitfalls (based on game project)Techtalk#6: NodeJs: pitfalls (based on game project)
Techtalk#6: NodeJs: pitfalls (based on game project)DA-14
 
JS Frameworks Day April,26 of 2014
JS Frameworks Day April,26 of 2014JS Frameworks Day April,26 of 2014
JS Frameworks Day April,26 of 2014DA-14
 
TechTalk#2: Принципы управления временем
TechTalk#2: Принципы управления временемTechTalk#2: Принципы управления временем
TechTalk#2: Принципы управления временемDA-14
 
TechTalk#3: REST
TechTalk#3: RESTTechTalk#3: REST
TechTalk#3: RESTDA-14
 

More from DA-14 (12)

Express js clean-controller
Express js clean-controllerExpress js clean-controller
Express js clean-controller
 
Express js api-versioning
Express js api-versioningExpress js api-versioning
Express js api-versioning
 
Tech talk Angular 2
Tech talk Angular 2Tech talk Angular 2
Tech talk Angular 2
 
AngularJS: what is underneath the hood
AngularJS: what is underneath the hood AngularJS: what is underneath the hood
AngularJS: what is underneath the hood
 
Firebase not really_yohoho
Firebase not really_yohohoFirebase not really_yohoho
Firebase not really_yohoho
 
Techtalk#7: Architecture principles by Steve McConnell's book "Code Complete"
Techtalk#7: Architecture principles by Steve McConnell's book "Code Complete"Techtalk#7: Architecture principles by Steve McConnell's book "Code Complete"
Techtalk#7: Architecture principles by Steve McConnell's book "Code Complete"
 
Mysql, MongoDb feat. Doctrine2
Mysql, MongoDb feat. Doctrine2Mysql, MongoDb feat. Doctrine2
Mysql, MongoDb feat. Doctrine2
 
Web Components: back to the future
Web Components: back to the futureWeb Components: back to the future
Web Components: back to the future
 
Techtalk#6: NodeJs: pitfalls (based on game project)
Techtalk#6: NodeJs: pitfalls (based on game project)Techtalk#6: NodeJs: pitfalls (based on game project)
Techtalk#6: NodeJs: pitfalls (based on game project)
 
JS Frameworks Day April,26 of 2014
JS Frameworks Day April,26 of 2014JS Frameworks Day April,26 of 2014
JS Frameworks Day April,26 of 2014
 
TechTalk#2: Принципы управления временем
TechTalk#2: Принципы управления временемTechTalk#2: Принципы управления временем
TechTalk#2: Принципы управления временем
 
TechTalk#3: REST
TechTalk#3: RESTTechTalk#3: REST
TechTalk#3: REST
 

Techtalk#8: Design patterns in real life

  • 2. Денис Княжев Java (Java EE, Swing (desktop), JBoss, Tomcat, Glassfish, Spring, Hibernate, Google App Engine) Javascript (JQuery, JavascriptMVC) Databases (MySQL, PostgreSQL, Cassandra, Google Cloud Datastore) Android PHP (half-trainee: Apache, Zend 1x) IOS (trainee) C/C++ (trainee) Areas Healthcare GIS e-commerce Social Networking Gaming (sometime...) Open source Github -> denisk20 http://programmer-dvorak.appspot.com/ (Javascript) Bullshit Bingo Champion (Android) Draw Graph (Java desktop) Developer, open source enthusiast
  • 3. 1. Паттерны придумали умники у которых слишком много времени? 2. Немного паттернов a. Template method b. Command c. Composite d. Visitor 3. Q&A
  • 4. 1. Паттерны придумали умники у которых слишком много времени?
  • 5. 1994 C++, Smalltalk Стандартные решения стандартных проблем Слишком часто используются не к месту
  • 6. 2. Немного паттернов a. Template method b. Command c. Composite d. Visitor
  • 7.
  • 8. Template Method (Hollywood principle) Don’t call us, we’ll call you Challenge: сохранить заметку. Заметки могут быть разных видов (текстовые, голосовые, фото и т.д.)
  • 9. class TextNote { private $date; private $text; public function save() { class PhotoNote extends TextNote { private $photo; $dbNote = new DB_Note(); $dbNote->setDate($this->date); $dbNote->setText($this->text); $dbNote->save(); } protected function saveExtra(DB_Note class VideoNote extends TextNote { private $video; $this->saveExtra($dbNote); protected function saveExtra( DB_Note $dbNote){} $dbNote) { $dbNote->setPhoto($this->photo)); } protected function saveExtra(DB_Note $dbNote) { $dbNote->setVideo($this->video); }
  • 10. class TextNote { private $date; private $text; public function save() { $dbNote = new DB_Note(); $dbNote->setDate($this->date); $dbNote->setText($this->text); $dbNote->save(); } class PhotoNote extends TextNote { private $photo; class VideoNote extends TextNote { private $video; $dbNote->setTag($this->getTag()); protected abstract function getTag(); protected function getTag() { return "Photo"; } protected function getTag() { return "Video"; }
  • 11.
  • 12. Template Method: Summary Позволяет вынести в Parent class очень много логики => эффективный DRY (Do not Repeat Yourself) Навязывает наследование
  • 13. Command (Execute something later) Challenge: ● возможность batch-сохранения изменения в заметках ● возможность отмены изменений в заметках
  • 14. interface Command { public function execute(); } interface UndoableCommand extends Command { public function undo(); }
  • 15. class EditTextCommand implements Command { private $note; private $oldText; private $newText; public function execute() { if(strcmp($this->note->text, $this->newText) === 0) { return; } $this->oldText = $this->note->text; $this->note->text = $this->newText; $this->note->save(); } $commands = array(); $commands[] = $command1; $commands[] = $command2; $commands[] = $command3; //... public function executeAll() { foreach($commands as $command) { $command->execute(); } }
  • 16. class UndoableEditTextCommand extends EditCommand implements UndoableCommand { public function undo() { if(strcmp($this->note->text, $this->oldText) === 0) { return; } $this->newText = $this->note->text; $this->note->text = $this->oldText; $this->note->save(); } } $commands = array(); $commands[] = $command1; $commands[] = $command2; $commands[] = $command3; //... public function undoAll() { foreach($commands as $command) { $command->undo(); } }
  • 17. In Javascript the life is easier Все функции - команды vag command = function(param1, param2) {...}; command.call(this, “hello”, “world”); Манипулировать функциями - естественно function doSomething(value1, value2, comparator) { if(comparator.call(this, value1, value2) > 0) { //do something } else { //do something else } }
  • 18.
  • 19. Command: Summary ● Абстрагирует не данные, а действие ● “Отложенное” выполнение ● Batch-запуск ● Возможность отмены и т.д. ● Память
  • 20. Composite: иерархии объектов Challenge: ● возможность сохранения всего дерева заметок (Заметку, её комментарии, комментарии на комментарии и т.д.)
  • 21.
  • 22. interface Note { public function save(); } abstract class AbstractNote implements Note { private $childNotes = array(); public function addChild(Note $note) { $this->childNotes[] = $note; } private function saveInternal() { //saves this note } public function save() { $this->saveInternal(); foreach($this->childNotes as $child) { $child->save(); } } }
  • 23. class TextNote extends AbstractNote { //... } class PhotoNote extends AbstractNote { //... } class VideoNote extends AbstractNote { //... } $parent = new VideoNote(); $comment = new TextNote(); $videoResponse = new VideoNote(); $commentOnVideoResponse = new TextNote(); $videoResponse->addChild( $commentOnVideoResponse); $parent->addChild($videoResponse); $parent->addChild($comment); $parent->save();
  • 24.
  • 25. Composite: Summary ● Позволяет выполнять операции над всей иерархией объектов ● Поощряет делать много небольших классов вместо нескольких больших ● Вся иерархия хранится в памяти ● Поощряет наследование
  • 26. Visitor: разные операции над разными объектами Challenge: Text notes Photo notes Render Share
  • 27. interface Visitor { public function visitTextNote(TextNote $note); public function visitPhotoNote(PhotoNote $note); } interface Note { public function accept(Visitor $visitor); }
  • 28. class TextNote implements Note { private $text; //... public function accept(Visitor $visitor) { $visitor->visitTextNote($this); } } class PhotoNote implements Note { private $photo; //... public function accept(Visitor $visitor) { $visitor->visitPhotoNote($this); } }
  • 29. class RenderVisitor implements Visitor { public function visitTextNote(TextNote $note) { echo "<p>{$note->getText()}</p>"; } public function visitPhotoNote(PhotoNote $note) { echo "<img src='{$note->getPhoto()->src}'></img>"; } }
  • 30. class ShareVisitor implements Visitor { private $account; //... public function visitTextNote(TextNote $note) { $account->shareText($note->getText()); } public function visitPhotoNote(PhotoNote $note) { $image = $note->getImage(); $image = self::resizeImage($image); $account->shareImage($image); } }
  • 31. $notes = array(); $notes[] = new TextNote(); $notes[] = new PhotoNote(); Visitor renderVisitor = new RenderVisitor(); Visitor shareVisitor = new ShareVisitor($account); function processAllTextNotes(Visitor $visitor, array $notes) { foreach($notes as $note) { $note->accept($visitor); //magic (double dispatch) } } $this->processAllNotes($renderVisitor, $notes); //render all $this->processAllNotes($shareVisitor, $notes); //share all
  • 32.
  • 33. Visitor: Summary ● Полностью разделяет алгоритм и структуру данных ● Выделяет “разные вкусы” одного и того же алгоритма для разных типов данных ● Большой ● Страшный ● Сложный
  • 34. Big summary Использовать pattern не по назначению - большее зло, чем не использовать вообще ● Template Method - “don’t call us, we’ll call you” ● Command - отложенный запуск ● Composite - иерархии объектов ● Visitor - разделение алторитма и структуры данных