Что-то не так с этим
шаблон? Это только вопрос
личный выбор, если состояние
класс проводится в полях и свойствах
или переданный среди статического
методы, использующие аргументы?
Исходя из моего личного опыта, я работал над 100 приложениями KLOC, которые имеют очень глубокие объектные иерархии, все наследуют и переопределяют все остальное, все реализуют полдюжины интерфейсов, даже интерфейсы наследуют полдюжины интерфейсов, система реализует каждый шаблон дизайна в книге и т. д.
Конечный результат: действительно ООП-тактичная архитектура с таким количеством уровней косвенности, что для отладки чего-либо требуются часы. Недавно я начал работу с такой системой, где кривая обучения описывалась мне как «кирпичная стена, а за ней гора».
Иногда излишне усердное ООП приводит к тому, что классы настолько гранулированы, что это на самом деле чистый вред.
В отличие от этого, многие функциональные языки программирования, даже такие как OO, такие как F # и OCaml (и C #!), Поощряют плоскую и неглубокую иерархию. Библиотеки на этих языках обычно имеют следующие свойства:
- Большинство объектов являются POCO или имеют не более одного или двух уровней наследования, где объекты представляют собой не более чем контейнеры для логически связанных данных.
- Вместо классов, вызывающих друг друга, у вас есть модули (эквивалентные статическим классам), контролирующие взаимодействия между объектами.
- Модули, как правило, работают с очень ограниченным числом типов данных и поэтому имеют узкую область применения. Например, модуль OCaml List представляет операции над списками, а модули Customer облегчают операции с клиентами. Хотя модули имеют более или менее ту же функциональность, что и методы экземпляров в классе, ключевое отличие библиотек на основе модулей состоит в том, что модули гораздо более автономны, гораздо менее детализированы и, как правило, имеют мало зависимостей от других модулей.
- Обычно нет необходимости переопределять методы переопределения объектов подкласса, так как вы можете передавать функции как первоклассные объекты для специализации.
- Хотя C # не поддерживает эту функцию, функторы предоставляют средства для подкласса специализированных модулей.
Большинство больших библиотек имеют тенденцию быть более широкими, чем глубокими, например, Win32 API, библиотеки PHP, библиотеки Erlang BIF, библиотеки OCaml и Haskell, хранимые процедуры в базе данных и т. Д. Таким образом, этот стиль программирования является боевым тестированием и, кажется, хорошо работать в реальном мире.
По моему мнению, лучше всего разработанные API-интерфейсы на основе модулей, как правило, легче работать, чем лучшие API-интерфейсы ООП. Тем не менее, стиль кодирования так же важен в разработке API, поэтому, если все в вашей команде используют ООП, и кто-то уходит и внедряет что-то в совершенно другом стиле, то вам, вероятно, следует попросить переписать, чтобы более точно соответствовать кодированию вашей команды стандарты.