RUS: Шпаргалки по принципам ООП и Ruby

Определения

Класс - это тип, описывающий устройство объектов.

Объект - сущность в адресном пространстве ЭВМ, появляющаяся при создании экземпляра класса.

Абстракция - использование только тех характеристик объекта, которые с достаточной точностью представляют его в данной системе. Основная идея состоит в том, чтобы представить объект минимальным набором полей и методов и при этом с достаточной точностью для решаемой задачи.

Интерфейс - конструкция в коде программы, используемая для описания совокупности возможностей, предоставляемых классом или компонентом. Набор методов для работы с объектом.

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

Базовые принципы ООП

Инкапсуляция - это принцип сокрытия информации, путем управления областью видимости атрибутов и методов класса. Заключается в том, что данные и функции для обработки данных превратились в свойства и методы объекта, которые заключены в объект. Доступ к этим свойствам и методам доступен только через специально определяемые интерфейсы. Эти интерфейсы называются геттеры и сеттеры. Геттеры получают значение, а сеттеры устанавливают.

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

Полиморфизм - Множество форм реализации одной абстрактной концепции.

Наследственный полиморфизм используется при переопределении методов в потомках класса, а реализация интерфейсного полиморфизма у руби в виде модулей, про которые я уже упоминал. Теперь обо всем по порядку.

Дополнительно:

  • Ассоциация – это когда один класс включает в себя другой класс в качестве одного из полей. Описывается словом «имеет». Выделяют два частных случая ассоциации: композицию и агрегацию.
  • Композиция — включение объектом-контейнером объекта-содержимого и управление его поведением; последний не может существовать вне первого; пример: папка и файлы. Создание внутри контейнера.
class User 
 attr_reader :profile
  def initialize
    @profile = Profile.new
  end
end
  • Агрегация — включение объектом-контейнером ссылки на объект-содержимое; при уничтожении первого последний продолжает существование. Создание вне контейнера.
profile = Profile.new
user = User.new(profile: profile)
  • Делегация — перепоручение задачи от внешнего объекта внутреннему;

Принципы S.O.L.I.D.

SOLID это свод пяти основных принципов ООП, введённый Майклом Фэзерсом в начале нулевых. Эти принципы — часть общей стратегии гибкой и адаптивной разработки, их соблюдение облегчает расширение и поддержку проекта.

  • Single Responsibility Principle (Принцип единственной ответственности)

Каждый класс должен иметь одну и только одну обязанность. Это упрощает расширение системы, редактирование классов.

  • Open Closed Principle (Принцип открытости/закрытости)

Каждый класс должен быть закрыт для изменения и открыт для расширения.

  • Liskov Substitution Principle (Принцип подстановки Барбары Лисков)

Поведение наследуемых классов должно быть ожидаемым для кода, использующего переменные базового класса. Замена предков потомками не должна нарушать ход программы.

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

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

Методы, использующие некий тип, должны иметь возможность использовать его подтипы, не зная об этом.

  • Interface Segregation Principle (Принцип разделения интерфейса)

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

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

  • Dependency Inversion Principle (Принцип инверсии зависимостей)

Система должна конструироваться на основе абстракций «сверху вниз»: не абстракции должны формироваться на основе деталей, а детали должны формироваться на основе абстракций.

Другие принципы

  • DRY (Don’t repeat yourself) - избегайте повторного написания кода, вынося в абстракции часто используемые задачи и данные. Каждая часть вашего кода или информации должна находиться в единственном числе в единственном доступном месте.
  • Convention over configuration (Cоглашение по конфигурации) — принцип проектирования ПО, заключающийся в том, что рассматриваемые аспекты нуждаются в конфигурации тогда и только тогда, когда этот аспект не удовлетворяет некоторой спецификации. Принцип, как правило, применяется в разработке фреймворков и позволяет сократить количество требуемой конфигурации без потери гибкости.

Паттерн MVC

  • Модель - “Maintains the relationship between Object and Database and handles validation, association, transactions”

RESTful