Так сложилось, что я практически не знаком с ООП языками, но сейчас начал интересоваться ООП. И первое, что обращает на себя внимание - это инкапсуляция.
Собственно, инкапсуляция присутствует неявно и в ФП, например, замыкания - это вариант инкапсуляции. Но ее можно вообще изобразить явно, например:
(define fu (lambda(arg) (if (= arg 'I-am-foo) (bar))))
Однако, я часто наблюдаю, что под инкапсуляцией понимается сокрытие не от программных сущностей, а от самого программиста. Например:
Разные языки по-разному решают вопрос о том, как позволить программистам прятать информацию от самих себя. В объектно-ориентированных языках принцип полиморфизма, принципиального незнания мной того, объект какого класса я вызываю по ссылке (базового или наследника), является краеугольным; и это по-своему хорошо, если проведено последовательно.
What a fuck?!!! Нахрена прятать внутреннюю реализацию от самого программиста, а не от программных объектов?