amarao: (Default)
[personal profile] amarao
Я, только что понял, что меня больше всего бесит в ООП (вне зависимости от языка). Это _генеалогия_. Рассказы о том, кто кому является родителем и кто потомок. Существуют редчайшие случаи, когда онтология предметной области хорошо ложится на концепцию предок-потомок (в смысле ООП).

Чаще всего это набор риторических упражнений, не имеющий отношения ни к коду, ни к предметной области.

(рандомный пример: Если я работаю с API двух разных провайдеров, то у меня нет "предка" этих API, у меня есть два разных API к которым я хочу иметь одинаковый интерфейс - и рассказы про "предка" GenericApi, из которого пояются FooApi и BarApi - херня и натягивание задачи на генеалогию).

Вот любой рассказ про "обобщённую генеалогию" в ООП вызывает у меня мгновенное иссушение мозга. Я не понимаю зачем я должен использовать эту модель, почему именно эту модель и почему эта модель должна занимать у меня в голове больше места, чем предметная область, которую я пытаюсь охватить.

Я бы даже сказал, польза от ООП заканчивается на концепции класс/инстанс. Это разумное деление, хотя, например, Rust прекрасно без этого обошёлся с помощью понятия "структура" и "методы на структуре". В этом месте, кстати, класс, рассыпается на две более разумные конструкции: структура (тип данных); инстансы этой стурктуры (значения типа) и методы, которые связаны со структурой. Это деление автоматом устраняет "кашу" из данных и методов в обычных классах, и любой код в котором "метод - это элемент структуры" начинают выглядеть ровно так, как выглядят - странно и привлекая к себе внимание.

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

И то! Комфортнее всего с ними работать, когда все эти "наследуемые" исключения или 'pass' (т.е. не имеют ничего своего, кроме типа), или имеют доп. методы, которые никаким образом старые не ломают.

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

Date: 2022-07-06 12:53 pm (UTC)
From: [personal profile] permeakra
Ты почти созрел для хаскеля с тайпклассами.

Date: 2022-07-06 01:34 pm (UTC)
From: [personal profile] permeakra
> Язык с обязательным рантаймом - язык песочниц.
Вот интересно, сколько кода на моей машине написано без рантайма? тысяча строк-то наберется?

Date: 2022-07-06 02:38 pm (UTC)
From: [personal profile] permeakra
Очень мало. Что-то есть в биосе и в менджере памяти. Все остальное, в т.ч. ядро, активно использует внешний рантайм. Как минимум тот самый менджер памяти.

Date: 2022-07-07 09:16 am (UTC)
From: [personal profile] permeakra

Когда кажется - креститься надо. Авось перестанет.

Date: 2022-07-06 01:13 pm (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi

ООП нормально работает только в рамках одного сервиса. Если мы общаемся с другими сервисами, то там уже никакого ООП не может быть. Там, скорее, или TLA+ применять нужно, или что-нибудь в таком духе.

Edited Date: 2022-07-06 01:13 pm (UTC)

Date: 2022-07-06 01:50 pm (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi

Ага. Демонстрирует непонимание (сути вещей). Карго-культ.

Date: 2022-07-06 03:05 pm (UTC)
yurikhan: (Default)
From: [personal profile] yurikhan

Ну сколько-нибудь продвинутый ООП оперирует не отношением «предок/потомок», а отношением «надтип/подтип». Граница проходит по тому месту, где объясняют LSP (не тот, который протокол между редактором и языковым сервером, а принцип подставляемости имени Варвары Ивановны Лисковой).

Дальше мы имеем ту же самую решётку типов от typing.NoReturn до object через Callable, Hashable, Reversible, Iterable, Sized, Collection, Container, Mapping, MutableMapping, Sequence, MutableSequence, AbstractSet, MutableSet, Iterator, Generator и всё такое прочее. Только где-то отношения «я подтип вон того» требуется указывать явно на определении класса/интерфейса (Java, C++), а где-то они выводятся компилятором (TypeScript).

А наследование реализации много где объявлено не лучшим способом композиции.

Date: 2022-07-06 03:16 pm (UTC)
sab123: (Default)
From: [personal profile] sab123
Наследование - не странный, а главный метод композиции.

Отсутствие явных классов как в Го наоборот создает кашу из непонятно куда привязанных методов.

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

Profile

amarao: (Default)
amarao

February 2026

S M T W T F S
123456 7
8910111213 14
15161718192021
22232425262728

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Feb. 25th, 2026 10:28 am
Powered by Dreamwidth Studios