Здравствуйте, Sinclair, Вы писали:
S>Принципиальное отличие в наличии изменяемого состояния, для которого необходима идентифицируемость (identity).
это если мы говорим о сравнении ФП с императивным подходом.
А если сравнивать ООП с ФП, то иммутабельность видимо не является принципиальным отличием. Ведь без изменения состояния можно работать и в ООП парадигме.
Принципиальным отличием, как мне кажется, является то как мы вносим зависимости.
В ООП через интерфейсы:
struct Out { virtual void write(const Data&) const = 0; };
struct Console { virtual void write(const Data&) const { ... }; };
struct File { virtual void write(const Data&) const { ... }; };
void foo(const Data& d, Out& out) {
out.write(d);
}
void main(){
const auto console = Console{};
const auto file = File{};
const Data d{42};
foo(d, console);
foo(d, file);
}
В ФП — через функции:
void write_to_console(const Data& ) { ... }
void write_to_file(const Data& ) { ... }
void foo(const Data& d, auto write) {
write(d);
}
void main() {
const auto log = [file = "log.txt"](const Data& d) { write_to_file(file, d); };
const Data d{42};
foo(d, log);
foo(d, write_to_console);
}
Мне даже кажется, что если бы функциональщина появились в языках изначально, ООП так бы и не был внедрён. Он более громоздок, вносит больше вспомогательных абстракций.