Skip to content

Commit 326caae

Browse files
committed
WIP
1 parent 42bf1cf commit 326caae

File tree

3 files changed

+96
-63
lines changed

3 files changed

+96
-63
lines changed

content/007-size.md

Lines changed: 60 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -2,81 +2,90 @@
22

33
В детстве мы играли в простую, но удивительно поучительную игру. Дети становились в круг, и один из них начинал перекидывать мяч. Но это был не просто мяч — это была «горячая картошка». И правила были предельно ясны: поймал — тут же бросай дальше. Максимум одна секунда. Кто задержал — проиграл. Никаких пауз, планов и стратегий. Только действие. Только передача.
44

5-
Если ты хоть на мгновение задумался — обжёгся. Если начал размышлять, кому лучше отдать мяч — он уже слишком горяч. Ты должен доверять интуиции, не копаться в себе и не мешать движению игры.
5+
Если ты хоть на мгновение задумался — обжёгся.
6+
Ты должен доверять интуиции, не копаться в себе и не мешать движению игры.
67

7-
Теперь забудьте детей. Вспомните ваш код.
8+
Так и с кодом. Каждый класс, каждый метод, каждая строка — это не долгий монолог, а быстрый пас, моментальный результат, передача задачи следующему игроку. Код не должен «держать мяч» в руках подолгу, копаться в себе, раздувать внутренние сложности, мешать движению.
89

9-
Так и с кодом. Каждый класс, каждый метод, каждая строка — это не долгий монолог, а быстрый пас, моментальный результат, передача задачи следующему игроку. Код не должен цепляться за состояние, не должен «держать мяч» в руках подолгу, копаться в себе, раздувать внутренние сложности, мешать движению.
10+
Пусть у каждого будет одна цель — передать задачу и не тормозить процесс.
11+
Ассоциируйте это как -
1012

11-
- Метод — это пас.
1213
- Класс — это игрок.
14+
- Метод — это пас. Он может быть левой рукой, правой, можно схватить или отбросить мяч.
1315
- Строки — это момент перед броском.
1416

15-
Пусть у каждого будет одна цель — передать задачу и не тормозить процесс.
16-
17-
18-
Что происходит, когда один из игроков решает поиграть «всерьёз»? Он ловит мяч и… не бросает. Он встал посреди круга и начал делать кувырки, включил музыку, рассказал стихотворение и только потом — спустя долгие секунды — наконец передал мяч дальше.
19-
20-
То же самое происходит с кодом, когда вы пишете вот так:
2117

18+
Когда момент перед пасом выглядит вот так:
2219

2320
```php
2421
// Слишком длинный метод ❌
25-
class User {
26-
public function export()
27-
{
28-
// ...
29-
// ...
30-
// 1000 строк кода
31-
32-
return $result;
33-
}
22+
public function export()
23+
{
24+
// ...
25+
// ...
26+
// 1000 строк кода
27+
28+
return $result;
3429
}
3530
```
3631

37-
Этот метод — как тот самый противный игрок который держит «картошку» и устраивает из простого действия целый спектакль. Он делает всё: грузит данные, валидирует, обрабатывает, сохраняет, отправляет письма, пишет в лог — и при этом не отдаёт никому эстафету.
38-
39-
Разве это честная игра?
32+
То получается, что игрок ловит мяч и...
33+
Он ловит мяч и… не бросает. Он встал посреди круга и начал делать кувырки, включил музыку, рассказал стихотворение и только потом — спустя долгие секунды — наконец передал мяч дальше.
4034

35+
Это раздражает не только других игроков при игре, ведь тоже самое происходит с кодом, когда его размер выходит за разумные пределы. Длинные методы и классы начинают
36+
запутывать, а вместо ясности мы получаем неразбериху, с которой сложно работать.
4137

42-
То же самое происходит с кодом, когда его размер выходит за разумные пределы. Длинные методы и классы начинают
43-
запутывать, а вместо ясности мы получаем неразбериху, с которой сложно работать. Точно так же, как перегруженные
44-
предложения, огромные блоки кода перегружают восприятие. Читая их, трудно понять, о чём конкретно идёт речь, и
45-
приходится возвращаться к началу, чтобы разобраться, что вообще происходит.
38+
Точно так же, как перегруженные предложения, огромные блоки кода перегружают восприятие. Читая их, трудно понять, о чём конкретно идёт речь, и приходится возвращаться к началу, чтобы разобраться, что вообще происходит.
4639

47-
48-
Когда функция слишком большая, начинают разбивать её на логические шаги, например:
40+
Худшие разработчики будут гордиться таким кодом и говорить, да он сложный, да он умный, да он крутой. Но на самом деле это просто неумение передать мяч дальше. Ленивые или некомпетентные программисты будут разбивать ее на логические шаги, например:
4941

5042
```php
5143
// Слишком длинный метод ❌
52-
class User {
53-
public function export()
54-
{
55-
// Загрузка данных
56-
// Валидация
57-
// Преобразование
58-
// Генерация отчёта
59-
// Сохранение в файл
60-
// Отправка по почте
61-
// Логирование
62-
// И ещё десяток шагов...
63-
$this->step();
64-
$this->step();
65-
$this->step();
66-
67-
return $result;
68-
}
44+
public function export()
45+
{
46+
// Загрузка данных
47+
// Валидация
48+
// Преобразование
49+
// Генерация отчёта
50+
// Сохранение в файл
51+
// Отправка по почте
52+
// И ещё десяток шагов...
53+
$this->step();
54+
$this->step();
55+
$this->step();
56+
57+
$this->load();
58+
$this->validate();
59+
$this->transform();
60+
$this->generateReport();
61+
// И ещё десяток шагов...
62+
$this->sendMail();
63+
64+
return $result;
6965
}
7066
```
7167

72-
Этот метод как игрок, который вместо быстрого паса:
73-
74-
делает кувырок, ставит музыку, и только потом — спустя 300 строк — наконец кидает дальше.
68+
На первый взгляд — красиво, ведь метод `export()` в пять строчек. Но где тут само «сердце»? Вам приходится прыгать из метода в метод, искать смысл: «а, здесь что-то подгружается, а вот здесь валидируется, а вот здесь ещё что-то происходит…». Получается эффект «многостёковой передачной паутины»: глаз бегает по коду без чувства завершённости.
7569

70+
Правильно дробить — значит давать каждому методу собственную осмысленную ответственность, а не делать «пустую оболочку» ради экономии строк. Если метод публичный, он должен отражать высокоуровневый шаг, понятный «с первого взгляда». А приватные методы должны решать действительно отдельный логический блок, а не просто «задёргивать» следующий вызов без собственной логики.
7671

77-
Код читается как рассказ — от начала до конца, но при этом все подробности реализации должны быть скрыты.
72+
Хороший метод публичного API должен вызывать у вас реакцию: «Да, это целостный шаг!» Например:
7873

74+
```php
75+
// Хорошо ✅
76+
public function export()
77+
{
78+
$exporter = new ModelExport($this);
79+
80+
$content = $exporter->toString();
81+
82+
return $user->notify(ExportNotification::class, [
83+
'content' => $content,
84+
]);
85+
}
86+
```
7987

80-
---
88+
Теперь мы наглядно видим, что сделали пас.
8189

82-
Игра «горячая картошка» научила нас — не задерживать ответственность. Теперь разберём конкретные техники, которые позволяют быстрее передать «мяч» дальше.
90+
Игра «горячая картошка» научила нас — не задерживать ответственность.
91+
Теперь разберём конкретные техники, которые позволяют быстрее передать «мяч» дальше.

content/008-early-exit.md

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,41 @@
11
# Ранний выход
22

3+
Когда ты рассказываешь какую-то историю, но все время перебиваешь себя, добавляя новые детали.
4+
Слушатель теряется, забывает с чего ты начал и ему становится всё труднее следить за ходом твоей мысли.
5+
В конце концов история превращается в запутанную кучу информации.
36

4-
> Каждый участок программы должен хотеть предать результат как можно скорее, как в игре "Горячая картошка".
57

8+
В прошлой главе мы говорили о том, как важно отдать результат как можно быстрее.
9+
И одна из проблем это глубина вложенности кода. ~~Зачастую мы мыслим как блок схема где ~~
10+
11+
выглядит как "если x равен y" то сделать действие опять таки если "y равен z" то сделать действие и так далее.
12+
13+
> TODO: сделать пример алгоритма с глубокой вложенностью ?
14+
15+
пример уровня вложености:
16+
17+
```php
18+
if($condition) { // уровень 1
19+
foreach($users as $user) { // уровень 2
20+
if($user->isActive()) { // уровень 3
21+
// Обработка
22+
}
23+
}
24+
}
25+
```
26+
27+
Каждый уровень увеличивает сложность, при чем не пропорционально, если на первом сложность для понимания составляет условно 3, то на третьем уровне она не будет 9, а гораздо больше.
28+
29+
30+
31+
Следует стремиться к минимизации глубины вложенности кода и предпочтительно располагать основные сценарии выполнения функции без вложенности.
32+
33+
```php
34+
35+
```
636

7-
Представь, что ты пытаешься рассказать какую-то историю, но всё время перебиваешь себя, добавляя новые детали.
8-
Ты начинаешь одну мысль, а потом резко перескакиваешь к другой.
9-
Cлушатель теряется, забывает, с чего ты начинал, и ему становится всё труднее следить за ходом твоей мысли.
10-
В конце концов история превращается в запутанную кучу информации.
1137

12-
Следует стремиться к минимизации глубины вложенности кода и предпочтительно располагать позитивные сценарии выполнения функции без вложенности. Это упрощает чтение и понимание кода, делает его более структурированным и лёгким для поддержки.
38+
Это упрощает чтение и понимание кода, делает его более структурированным и лёгким для поддержки.
1339

1440
```php
1541
// Плохо ❌

content/014-upgrade.md

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,14 @@
1919

2020
Разработчики вынуждены тратить время на создание временных решений и костылей для работы с устаревшими компонентами, вместо использования стандартных средств и функциональности, доступных в новых версиях.
2121

22-
> Пример: Разработчики, использующие Laravel 5.0, разрабатывали собственную проверку, чтобы клиент мог просматривать только свои заказы в интернет-магазине. Однако менее чем через полгода в версии 5.1 были представлены Policies, ставшие стандартом. Вместо обновления как можно скорее, увеличение кодовой базы лишь увеличивало время на последующее устранение технического долга.
22+
Пример:
23+
> Разработчики, использующие Laravel 5.0, разрабатывали собственную проверку, чтобы клиент мог просматривать только свои заказы в интернет-магазине. Однако менее чем через полгода в версии 5.1 были представлены Policies, ставшие стандартом. Вместо обновления как можно скорее, увеличение кодовой базы лишь увеличивало время на последующее устранение технического долга.
2324
2425
### Усложнение процесса обновления
2526
Большие разрывы в обновлениях создают снежный ком эффект, который требует значительных усилий и ресурсов для обновления проекта. Это может привести к тому, что если вы захотите обновиться, придется потратить на это несколько месяцев без внедрения какого-либо нового функционала.
2627

27-
> Пример: Разработчики “Яндекс.Еда” пропустили три мажорных релиза, и полное обновление заняло целый год. За время накопления технического долга поддержка фреймворка, пакетов и самого PHP изменилась.
28-
29-
### Всё равно переписывать. Только позже и дороже.
30-
31-
Те временные решения, которые создали разработчики на первом шаге, с большой вероятностью не будут оптимальными в новых версиях, так как “из коробки” будут доступны отраслевые решения. Так что разработчик теперь потратит время на то, чтобы избавиться от собственного ранее написанного кода (а это очень больно).
28+
Пример:
29+
> Разработчики “Яндекс.Еда” пропустили три мажорных релиза, и полное обновление заняло целый год. За время накопления технического долга поддержка фреймворка, пакетов и самого PHP изменилась.
3230
3331

3432
### Актуальность — это и про найм тоже

0 commit comments

Comments
 (0)