Skip to content

Commit 8dcad54

Browse files
committed
Init commit
1 parent 8c6469b commit 8dcad54

File tree

4 files changed

+194
-0
lines changed

4 files changed

+194
-0
lines changed

.gitignore

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
### Linux ###
2+
*~
3+
4+
# temporary files which can be created if a process still has a handle open of a deleted file
5+
.fuse_hidden*
6+
7+
# KDE directory preferences
8+
.directory
9+
10+
# Linux trash folder which might appear on any partition or disk
11+
.Trash-*
12+
13+
# .nfs files are created when an open file is removed but is still being accessed
14+
.nfs*
15+
16+
### macOS ###
17+
# General
18+
.DS_Store
19+
.AppleDouble
20+
.LSOverride
21+
22+
# Icon must end with two \r
23+
Icon
24+
25+
26+
# Thumbnails
27+
._*
28+
29+
# Files that might appear in the root of a volume
30+
.DocumentRevisions-V100
31+
.fseventsd
32+
.Spotlight-V100
33+
.TemporaryItems
34+
.Trashes
35+
.VolumeIcon.icns
36+
.com.apple.timemachine.donotpresent
37+
38+
# Directories potentially created on remote AFP share
39+
.AppleDB
40+
.AppleDesktop
41+
Network Trash Folder
42+
Temporary Items
43+
.apdisk
44+
45+
.idea
46+
47+
# CMake
48+
cmake-build-*/
49+
50+
# File-based project format
51+
*.iws
52+
53+
# IntelliJ
54+
out/
55+
56+
# mpeltonen/sbt-idea plugin
57+
.idea_modules/
58+
59+
# JIRA plugin
60+
atlassian-ide-plugin.xml
61+
62+
# Crashlytics plugin (for Android Studio and IntelliJ)
63+
com_crashlytics_export_strings.xml
64+
crashlytics.properties
65+
crashlytics-build.properties
66+
fabric.properties
67+
68+
### Windows ###
69+
# Windows thumbnail cache files
70+
Thumbs.db
71+
Thumbs.db:encryptable
72+
ehthumbs.db
73+
ehthumbs_vista.db
74+
75+
# Dump file
76+
*.stackdump
77+
78+
# Folder config file
79+
[Dd]esktop.ini
80+
81+
# Recycle Bin used on file shares
82+
$RECYCLE.BIN/
83+
84+
# Windows Installer files
85+
*.cab
86+
*.msi
87+
*.msix
88+
*.msm
89+
*.msp
90+
91+
# Windows shortcuts
92+
*.lnk
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
## Функциональное программирование
2+
3+
В PHP функциональное программирование реализовано не полностью.
4+
Но из данного подхода написания кода можно подчеркнуть самую главную концепцию - **Чистые функции**.
5+
6+
_Чистыми называют функции, которые не имеют побочных эффектов ввода-вывода и памяти (они зависят только от своих параметров и возвращают только свой результат).(с)Википедия_
7+
8+
В PHP есть чистые функции из коробки. К примеру `array_map` или `array_filter`. Так же есть и грязные функции к примеру `date`
9+
10+
Чистые функции имеют огромное преимущество - предсказуемое поведение.
11+
```php
12+
$orderProducts = [
13+
['quantity' => 3, 'price' => 3.6],
14+
['quantity' => 4, 'price' => 12.3],
15+
];
16+
17+
$orderProductsSum = array_map(fn($product) => $product['quantity'] * $product['price'], $orderProducts);
18+
$orderSum = array_sum($orderProductsSum);
19+
```
20+
21+
Эти функции не модифицируют входные параметры. При одинаковых входных параметров всегда на выходе один и тот же результат.
22+
23+
Данную концепцию можно перенести и на методы объектов.

architecture/oop.md

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
## Объектно-ориентированное программирование
2+
3+
Цель ООП достичь полиморфизма. Полиморфизм обеспечивает масштабируемость проекта. Еще оно преимущество ООП это инкапсуляция.
4+
5+
Полиморфизм представляет собой единый сценарий обработки объектов разных экземпляров классов.
6+
В первую очередь полиморфизма нужно добиться для классов, которые реализуют бизнес логику.
7+
8+
В пример можно привести формирование одного счета в кафе, где за бар и еду платим отдельно из-за разного формирования цены.
9+
```php
10+
interface IBill {
11+
public function getSum(): float;
12+
}
13+
14+
class FoodBill extends IBill {
15+
public function getSum(): float
16+
{
17+
...
18+
}
19+
}
20+
21+
class DrinkBill extends IBill {
22+
public function getSum(): float
23+
{
24+
...
25+
}
26+
}
27+
28+
class FullBill {
29+
private array $bills = [];
30+
31+
public function addBill(IBill $bill): void
32+
{
33+
$this->bills[] = $bill;
34+
}
35+
36+
public function getBill()
37+
{
38+
$sum = 0;
39+
foreach($this->bills as $bill) {
40+
$sum += $bill->getSum();
41+
}
42+
...
43+
}
44+
}
45+
```
46+
При данной реализации добавить отдельный расчет за табачные изделия не составит труда. Но тут так же играет роль сам бизнес процесс, который и диктует требования к реализации.
47+
Всегда из поставленной задачи необходимо попытаться предположить как может измениться процесс. Так как можно усложнить приложение там, где никогда процесс работы приложения не поменяется.
48+
49+
Наследование является достаточно спорным решением для достижения полиморфизма из-за рисков создания God object.
50+
God object - это огромная проблема для приложения. По возможности не используйте абстрактные классы, если не достигается полиморфизм.
51+

readme.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
## Методические указания по развитию приложения PHP
2+
3+
Здесь будет описан набор стратегий/рекомендаций, которые позволяют масштабировать команду разработки и структурировать проект.
4+
Для достижения масштабирования команды ставиться всего две цели, порождающие процесс, необходимо писать код как один разработчик и писать документацию так, чтоб ее понимал человек, пришедший с улицы.
5+
Эти цели недостижимы. Они ставятся для порождения процесса, улучшающего понимание проекта в команде.
6+
7+
Указания будут разделяться на две части:
8+
- Сопровождение уже существующего продукта
9+
- Создание нового приложения
10+
11+
Перед внедрением каких-либо процессов необходимо провести экспертный анализ.
12+
Если на проекте код находится на физическом сервере или VPS, код на сервер доставляется пуллом с репозитория актуальной версии проекта или прямой доставкой приложения по SSH.
13+
А архитектура проекта заканчивается на MVC.
14+
В таком случае категорически не рекомендуется пытаться все перевести на микросервисы, которые будут крутиться в kubernetes в облаке.
15+
На проекте работают люди, и при внедрении актуальных инструментов, архитектурных решений и сервисов, есть риск столкнуться с непониманием и не принятием со стороны команды.
16+
Проект должен прожить все этапы развития. Сколько времени займет создание процесса и внедрение новых инструментов зависит только от команды.
17+
18+
Команда не однородна. Ориентиром окончания внедрения процесса можно считать когда 80% команды следует выстроенному процессу.
19+
Внедрение новой технологии порождает/изменяет/накладывает ограничения на процесс работы.
20+
Перед внедрением нужно провести анализ готовности команды.
21+
22+
### Оглавление
23+
24+
- Базовые подходы к написанию кода
25+
- [Чистый код](https://github.com/3xter/clean-code-php)
26+
- [Функциональное программирование](./architecture/functional-programming.md)
27+
- [Объектно-ориентированное программирование](./architecture/oop.md)
28+

0 commit comments

Comments
 (0)