@@ -207,6 +207,64 @@ $city = $user->address->city();
207207> которые
208208> не должны выполнять никаких действий.
209209
210+
211+
212+ Даже для простых типов данных — строк и чисел — стоит использовать объекты.
213+ Мы уже ранее рассматривали пример класса ` Temperature ` , который скрывает от нас работу с единицами измерения.
214+ Теперь рассмотрим аналогичный подход на примере строк.
215+
216+ Часто обработку строки записывают через вложенные вызовы:
217+ ``` php
218+ // Плохо [✗]
219+ echo strtoupper(trim(substr($input, 0, 10)));
220+ ```
221+
222+ Код работает, но превращается в «матрёшку» из-за их чрезмерного количества вложенных функций.
223+ Читать его приходится справа налево, что совсем не свойственно латинице, на которой мы пишем код.
224+ Это увеличивает когнитивную нагрузку и скрывает намерение.
225+
226+ Для чтения удобнее сделать класс:
227+
228+ ``` php
229+ // Хорошо [✓]
230+ class Text implements Stringable {
231+ public function __construct(private string $value) {}
232+
233+ public function cut(int $length): static
234+ {
235+ return new static(substr($this->value, 0, $length));
236+ }
237+
238+ public function trim(): static
239+ {
240+ return new static(trim($this->value));
241+ }
242+
243+ public function value(): string
244+ {
245+ return $this->value;
246+ }
247+
248+ // ...
249+ }
250+ ```
251+
252+ С таким классом обработка становится читаемой и выразительной:
253+
254+ ``` php
255+ echo (new Text($input))
256+ ->cut(10)
257+ ->trim()
258+ ->upper()
259+ ->value();
260+ ```
261+
262+ Теперь мы читаем цепочку шагов, а не пытаемся расшифровать вложенные функции.
263+
264+ > ** Обратите внимание на иммутабельность.**
265+ > Каждый шаг возвращает новый объект при котором не будет скрытых побочных эффектов.
266+
267+
210268### Ссылки делают код хрупким
211269
212270Передавать переменную по ссылке кажется удобным: функция сразу меняет её — меньше кода, меньше присваиваний.
@@ -304,7 +362,7 @@ class NewsGrouperBySoundex extends NewsGrouper
304362
305363На первый взгляд — разумно. Но через месяц таких потомков будет уже пять, потом десять.
306364Затем понадобится изменить в части наследников нормализацию имен для городов. Кто-то добавит изменения в
307- родительский класс, чтобы «не трогать потомков», — и структура начинает шататься.
365+ родительский класс, чтобы «не трогать потомков» — и структура начинает шататься.
308366
309367Вы смотрите на этот зоопарк и задаётесь вопросом: где живёт нужная логика? В родителе? В потомке? В обоих? В каком из
310368пятнадцати классов?
0 commit comments