Skip to content

Commit 3999fd6

Browse files
committed
Design Patterns
1 parent 30cdd11 commit 3999fd6

File tree

4 files changed

+87
-15
lines changed

4 files changed

+87
-15
lines changed

architecture/design-patterns.md

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,63 @@
1-
## Паттерны проектирования (Design Patterns)
1+
## Паттерны проектирования (Design Patterns)
2+
3+
Паттерны нужны только там, где они уместны. У каждого паттерна есть собственная цель и область применения.
4+
Если нет точной уверенности что использование паттерна решит проблему масштабирования приложения, то и использование его не рекомендуется.
5+
6+
Так же есть один из самых распространенных паттернов так же один из самых полезных - это фабричный метод.
7+
Его самый важный плюс в том, что его цель отделить конкретику от общего процесса. При этом достигается инкапсуляция.
8+
Так же соблюдается инверсия зависимостей. И реализация не уходит в излишнюю абстракцию, что сохраняет читабельность, и не делает из кода лазанью.
9+
10+
Типовая задача звучит примерно всегда одинаково: У нас есть разные сущности, которые должны иметь одинаковое поведение.
11+
12+
Возьмем к примеру склад на который товар может прийти различными способами и будет различие в оприходовании, но выгружен на одном и том же складе.
13+
Допустим нам его может привезти грузовик, или он может прийти к нам пароходом.
14+
```php
15+
interface IArrival
16+
{
17+
public function getProducts(): array;
18+
}
19+
20+
class TruckArrival implements IArrival
21+
{
22+
public function getProducts(): array
23+
{
24+
...
25+
}
26+
}
27+
28+
class ShipArrival implements IArrival
29+
{
30+
public function getProducts(): array
31+
{
32+
...
33+
}
34+
}
35+
36+
class StockControl
37+
{
38+
const TRUCK_ARRIVAL = 1;
39+
const SHIP_ARRIVAL = 2;
40+
41+
private function getArrival(int $arrivalType): IArrival
42+
{
43+
if ($arrivalType === self::TRUCK_ARRIVAL) {
44+
return new TruckArrival();
45+
}
46+
if ($arrivalType === self::SHIP_ARRIVAL) {
47+
return new ShipArrival();
48+
}
49+
}
50+
51+
public function control()
52+
{
53+
...
54+
$arrival = $this->getArrival($arrivalType);
55+
$products = $arrival->getProducts();
56+
...
57+
}
58+
}
59+
```
60+
61+
Таким образом происходит деление задачи на две подзадачи. Первое определить сам товар и оприходовать его. Вторая разместить на складе.
62+
63+
Так же есть разные вариации, трактования и подтипы паттернов, что привело к нарушению принципа не плодить сущности сверх необходимого.

architecture/grasp.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,6 @@ class Bill {
8989
...
9090
}
9191
}
92-
9392
```
9493

9594
Из примера видно, что у продукта из счёта есть свойства, которые позволяют рассчитать стоимость одной позиции. Значит она и должна быть рассчитана в `BillProduct`.

architecture/oop.md

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,25 +7,29 @@
77

88
В пример можно привести формирование одного счета в кафе, где за бар и еду платим отдельно из-за разного формирования цены.
99
```php
10-
interface IBill {
10+
interface IBill
11+
{
1112
public function getSum(): float;
1213
}
1314

14-
class FoodBill implements IBill {
15+
class FoodBill implements IBill
16+
{
1517
public function getSum(): float
1618
{
1719
...
1820
}
1921
}
2022

21-
class DrinkBill implements IBill {
23+
class DrinkBill implements IBill
24+
{
2225
public function getSum(): float
2326
{
2427
...
2528
}
2629
}
2730

28-
class FullBill {
31+
class FullBill
32+
{
2933
private array $bills = [];
3034

3135
public function addBill(IBill $bill): void
@@ -43,8 +47,8 @@ class FullBill {
4347
}
4448
}
4549
```
46-
При данной реализации добавить отдельный расчет за табачные изделия не составит труда. Но тут так же играет роль сам бизнес процесс, который и диктует требования к реализации.
47-
Всегда из поставленной задачи необходимо попытаться предположить как может измениться процесс. Так как можно усложнить приложение там, где никогда процесс работы приложения не поменяется.
50+
При данной реализации добавить отдельный расчет, реализующий другую логику формирования суммы, не составит труда. Но тут так же играет роль сам бизнес процесс, который и диктует требования к реализации.
51+
Всегда из поставленной задачи необходимо попытаться предположить как может измениться процесс. Так как можно усложнить приложение там, где никогда процесс работы не поменяется.
4852

4953
Наследование является достаточно спорным решением для достижения полиморфизма из-за рисков создания God object и/или уход в излишнюю абстракцию, которая приведет к сильной зависимости(связанности) классов между собой вдобавок усложнив читабельность кода.
5054
По возможности не используйте абстрактные классы, если не достигается полиморфизм.

architecture/solid.md

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,34 +5,39 @@
55
Dependency Inversion (Принцип инверсии зависимостей) главная цель данного принципа уменьшить зацепление классов между собой.
66

77
```php
8-
interface FileContract {
8+
interface FileContract
9+
{
910
public function getDocumentBody(): string;
1011
}
1112

12-
class Bill implements FileContract {
13+
class Bill implements FileContract
14+
{
1315
public function getDocumentBody(): string
1416
{
1517
...
1618
return "Bill sum";
1719
}
1820
}
1921

20-
class Report implements FileContract {
22+
class Report implements FileContract
23+
{
2124
public function getDocumentBody(): string
2225
{
2326
...
2427
return "Report data";
2528
}
2629
}
2730

28-
class Printer {
31+
class Printer
32+
{
2933
public function execute(FileContract $file)
3034
{
3135
// логика печати
3236
}
3337
}
3438

35-
class PrintBill {
39+
class PrintBill
40+
{
3641
public function execute()
3742
{
3843
$printer = new Printer();
@@ -42,7 +47,8 @@ class PrintBill {
4247
}
4348
}
4449

45-
class PrintReport {
50+
class PrintReport
51+
{
4652
public function execute()
4753
{
4854
$printer = new Printer();
@@ -62,7 +68,8 @@ Dependency injection при помощи абстракции один раз н
6268
Примеры реализации есть в вендорном пакете [php di](https://github.com/PHP-DI/PHP-DI), [symfony](https://symfony.com/doc/current/components/dependency_injection.html) и [laravel](https://laravel.com/docs/8.x/providers)
6369

6470
```php
65-
class PrintReport {
71+
class PrintReport
72+
{
6673
private Printer $printer;
6774

6875
public function __construct(Printer $printer)

0 commit comments

Comments
 (0)