Вопрос сложный, потому что ООП включает в себя несколько концепций: инкапсуляция объектов, полиморфизм, наследование и т. Д. Эти идеи легко зайти слишком далеко. Вот конкретный пример:
Когда C ++ впервые завоевал популярность, возникли миллионы строковых классов. Все, что вы могли себе представить, делая со строкой (перемещение вверх, вниз, усечение, токенизация, анализ и т. Д.), Было функцией-членом некоторого строкового класса.
Обратите внимание, однако, что std::string
из STL не имеют всех этих методов. STL является объектно-ориентированным - состояние и подробности реализации строкового объекта хорошо инкапсулированы, только маленький, ортогональный интерфейс представлен миру. Все сумасшедшие манипуляции, которые люди раньше использовали как функции-члены, теперь делегируются функциям, не являющимся членами.
Это мощно, потому что эти функции теперь могут работать с любым строковым классом, который предоставляет тот же интерфейс. Если вы используете строки STL для большинства вещей и специальную версию, настроенную на особенности вашей программы, вам не нужно дублировать функции-члены. Вам просто нужно реализовать базовый строковый интерфейс, а затем вы можете повторно использовать все эти безумные манипуляции.
Некоторые люди называют этот гибридный подход универсальным программированием. Это все еще объектно-ориентированное программирование, но оно отходит от менталитета «все является функцией-членом», который многие связывают с ООП.