Презентация

ООП в Go: что из классики остается полезным

Материал о том, как идеи ООП переносятся в Go, где заканчиваются классы и начинается композиция, и почему интерфейсы в этом языке играют особую роль.

О чем этот материал

Классы и объекты, инкапсуляция, полиморфизм и адаптация ООП-идей к Go.

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

Что внутри

Ниже краткий план материала. По нему удобно понять, в каком порядке разбирать тему.

  1. Поговорим о том, что такое ООП
  2. Есть ли место ООП в Go
  3. Поговорим еще раз про интерфейсы
  4. Разберем вопросы

А зачем?

  • У нас много связанной логики
  • У нас много похожей логики
  • У наших штук есть состояние (и оно может меняться)
  • Не хотим запоминать какие поля у наших штук
  • Сокрытие реализации
  • Хотим переиспользовать код
  • Надо тестировать
  • Хотим добавлять штуки легко

НЕ ООП

Функциональная парадигма

ООП

Объектно ориентированное программирование

Классы и объекты

(экземпляров). Класс определяет состояние и поведение, которыми будут обладать его объекты, через поля (или атрибуты) и методы.

состояние, которое определяется значениями его полей, и поведение, определяемое его методами. Объекты являются основными

  • Классы и объекты
  • Наследование
  • Инкапсуляция
  • Полиморфизм
  • Классы: Классы являются основными шаблонами для создания объектов
  • Объекты: Объект - это экземпляр класса. Каждый объект имеет свое
  • Свойства и методы (properties and methods)
  • Наследование позволяет новому классу принимать
  • В классическом ООП, класс-потомок может
  • Инкапсуляция - это механизм скрытия внутренних деталей реализации
  • Это достигается путем ограничения доступа к данным и методам
  • Полиморфизм - это способность одного интерфейса
  • В ООП это обычно достигается через перегрузку методов

Go

(embedding)

маленькой первой буквой имени

  • Классов нет - есть структуры
  • Наследования нет - есть “встраивание”
  • Инкапсуляция… ну она есть
  • Импортируемость на уровне пакета
  • “Приватность” задается большой/

Интерфейсы

  • Описывают поведение (методами)
  • Описывают поведение (методами)

Бонус

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

Концепция:

из ячейки(ек) записывается еще раз.

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

  • Переменная (данные) хранится в ячейке памяти
  • У ячейки есть физический адрес, по которому к ней можно обращаться
  • Данных может быть много
  • Когда передаем переменную в функцию - мы копируем данные. То есть вся инфа
  • Когда передаем указатель на данные мы копируем только адрес ячейки. Когда

Указатели это переменные, которые хранят адреса памяти других переменных.

Defer и Return

  • Отдаем переменную result
  • Отдаем какой-нибудь Int