О чем этот материал
Классы и объекты, инкапсуляция, полиморфизм и адаптация ООП-идей к Go.
Это адаптированная версия учебной презентации: слайды разобраны в формате обычной статьи, чтобы материал было легче читать с телефона и возвращаться к нужным блокам позже.
Что внутри
Ниже краткий план материала. По нему удобно понять, в каком порядке разбирать тему.
- Поговорим о том, что такое ООП
- Есть ли место ООП в Go
- Поговорим еще раз про интерфейсы
- Разберем вопросы
А зачем?
- У нас много связанной логики
- У нас много похожей логики
- У наших штук есть состояние (и оно может меняться)
- Не хотим запоминать какие поля у наших штук
- Сокрытие реализации
- Хотим переиспользовать код
- Надо тестировать
- Хотим добавлять штуки легко
НЕ ООП
Функциональная парадигма
ООП
Объектно ориентированное программирование
Классы и объекты
(экземпляров). Класс определяет состояние и поведение, которыми будут обладать его объекты, через поля (или атрибуты) и методы.
состояние, которое определяется значениями его полей, и поведение, определяемое его методами. Объекты являются основными
- Классы и объекты
- Наследование
- Инкапсуляция
- Полиморфизм
- Классы: Классы являются основными шаблонами для создания объектов
- Объекты: Объект - это экземпляр класса. Каждый объект имеет свое
- Свойства и методы (properties and methods)
- Наследование позволяет новому классу принимать
- В классическом ООП, класс-потомок может
- Инкапсуляция - это механизм скрытия внутренних деталей реализации
- Это достигается путем ограничения доступа к данным и методам
- Полиморфизм - это способность одного интерфейса
- В ООП это обычно достигается через перегрузку методов
Go
(embedding)
маленькой первой буквой имени
- Классов нет - есть структуры
- Наследования нет - есть “встраивание”
- Инкапсуляция… ну она есть
- Импортируемость на уровне пакета
- “Приватность” задается большой/
Интерфейсы
- Описывают поведение (методами)
- Описывают поведение (методами)
Бонус
Указатели это переменные, которые хранят адреса в памяти других переменных.
Концепция:
из ячейки(ек) записывается еще раз.
надо обратиться к ее значению это всегда можно сделать, так как у нас есть этот самый адрес.
- Переменная (данные) хранится в ячейке памяти
- У ячейки есть физический адрес, по которому к ней можно обращаться
- Данных может быть много
- Когда передаем переменную в функцию - мы копируем данные. То есть вся инфа
- Когда передаем указатель на данные мы копируем только адрес ячейки. Когда
Указатели это переменные, которые хранят адреса памяти других переменных.
Defer и Return
- Отдаем переменную result
- Отдаем какой-нибудь Int