Хабы: Go, ООП, Программирование
По канонам современных публичных выступлений тут должно быть оправдание, сглаживание углов, но его не будет. Мы пойдем по порядку: абстракция, инкапсуляция, наследование, полиморфизм.
Абстракции?
Abstractio или отвлечение — уход от не существенных свойств объекта ради простоты восприятия и оперирования понятием(объектом). Даже команды процессора — определенный уровень абстракции нам передаваемым сигналом, не говоря уже об ассемблере. Все программирование(и все языки программирования) частично абстрактно и частично конкретно, вопрос только в уровнях абстракции.
Показывает ли Go тот же уровень абстракции как python, java, php или С++? Объективно нет. Даже перечисленные языки имеют разные уровни абстракции! Важная особенность Go в том, что часть абстракций Go выносит на уровень пакетов, а часть абстрактных решений принимает за нас. Например, в виде утиной типизации. И это важный момент, который мы рассмотрим позже в части, почему «прекрасно, что в Go нет ООП». А пока мы должны понять, что абстракция — свойство программирования в целом, а не ООП.
Инкапсуляция?
Классическое понимание инкапсуляции в ООП — это реализация принципа принципом абстракции данных. На самом деле, чистой абстракции данных нет даже в C++ и Java. Её иногда называют «неполноценной». Видимо, что бы я смог отнести их к разряду языков с ООП.
В Go ситуация ещё «круче». Инкапсуляция на уровне интерфейсов и пакетов. Что? Опять частично все решили за нас? Именно. Приватные и публичные идентификаторы внутри пакетов. Нет инициализаторов и конструкторов. Методы — как и везде синтаксический сахар над функциями. Интерфейсы? Не те интерфейсы, что в других языках — только контракты на уровне типов.
Читать далее