Re[5]: Базовое отличие ООП от ФП
От: Sinclair Россия https://github.com/evilguest/
Дата: 16.03.24 10:19
Оценка:
Здравствуйте, sergii.p, Вы писали:

S>>Вот вам ООП подход.


SP>Замечу, что здесь нет изменяемого состояния.

Совершенно верно. Я об этом и говорю — без изменяемого состояния ООП от ФП практически неотличимо. "Интерфейсы" без мутабельности прекрасно реализуются на ФП.

S>>Вот как раз тут видно, почему ООП без изменяемого состояния — "не ООП".

SP>Мне видно противоречие.
Где именно?
SP>На первый взгляд в ООП инкапсуляция явно противоречит иммутабельности. Но на самом деле это чисто технический момент. Следующий код с изменяемым состоянием

SP>
SP>class MyObject {
SP>    int _v;
SP>    public: void setField(int v) { _v = v; }
SP>};
SP>


SP>легко преобразуется в иммутабельный


SP>
SP>class MyObject {
SP>    int _v;
SP>    public: MyObject setField(int v)&& { this->_v = v; return *this; }
SP>}
SP>

Простите, это на каком языке?
SP>да, такой код не очень идиоматичен. Но чисто технически он иммутабельность убирает.
Если я правильно понимаю, вы просто переписали мой пример кода с "иммутабельной мутабельностью" на другой язык. При этом, как мне кажется, вы допустили ошибку — вы же this меняете, нет тут никакой иммутабельности.
Для проверки попробуйте добавить const к определению int _v.

SP>В языках типа С# и Java конечно такое тяжело (нет move семантики),

Не очень понятно, при чём тут move семантика.
SP>но начиная с С++ и Rust так извращаться уже можно. В данном случае ограничения языков не должны вводить в заблуждение относительно ограниченности ООП. В ООП стиле можно писать даже иммутабельно
Такое "ООП" плохо не тем, что оно иммутабельное, а тем, что это — не ООП.
Собственно, как и следовало ожидать, оно с той же громоздкостью выражается на ФП. Потому что — см. предыдущий пункт: в отстутствие изменяемого состояния, "объект" — это просто пачка функций, объединённых общим замыканием.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.