Чистый код — функции и классы

Чистые функции и классы

Классы и функции — важнейшие блоки построение кода проекта. Это делает их основными целями при работе с чистотой кода.

Рекомендации к написанию функций:

  • Функции должны быть как можно компактнее. Можно ориентироваться на размер максимум 20 строк, чтобы понимать масштабы
  • Функции могут содержать вложенности (циклы foreach, if else, while). Следует уменьшить число вложенностей до 1-2. В идеале одна вложенность. Больший уровень вложенности можно помещать в отдельные функции
  • Функция должна выполнять одну операцию. Это упрощает разделения алгоритма на функции
  • Если в функции есть “секции” (например объявление, инициализация, сбор данных и т.д.) значит она выполняет несколько операций. Следует разделить на разные функции
  • При этом имя функции следует выбирать таким образом, чтобы доходчиво объяснить операцию
  • Связанные функции следует размещать ближе к “родительским”. Создаем, таким образом, понятный уровень иерархии, который читается сверху вниз
  • Следует минимизировать количество аргументов функций. Большое количество аргументов усложняет понимание функции. Лучше всего читаются функции без аргументов. Они могут манипулировать полями классов ($this->variable). 
  • Если в функцию нужно передавать много аргументов, следует рассмотреть объединение их в класс, тогда из аргументов будет только один объект класса

Классы:

  • Оптимальный вариант строения класса: сначала идут открытые переменные, затем приватные. За списком переменных идут публичные функции. За каждой публичной функцией следуют приватные вспомогательные функции. При таком размещении, класс читается как газетная статья
  • Классы должны быть компактными. Размер класса может определить принцип единой ответственности. Этот принцип говорит, что класс должен иметь только одну причину для изменения. Пример класса с 2мя причинами для изменения ниже
Class UserDashboard {
    public function getLastFocusedElement() {…};
    public function setLastFocusedElement() {…};
    public function getMajorVersion() {…};
    public function getMinorVersion() {…};
}

Его стоит разделить на 2 класса: первый  — для работы с выделенным элементом дашборда, второй — для версионирования дашборда

  • Следует стремиться к бОльшей связанности в классах. БОльшая связанность достигается, когда бОльшая часть методов класса использует бОльшую часть переменных экземпляра класса. Разделение большого метода на серию более мелких снижает связанность в классе. После этого становится понятнее как разбить исходный класс на более компактные. В результате, повышается связанность и чистота классов, полученных из исходного класса.