Найти в Дзене
КиберMamedov 💻🔥

Как создать чистый код в ООП: секреты связности классов

Как сделать так, чтобы тебя не выгнали из проекта после того, как коллеги увидят твой код? Народная мудрость: пиши код так, будто его будет читать агрессивный маньяк, который знает где ты живешь. Ты можешь подумать, что все это лирика и решишь закрыть статью. Пожалуйста, это твой выбор, но с проекта тогда тебя точно выгонят. 🙂 Цель этой статьи рассказать о важности выдерживания высокой связности в классах. Надеюсь, что с понятием класса вы уже знакомы и знаете тонкости о принципе единой ответственности. Если же нет, то предварительно ознакомьтесь с данной статьей: https://dzen.ru/a/ZfcTvaGadztaWs-A?share_to=link Что такое связность? Разбор того, что такое связность мы начнем с одного очень точного утверждения: Класс с низкой связностью труднее понять, использовать и поддерживать. Чтобы до конца осознать это утверждение, в первую очередь дадим определение термину связность. Есть классическая, но сложная формулировка, звучит она так: Связность класса - это мера силы взаимосвязанности эл
Оглавление

Как сделать так, чтобы тебя не выгнали из проекта после того, как коллеги увидят твой код?

Народная мудрость: пиши код так, будто его будет читать агрессивный маньяк, который знает где ты живешь.

Ты можешь подумать, что все это лирика и решишь закрыть статью. Пожалуйста, это твой выбор, но с проекта тогда тебя точно выгонят. 🙂

Цель этой статьи рассказать о важности выдерживания высокой связности в классах.

Надеюсь, что с понятием класса вы уже знакомы и знаете тонкости о принципе единой ответственности. Если же нет, то предварительно ознакомьтесь с данной статьей:

https://dzen.ru/a/ZfcTvaGadztaWs-A?share_to=link

Что такое связность?

Разбор того, что такое связность мы начнем с одного очень точного утверждения:

Класс с низкой связностью труднее понять, использовать и поддерживать.

Чтобы до конца осознать это утверждение, в первую очередь дадим определение термину связность. Есть классическая, но сложная формулировка, звучит она так:

Связность класса - это мера силы взаимосвязанности элементов внутри модуля, а также степень, в которой задачи, выполняемые этим модулем, связаны друг с другом.

Это можно перефразировать таким образом:

Каждый метод класса должен использовать одну или несколько переменных экземпляра класса.

Звучит все еще непонятно, давайте рассмотрим на примере. Так выглядит класс обладающий высокой связностью:

Класс калькулятора с высокой связностью
Класс калькулятора с высокой связностью

Этот класс представляет простой калькулятор, который может выполнять четыре основных арифметические операции:

  • сложение;
  • вычитание;
  • умножение;
  • деление.

Все методы класса тесно связаны с основной целью объекта калькулятора - вычислением значения. Это легко определяется по тому, что поле value используется в каждом методе.

Выходит, что все поля класса используются всеми его методами. И здесь вы наверняка зададите вопрос:

А что там задействовать то? Там же всего одно поле в классе определено.

В этом и состоятельность принципа связности классов. Если вы её обеспечиваете, то ваши классы читаются легко, иначе данный процесс усложняется. Рассмотрим тот же класс, но со слабой связностью.

Класс калькулятора с низкой связностью
Класс калькулятора с низкой связностью

Обратите внимание, в классе появилось четыре новых метода:

  1. greet - приветствие пользователя;
  2. shutdown - прощание с пользователем;
  3. restart - начать заново;
  4. update_settings - добавление каких-то настроек, метод пока не заполнен.

Видно, что класс имеет единую ответственность “делать расчеты”, но в него добавлены методы, которые не отвечают данной ответственности.

Если представить любой класс визуально, то можно рассмотреть его, как Кубик-Рубика.

Визуализация класса
Визуализация класса

Любой класс - это своего рода конструктор, который состоит из маленьких частей.

Большой Кубик-Рубик, в котором гармонируют все маленькие кубики - это отражение высокой связности класса. Кубики в нем - это методы, которые вливаются в общий механизм этого класса.

Маленький Кубик-Рубика и горка из кубиков справа, это те методы, которые не используют переменных экземпляра класса, поэтому они стоят рядом.

Другими словами, экземпляр класса - это объект (остов Кубика-Рубика), переменные этого экземпляра являются пазами, в которые вставляются кубики. Вместе они формируют единый механизм.

Те кубики, которые не используют переменных экземпляра класса, они не имеют пазов для вставки. Поэтому эти кубики лежат рядом с основным Кубиком-Рубика, и не образуют общей системы.

Как повысить связность класса?

Наверняка у вас возник вопрос:

И что же теперь, удалять нужные методы из-за какой-то нарушенной связности?

Конечно же, нет. Речь одет не об оптимизации кода с целью удаления методов, а о принципе разделяй и властвуй.

Если в основном классе прослеживается понижение связности, то это повод задуматься о выделении из него нового самостоятельного класса.

Если рассмотреть наш класс калькулятора, то из него может выделиться еще один класс.

Выделение самостоятельного класса и повышение связности
Выделение самостоятельного класса и повышение связности

Как видите, класс CalculatorController взял на себя отдельную ответственность по управлению калькулятором.

Таким образом можно выделить и третий класс с настройками и т.д.

Заключение

В результате вы получаете отдельные, независимые классы, каждый из которых решает свою задачу.

Если в одном из классов, вдруг предстоит сделать изменение, то он никак не затронет остальные классы и проект будет оставаться стабильным.

Когда у вас низкая связность класса, то это означает, что класс пытается охватить широкую зону ответственности.

Если вдруг придется вносить изменения по одной из частей, за которую он отвечает, то это повлечет проблемы во всех остальных зонах ответственности класса.

Простыми словами - многое поломается.

Читайте рубрику Чистый код, чтобы радовать своих коллег и дарить им эстетическое наслаждение от вашего кода.

Наука
7 млн интересуются