Сегодня последний тред из мифов в ООП #oopmyths Поговорим о том, что обычно считают ООП кодом и что влияет на его структуру больше всего. Какие вещи в ООП универсальны сквозь большинство языков. Включайтесь)
Ну и традиционно вопрос. Может ли код быть одновременно объектно-ориентирован и функционален?
Несмотря на любую теорию, на практике, многие программисты если не видят в коде конструкций вида something.do(data), то они не считают код объектно ориентированным. Проверял это много раз. Все это сопровождается философией в стиле "это поведение", а иначе нет.
То есть код в стиле do(something, data) уже не поведение. Тут мне добавить особо нечего, это всего лишь варианты синтаксиса и привычка. Есть языки типа Nim, в котором используется Unified Function Call. Любую функцию можно вызывать аж тремя способами включая способ через точку
Но не каждый вызов функции равен вызову через точку. Нужно учитывать наличие динамической диспетчеризации (иногда говорят отправка сообщений). Если она есть при вызове функции, то мы получаем практически полный эквивалент. Хороший пример это полиморфизм в Elixir.
В итоге вариант вызова на код влияет не очень сильно, но вот что влияет по настоящему сильно, так это объединение функций и данных вместе. Про это не часто говорят в рунете (на английском много статей), но именно такое объединение накладывает определенный стиль и ограничения.
Если внимательно посмотреть на best practice, то можно заметить как много внимания уделяется компоновке классов и их связям между собой. Причем как горизонтально (использование друг друга) так и вертикально (наследование). Тот же SRP. Принцип возникший из ограничений классов
В итоге можно получить такую цепочку. Связали все вместе, получили свой набор ограничений, получили динамическую диспетчеризацию (метод выбирается в рантайме) и, в конечном итоге, получили свой очень узнаваемый стиль и целую индустрию вокруг с книгами, паттернами и языками
Наличие интерфейсов, абстрактных классов, сокрытия данных, наследования и многие другие атрибуты встречающиеся в разных языках не меняют код настолько кардинально, насколько это делает объединение. А многое вытекает из этого объединения, включая ту же абстракцию.
> Data structure and functions should not be bound together
> Objects have private state.
Очень интересно, рекомендую прочитать (и дальше погуглить). Полезно для общего развития.
Самое главное что я бы хотел добавить тут от себя. Важно не путать особенности которые дает классово ориентированный код и фундаментальные штуки. Абстракция существовала и существует без классов, полиморфизм тоже, сокрытие тоже. Причем без классов часто лучше, но тут как повезет
Ну и не писайте против ветра. Если код пишется на классовом языке, то нужно придерживаться правил, которые помогают организовывать код на этом языке. Если нет, то там скорее всего работают другие законы и нужно применять их. А чтобы их узнать, читайте глубокие вещи и другие языки
Ну а что такое ООП, пусть каждый для себя решает сам)
• • •
Missing some Tweet in this thread? You can try to
force a refresh
Начинаем третий про наследование и отношения. Во второй части был опрос про отношения, на который правильно ответило только 29 процентов! И кажется что не все поняли первый тред. #oopmyths
Начнем как обычно с опроса. Вопрос: "Объяснять ООП надо через аналогию с реальным миром". Именно так делается в подавляющем большинстве источников и сервисах типа стековерфлоу.
Строго говоря, отношение частное-общее про типы, а не классы. В статье про сабтайпинг об этом написано внизу: en.wikipedia.org/wiki/Subtyping. И принцип лисков тоже не про классы. Наследование классов это всего лишь способ убрать дублирование кода. Один из худших способов.
Итак) Второй тред посвященный ООП и мифам вокруг него. По итогам первого треда уточню, что разбор ООП идет не с точки зрения систем типов, а с точки зрения организации кода и влиянии на архитектуру. Лайк, шер, будет много интересного, поехали!
Отношение общее-частное это:
В первом треде мы разобрали что под полиморфизмом в ооп понимают полиморфизм подтипов. Остальные виды полиморфизмов тоже важны, но они не играют определяющую роль с точки зрения парадигмы. Полиморфизм подтипов, если по простому, сводится к разным реализациям нужного поведения.
Под типами и подтипами часто понимаются интерфейсы (и их аналоги типа протоколов) и отношения между интерфейсами. Иногда говорят "наследование интерфейсов". Соответственно классы и наследование классов тут не причем. И принципов Лисков не имеет отношения к классам.
Сегодня я хочу попробовать формат коллективных твиттеров у себя в твиттере. Потвичу пару часов о мифах вокруг ООП. Лайк, шер приветствуется. Задание на самопроверку:
Какой вид полиморфизма имеется ввиду когда речь идет про полиморфизм в ООП?
Перед тем как я буду выдавать какие-то утверждения и прикладывать пруфы. У меня есть десяток мифов, которые я бы хотел разобрать задав вопросы тут. Поэтому продолжаю спрашивать:
Нужно ли наследование для реализации полиморфизма подтипов?
Может ли язык называться ООП если в нем нет классов?
Поиграем в игру. 1 лайк - 1 факт из жизни президентского полка. Я служил с 2004 по 2006 год в первой роте, той что стоит на МНС в Александровском Саду (сейчас немного другая структура).
Писать начну вечером. Структура такая:
1. Что такое ПП и какие задачи выполняет. 2. Как туда попадают. 3. Жизнь в полку.
Президентский полк - особое подразделение, которое не подчиняется министерству обороны, а является подразделением ФСО. Полное наименование: Президентский полк Службы коменданта Московского Кремля Федеральной службы охраны Российской Федерации