|
2 | 2 |
|
3 | 3 | В детстве мы играли в простую, но удивительно поучительную игру. Дети становились в круг, и один из них начинал перекидывать мяч. Но это был не просто мяч — это была «горячая картошка». И правила были предельно ясны: поймал — тут же бросай дальше. Максимум одна секунда. Кто задержал — проиграл. Никаких пауз, планов и стратегий. Только действие. Только передача. |
4 | 4 |
|
5 | | -Если ты хоть на мгновение задумался — обжёгся. Если начал размышлять, кому лучше отдать мяч — он уже слишком горяч. Ты должен доверять интуиции, не копаться в себе и не мешать движению игры. |
| 5 | +Если ты хоть на мгновение задумался — обжёгся. |
| 6 | +Ты должен доверять интуиции, не копаться в себе и не мешать движению игры. |
6 | 7 |
|
7 | | -Теперь забудьте детей. Вспомните ваш код. |
| 8 | +Так и с кодом. Каждый класс, каждый метод, каждая строка — это не долгий монолог, а быстрый пас, моментальный результат, передача задачи следующему игроку. Код не должен «держать мяч» в руках подолгу, копаться в себе, раздувать внутренние сложности, мешать движению. |
8 | 9 |
|
9 | | -Так и с кодом. Каждый класс, каждый метод, каждая строка — это не долгий монолог, а быстрый пас, моментальный результат, передача задачи следующему игроку. Код не должен цепляться за состояние, не должен «держать мяч» в руках подолгу, копаться в себе, раздувать внутренние сложности, мешать движению. |
| 10 | +Пусть у каждого будет одна цель — передать задачу и не тормозить процесс. |
| 11 | +Ассоциируйте это как - |
10 | 12 |
|
11 | | -- Метод — это пас. |
12 | 13 | - Класс — это игрок. |
| 14 | +- Метод — это пас. Он может быть левой рукой, правой, можно схватить или отбросить мяч. |
13 | 15 | - Строки — это момент перед броском. |
14 | 16 |
|
15 | | -Пусть у каждого будет одна цель — передать задачу и не тормозить процесс. |
16 | | - |
17 | | - |
18 | | -Что происходит, когда один из игроков решает поиграть «всерьёз»? Он ловит мяч и… не бросает. Он встал посреди круга и начал делать кувырки, включил музыку, рассказал стихотворение и только потом — спустя долгие секунды — наконец передал мяч дальше. |
19 | | - |
20 | | -То же самое происходит с кодом, когда вы пишете вот так: |
21 | 17 |
|
| 18 | +Когда момент перед пасом выглядит вот так: |
22 | 19 |
|
23 | 20 | ```php |
24 | 21 | // Слишком длинный метод ❌ |
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; |
34 | 29 | } |
35 | 30 | ``` |
36 | 31 |
|
37 | | -Этот метод — как тот самый противный игрок который держит «картошку» и устраивает из простого действия целый спектакль. Он делает всё: грузит данные, валидирует, обрабатывает, сохраняет, отправляет письма, пишет в лог — и при этом не отдаёт никому эстафету. |
38 | | - |
39 | | -Разве это честная игра? |
| 32 | +То получается, что игрок ловит мяч и... |
| 33 | +Он ловит мяч и… не бросает. Он встал посреди круга и начал делать кувырки, включил музыку, рассказал стихотворение и только потом — спустя долгие секунды — наконец передал мяч дальше. |
40 | 34 |
|
| 35 | +Это раздражает не только других игроков при игре, ведь тоже самое происходит с кодом, когда его размер выходит за разумные пределы. Длинные методы и классы начинают |
| 36 | +запутывать, а вместо ясности мы получаем неразбериху, с которой сложно работать. |
41 | 37 |
|
42 | | -То же самое происходит с кодом, когда его размер выходит за разумные пределы. Длинные методы и классы начинают |
43 | | -запутывать, а вместо ясности мы получаем неразбериху, с которой сложно работать. Точно так же, как перегруженные |
44 | | -предложения, огромные блоки кода перегружают восприятие. Читая их, трудно понять, о чём конкретно идёт речь, и |
45 | | -приходится возвращаться к началу, чтобы разобраться, что вообще происходит. |
| 38 | +Точно так же, как перегруженные предложения, огромные блоки кода перегружают восприятие. Читая их, трудно понять, о чём конкретно идёт речь, и приходится возвращаться к началу, чтобы разобраться, что вообще происходит. |
46 | 39 |
|
47 | | - |
48 | | -Когда функция слишком большая, начинают разбивать её на логические шаги, например: |
| 40 | +Худшие разработчики будут гордиться таким кодом и говорить, да он сложный, да он умный, да он крутой. Но на самом деле это просто неумение передать мяч дальше. Ленивые или некомпетентные программисты будут разбивать ее на логические шаги, например: |
49 | 41 |
|
50 | 42 | ```php |
51 | 43 | // Слишком длинный метод ❌ |
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; |
69 | 65 | } |
70 | 66 | ``` |
71 | 67 |
|
72 | | -Этот метод как игрок, который вместо быстрого паса: |
73 | | - |
74 | | -делает кувырок, ставит музыку, и только потом — спустя 300 строк — наконец кидает дальше. |
| 68 | +На первый взгляд — красиво, ведь метод `export()` в пять строчек. Но где тут само «сердце»? Вам приходится прыгать из метода в метод, искать смысл: «а, здесь что-то подгружается, а вот здесь валидируется, а вот здесь ещё что-то происходит…». Получается эффект «многостёковой передачной паутины»: глаз бегает по коду без чувства завершённости. |
75 | 69 |
|
| 70 | +Правильно дробить — значит давать каждому методу собственную осмысленную ответственность, а не делать «пустую оболочку» ради экономии строк. Если метод публичный, он должен отражать высокоуровневый шаг, понятный «с первого взгляда». А приватные методы должны решать действительно отдельный логический блок, а не просто «задёргивать» следующий вызов без собственной логики. |
76 | 71 |
|
77 | | -Код читается как рассказ — от начала до конца, но при этом все подробности реализации должны быть скрыты. |
| 72 | +Хороший метод публичного API должен вызывать у вас реакцию: «Да, это целостный шаг!» Например: |
78 | 73 |
|
| 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 | +``` |
79 | 87 |
|
80 | | ---- |
| 88 | +Теперь мы наглядно видим, что сделали пас. |
81 | 89 |
|
82 | | -Игра «горячая картошка» научила нас — не задерживать ответственность. Теперь разберём конкретные техники, которые позволяют быстрее передать «мяч» дальше. |
| 90 | +Игра «горячая картошка» научила нас — не задерживать ответственность. |
| 91 | +Теперь разберём конкретные техники, которые позволяют быстрее передать «мяч» дальше. |
0 commit comments