SlideShare a Scribd company logo
Выжить с ООП
Макс Гопей
Выжить с помощью ООП. Максим Гопей
Почему?
Выжить с помощью ООП. Максим Гопей
Выжить с помощью ООП. Максим Гопей
Объектно-
Oриентированное
Программирование
7
Почему ООП?
•   Это удобно
•   Это расширяемо
•   Адекватная модель мира
•   Позволяет строить асбтракции
•   Мне так сказали
8
Объект олицетворяет объект
в реальном мире.
9
Объект олицетворяет объект
в реальном мире вашем домене.
10
Класс — это описание объекта
11
Класс — это не область имен
12
Пожалуйста, не делайте так:
use SpatieRegexRegex;
 
// Using `match`
Regex::match('/a/', 'abc'); // `MatchResult` object
Regex::match('/a/', 'abc')->hasMatch(); // true
Regex::match('/a/', 'abc')->result(); // 'a'
01.
02.
03.
04.
05.
06.
13
Вместо:
Regex::match('/a/', 'abc'); // `MatchResult` object
Regex::match('/a/', 'abc')->hasMatch(); // true
Regex::match('/a/', 'abc')->result(); // 'a'
лучше:
$pattern = new Regex('/a/');
$matchingResult = $pattern->match('abc'); // `MatchResult` object
$matchingResult->hasMatch(); // true
$matchingResult->result(); // 'a'
01.
02.
03.
01.
02.
03.
04.
14
Вместо:
Assertion::nullOrMax(null, 42); // success
Assertion::nullOrMax(1, 42); // success
Assertion::nullOrMax(1337, 42); // exception
лучше:
// since PHP 5.6
AssertionnullOrMax(null, 42); // success
AssertionnullOrMax(1, 42); // success
AssertionnullOrMax(1337, 42); // exception
01.
02.
03.
01.
02.
03.
04.
15
Инкапсуляция
16
Реализация меняется
•   разные алгоритмы
•   разные хранилища
•   разные протоколы
17
Абстракция не меняется
18
Выжить с помощью ООП. Максим Гопей
Наследование
20
Выжить с помощью ООП. Максим Гопей
Стакан
22
Чашка
23
Динозаврик с ручкой
24
Выжить с помощью ООП. Максим Гопей
Проектируйте для наследования.
Наследуйте, если спроектировали для этого.
26
Полиморфизм
27
Полиморфизм
Один интерфейс — множество реализаций.
И не важно, какая используется сейчас.
28
interface Container {
public function drop();
}
class Glass implements Container {
public function drop() { /* well, crash */ }
}
class Cup implements Container {
public function drop() { /* well, crash, and throw the handle out */ }
}
class Cat {
public function dropContainer(Container $container) {
$container->drop();
}
}
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
29
$cat = new Cat();
$cat->dropContainer(new Glass());
$cat->dropContainer(new Cup());
$cat->runAway();
01.
02.
03.
04.
30
class ContainerCollection implements Iterator {
public function current() : Container { /* ... */ };
// ...
}
 
$containersOnTable = new ContainerCollection();
 
// Your mom fills the collection here:
$eventManager->dispatch('serve_table', $containers);
 
array_walk($containersOnTable,
function(Container $container) use ($cat) {
$cat->dropContainer($container);
}
);
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
15.
31
Инкапсуляция помогает скрыть реализацию за абстракицей.
Наследование помогает строить абстракции.
Полиморфизм помогает писать код на основе абстракций.
32
33
Методы классов
34
class SearchEngine {
public function indexProduct(Product $product) {
$this->productIndex->add($product);
$indexIsUpToDate = $this->productIndex->isUpToDate();
//..
}
}
01.
02.
03.
04.
05.
06.
07.
35
Три вида сообщений:
•   Команда
•   Запрос
•   Документ
36
Метод-команда
•   принимает запрос на изменение состояния объекта,
•   ничего не возвращает (void),
•   выполняется успешно, либо бросает исключение.
37
Метод-запрос
•   принимает запрос на получение информации,
•   возвращает значение указанного типа,
•   если это невозможно, возвращает NULL ,
•   или бросает исключение,
•   никогда не меняет наблюдаемое состояние объекта.
*
*
38
Документ
•   результат работы метода-запроса.
39
Принцип:
Command Query Separation (CQS)
40
Избегайте сеттеров
41
class Person {
private $firstName, $lastName, $gender, $email;
// __constructor()
// getters
// setters
}
 
$person = new Person('Sheldon', 'Cooper', 'M', 'shelly@gmail.com');
render($person);
01.
02.
03.
04.
05.
06.
07.
08.
09.
42
Выжить с помощью ООП. Максим Гопей
class Person {
private $firstName, $lastName, $gender, $email;
// __constructor()
// getters
// setters
}
 
$person = new Person('Sheldon', 'Cooper', 'M', 'shelly@gmail.com');
 
$person->setFirstName('Penny');
$person->setGender('F');
 
render($person);
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
44
Выжить с помощью ООП. Максим Гопей
Отдавайте предпочтение
неизменяемым объектам
(immutables)
46
class Person {
private $firstName, $lastName, $email, $gender;
 
public function rename(NameChangingRequest $request) {
// change first/last/... names depending on request
// throw exception if name is not male, for instance
}
 
public function changeGender(GenderChangingRequest $request) {
// A request which contains also the new name,
// maybe the reason or whatever is needed.
}
}
 
$person->changeGender(new GenderChangingRequest('M', 'New Name'));
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
15.
47
Метод — это транзакция
48
class Product {
public function reduceQuantity($deltaQuantity) {
$this->quantity -= $deltaQuantity;
}
public function verifyStockAvailability() {
if ($this->quantity == 0) {
$this->removeFromStock();
}
}
}
 
$product->reduceQuantity($orderedQuantity);
$product->verifyStockAvailability();
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
49
class Product {
private function reduceQuantity($deltaQuantity) { /*...*/ }
private function verifyStockAvailability() { /*...*/ }
 
public function takeFromStock($quantity) {
try {
$this->reduceQuantity($orderedQuantity);
$this->verifyStockAvailability();
} catch() {
// ...
}
}
}
 
$product->takeFromStock($orderedQuantity);
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
15.
50
Название — это интерфейс
51
function getProductUrl($product) {
return '/'
. str_replace(' ', '-', strtolower($product));
}
01.
02.
03.
04.
52
$product = 'Ski Boots'; // product name
$product = 456; // product id
$product = [ // product data
'id' => 456,
'name' => 'Ski Boots'
];
01.
02.
03.
04.
05.
06.
53
Name things by their real value
•   $product — object
•   $productName — string
•   $productId — integer / hash
•   $productData — array / structure
54
Объекты-значения
(value-objects)
55
$person->addContactInformation(
new EmailAddress('max.gopey@gmail.com')
);
$person->addContactInformation(
new LinkedInProfileUrl('@max.gopey')
);
$this->redirect(new Url('https://stackoverflow.com'));
01.
02.
03.
04.
05.
06.
07.
56
Объекты-значения не изменяются.
57
Немного практики
58
Интернет-аптека для ветеринаров.
Можно покупать товар:
•   для клиники (clinic),
•   для клиента (pet owner).
От этого зависит процесс заказа. Например, при заказе для
клиента можно оформить доставку в клинику или на дом.
59
class Cgi_Nda_Model_Order_Mode
{
const ORDER_MODE_CLINIC = 1;
const ORDER_MODE_PET_OWNER = 2;
}
01.
02.
03.
04.
05.
60
class Cgi_Nda_Model_Session
{
public function getOrderMode() : int {
return $this->getSessionValue('order_mode');
}
}
01.
02.
03.
04.
05.
06.
61
class Cgi_Nda_Block_Order_Mode_Info
{
public function getOrderMode () {
$orderMode = $this->_getSession()->getOrderMode();
if ($orderMode ) {
if ($orderMode == Cgi_Nda_Model_Order_Mode::ORDER_MODE_PET_OWNER) {
return 'For pet owner' ;
} elseif ($orderMode == Cgi_Nda_Model_Order_Mode::ORDER_MODE_CLINIC) {
return 'For clinic' ;
} else {
return false;
}
} else {
return false;
}
}
public function isSeparateShippingAddressAllowed ()
{
$orderMode = $this->_getSession()->getOrderMode();
return $orderMode &&
$orderMode == Cgi_Nda_Model_Order_Mode::ORDER_MODE_PET_OWNER
}
}
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
62
interface Cgi_Nda_Model_Order_Mode_Interface
{
public function getCode() : int;
public function getTitle() : string;
public function isSeparateShippingAddressAllowed() : bool;
}
01.
02.
03.
04.
05.
06.
07.
08.
63
class Cgi_Nda_Model_Order_Mode_Clinicimplements Cgi_Nda_Model_Order_Mode_Interface
{
public function getCode() : int {
return 1;
}
public function getTitle() : string {
return 'For Clinic';
}
public function isSeparateShippingAddressAllowed() : bool {
return false;
}
}
 
class Cgi_Nda_Model_Order_Mode_PetOwnerimplements Cgi_Nda_Model_Order_Mode_Interface
{
public function getCode() : int {
return 2;
}
public function getTitle() : string {
return 'For Pet Owner';
}
public function isSeparateShippingAddressAllowed() : bool {
return true;
}
}
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
64
class Cgi_Nda_Model_Session
{
public function getOrderMode()
: Cgi_Nda_Model_Order_Mode_Interface {
return $this->getSessionValue('order_mode');
}
}
01.
02.
03.
04.
05.
06.
07.
65
class Cgi_Nda_Block_Order_Mode_Info
{
private $orderMode;
public function __construct(
Cgi_Nda_Model_Order_Mode_Interface $orderMode
) {
$this->orderMode = $orderMode;
}
public function getOrderModeTitle() {
return $this->orderMode->getTitle();
}
public function isSeparateShippingAddressAllowed() {
return $this->orderMode->isSeparateShippingAddressAllowed();
}
}
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
15.
16.
17.
18.
66
Выжить с помощью ООП. Максим Гопей

More Related Content

PDF
Survive with OOP
PDF
Влад Ковташ — Yap Database
PPT
Agile Instrumentation
PDF
[JAM 1.1] Clean Code (Paul Malikov)
PPTX
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
PPTX
Meet Magento Belarus debug Pavel Novitsky (rus)
PPTX
Andrew Borisenko "Magic of Vue.js""
PPTX
Реализация шаблонов корпоративных приложений в Magento
Survive with OOP
Влад Ковташ — Yap Database
Agile Instrumentation
[JAM 1.1] Clean Code (Paul Malikov)
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
Meet Magento Belarus debug Pavel Novitsky (rus)
Andrew Borisenko "Magic of Vue.js""
Реализация шаблонов корпоративных приложений в Magento

What's hot (20)

PPTX
Основы Java. 5. Databases
PPT
Javascript
PDF
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
PPTX
XPath локаторы в Selenium WebDriver
PDF
Лекция #5. Введение в язык программирования Python 3
PDF
JavaScript Базовый. Занятие 08.
PPT
Подробная презентация JavaScript 6 в 1
PPTX
Индексирование в Magento
PPT
Шаблоны проектирования 1
PPTX
ASP.NET MVC - как построить по-настоящему гибкое веб-приложение
PDF
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...
PPT
Подробная презентация JavaScript 6 в 1
PPTX
Bytecode
PPTX
Все дороги ведут в Checkout
PPTX
Разработка расширяемых приложений на Django
PDF
JavaScript в терминах БЭМ / Владимир Варанкин (Яндекс)
PPTX
PDF
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить / Сергей Авер...
PPT
Web весна 2013 лекция 4
PPT
Advanced Sql Injection
Основы Java. 5. Databases
Javascript
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
XPath локаторы в Selenium WebDriver
Лекция #5. Введение в язык программирования Python 3
JavaScript Базовый. Занятие 08.
Подробная презентация JavaScript 6 в 1
Индексирование в Magento
Шаблоны проектирования 1
ASP.NET MVC - как построить по-настоящему гибкое веб-приложение
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...
Подробная презентация JavaScript 6 в 1
Bytecode
Все дороги ведут в Checkout
Разработка расширяемых приложений на Django
JavaScript в терминах БЭМ / Владимир Варанкин (Яндекс)
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить / Сергей Авер...
Web весна 2013 лекция 4
Advanced Sql Injection
Ad

Similar to Выжить с помощью ООП. Максим Гопей (20)

PPTX
введение в объектно ориентированный анализ
PPTX
разработка бизнес приложений (6)
PPTX
DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...
ODP
Coding Standards
PDF
вайсфельд м. объектно-ориентированное мышление (библиотека программиста) - ...
PDF
Obektno orientirovannoe myshlenie
PPTX
разработка бизнес приложений (8)
PDF
Techtalk#8: Design patterns in real life
PPT
Внедрение аспектов в PHP с помощью библиотеки GO! AOP
PDF
Netpeak Talks #3: Масштабируемое приложение на PHP
PDF
Лекция 1. Основы объектно-ориентированного программирования
PPTX
PHP7 - что ожидать?
PDF
практические советы по улучшению качества кода
PDF
Объектное и прототипное программирование в Javascript
PPTX
разработка бизнес приложений (7)
PPTX
Aspect-Oriented Programming in PHP
PPTX
Coding like a sex
PDF
Релиз PHP7 - что нас ждет в октябре 2015
PDF
Виталий Каторгин, Wamba
введение в объектно ориентированный анализ
разработка бизнес приложений (6)
DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...
Coding Standards
вайсфельд м. объектно-ориентированное мышление (библиотека программиста) - ...
Obektno orientirovannoe myshlenie
разработка бизнес приложений (8)
Techtalk#8: Design patterns in real life
Внедрение аспектов в PHP с помощью библиотеки GO! AOP
Netpeak Talks #3: Масштабируемое приложение на PHP
Лекция 1. Основы объектно-ориентированного программирования
PHP7 - что ожидать?
практические советы по улучшению качества кода
Объектное и прототипное программирование в Javascript
разработка бизнес приложений (7)
Aspect-Oriented Programming in PHP
Coding like a sex
Релиз PHP7 - что нас ждет в октябре 2015
Виталий Каторгин, Wamba
Ad

More from EatDog (20)

PDF
Классифицируем текст в iOS без CoreML: как и зачем?
PDF
macOS app development for iOS devs: expand your horizons
PPTX
Dependency Injections in Kotlin
PDF
Быстрый в имплементации и в работе мониторинг с использованием ELK
PDF
Continuous integration / continuous delivery
PDF
Как мы экспериментируем в больших микросервисных системах
PDF
Отказоустойчивый Redis кластер
PDF
Кодстайл и насилие.
PDF
Refactor to Reactive With Spring 5 and Project Reactor
PDF
GraphQL: APIs the New Way.
PPTX
Большие проекты, архитектура и фреймворки.
PDF
Microservices in a Wild.
PDF
Dependency Rejection and TDD without Mocks
PPTX
Стероиды для Дотнетчика
PPTX
Domain Driven Design – просто о сложном.
PDF
OWASP: безопасное программирование на PHP.
PDF
Принципы Solid на практике
PDF
Mapbox GL: как работают современные векторные карты
PDF
Нельзя просто так взять и сделать версионирование API
PDF
API в SAAS, с облаком и без: ресурсы, SLA, балансировка, расширяемость
Классифицируем текст в iOS без CoreML: как и зачем?
macOS app development for iOS devs: expand your horizons
Dependency Injections in Kotlin
Быстрый в имплементации и в работе мониторинг с использованием ELK
Continuous integration / continuous delivery
Как мы экспериментируем в больших микросервисных системах
Отказоустойчивый Redis кластер
Кодстайл и насилие.
Refactor to Reactive With Spring 5 and Project Reactor
GraphQL: APIs the New Way.
Большие проекты, архитектура и фреймворки.
Microservices in a Wild.
Dependency Rejection and TDD without Mocks
Стероиды для Дотнетчика
Domain Driven Design – просто о сложном.
OWASP: безопасное программирование на PHP.
Принципы Solid на практике
Mapbox GL: как работают современные векторные карты
Нельзя просто так взять и сделать версионирование API
API в SAAS, с облаком и без: ресурсы, SLA, балансировка, расширяемость

Выжить с помощью ООП. Максим Гопей