Архитектура кода

ООП

ООП – базовый принцип построения кода

Плюсы:

  • Поддержка свойств-абстракций: абстракция, наследование, полиморфизм

Минусы:

  • Большое нагромождение концепций из ООП (фабрики, синглтоны, ...)

  • Легко ошибиться

Принципы ООП

SOLID

  • Single Responsibility Principle — ваши компоненты (функции, классы, файлы) не должны решать сразу несколько задач, не превращаться в космолеты

  • Open-Closed Principle — ваши компоненты (функции, классы) должны быть закрыты для модификации, но открыты для расширения. То есть, расширение функциональности не должно приводить к дописыванию внутрь ваших функций, которые не отвечают за расширяемую функциональность

  • Liskov Substitution Principle — принцип замещения Барбары Лисков — если функция умеет работать с базовым классом, то она должна работать и со всеми наследниками

  • Interface Segregation Principle — либо все наследники реализуют интерфейс, либо игнорируют. Можно разрешить через композицию интерфейсов

  • Dependency Inversion Principle — работаем с интерфейсами, а не с конкретными реализациями

KISS

Keep it simple and stupid

  • Создаем небольшие методы, выполняющие примерно то, что от них ожидают.

  • Каждый метод решает одну небольшую проблему.

  • Возможно, вам не нужен ООП

  • Даем полное наименование переменным, а не a (за буквы не платим)

  • Гуглите решения

  • Используйте Композицию вместо Наследования

  • Длинные проверки разбиваем на отдельные переменные.

if (a > b || (c != d)) && (d < k && a < k) {
    print("Good job!")
}
// Заменяем на 
let jobIsGood = a > b || (c != d)`
let jobIsDone = (d < k && a < k)
if jobIsGood && jobIsDone {
    print("Good job!")
}

Паттерны проектирования

Ресурс с описанием паттернов и с примерами на разных языках программирования: https://refactoring.guru/

Паттерн Стратегия

Поведенческий паттерн проектирования, который определяет семейство схожих алгоритмов и каждый помещает в отдельный класс.

Паттерн Прокси

Компонент, скрывающий конкретные обращения к разным ресурсам и предоставляющий единый интерфейс на основе аргументов

Last updated