ооп хуевый лишь потому что это дробовик к ноге привязанный
ооп заставляет делать предвзятые и удивительно наивные решения по умолчанию; ооп это инструмент для решения статичных и средних по размеру задач
когда предвзятость в решениях велика, то поведения в классах сильно связаны друг с другом, отношения между ними статичны и конкретизированы под конкретный юзкейс. поэтому такие как оп и учат бедолаг ооп в 2024 году - потому что ооп игрушки очень специфичны, а значит читаемы.
ахиллесова пята ооп - изменения. чтоб с этим справляться, и минимизировать потери, люди должны делать меньше предвзятых решений в своём коде, но загвоздка заключается в том что абсолютно во
всех техниках по минимизации рисков в изменениях рисков есть серьезные взаимозависимые плюсы и минусы - людям нужно выбирать.
и из этих техник и появляются "AbstractAnimalFactoryBuilder". Для решения одной и той же проблемы, у 10 программистов будет 10 разных решений.
допустим, ты хочешь обработать платёж в банке.
с алгебраическими дата типами я бы сделал так:
type Payment = Cash Amount | CreditCard Number CVV
каждый раз, когда тебе нужно обработать платёж - ты конкретно и буквально обрабатываешь одну из трех возможностей, ведь так моя модель данных и устроена. шанс того, что другие люди придут к абсолютно такому же решению очень велик.
в "ООП" такое решение.. хм
class Payment {
virtual int do_foo() = 0;
virtual void do_baz() = 0;
};
class CashPayment : Payment { ... }
class CreditCardPayment : Payment { ... }
для того чтобы принять тип "Payment", тебе нужно поместить, утоптать и уничтожить оба субкласса в "Payment" интерфейс. для Payment, наверняка, будет существовать 150 методов, поэтому рефакторинг будет полностью opinionated.
tl;dr ооп зло, и людям не знающим программирования его точно учить не надо
====
а теперь пройдусь по твоему чатгптшному посту:
Это означает, что данные и методы класса не доступны напрямую извне класса, а только через специальные методы, называемые
(геттеры и сеттеры).
энкапсуляция - это невозможность доступа к данным извне класса. ты же лишь добился публичного доступа (аннулировав бейджик энкапсуляции), но только вместа доступа к полю ты теперь метод вызываешь)))
ооп обещал энкапсуляцию, а по итогу добавил больше связи между элементами кода. браво.
===
настоящий пример энкапсуляции:
class Human {
Human(int age) : age(age) {}
int age;
}
int main() {
Human barbara {25};
int age = barbara.age; // don't ask women about their age
}
или даже:
{
int age = 13;
}
age = 16; // age doesn't exist