True OOP
От: Poudy Россия  
Дата: 16.01.05 12:20
Оценка: 4 (1)
Хочу вынести на обсуждение одну спорную идею о принципах программирования объектов.

Долго размышлял над сутью споров о статической/динамической типизации, использовании шаблонов и C++ vs динамические языки. И в данной ветке мне не хочется в очередной раз пережевывать "разные языки для разных задач". Есть вполне прагматичная и правильная точка зрения профессионалов и полиглотов о том, чтобы использовать разные языки и подходы (прототипируем на Smalltalk, переписываем на С++), тут всё ясно.

Часто вспоминаю слова Алана Кея о том, что всё есть объект, и как важна идея посылки сообщения. Для меня очевидно, что исключения из правил "объектности" несут проблемы во многих языках. Примеры: в C++ класс — это не объект (как Type в C#), bool — это не объект и в C++ и в Java.

В свою очередь для ОО-библиотек есть похожие несуразности, которые я отношу к звеньям той же цепи:
1. Библиотека не последовательна в функциональности классов. Пример: в System.Windows.Forms.MenuItem нет Tag, а в std::string нет toUpper/toLower.
2. Иерархия классов странная (больше относится к custom библиотекам). Каждое десятый пост в форуме Проектирование о том, как спроектировать очередную странную иерархию, где Readonly, Admin, Web и прочая функциональность сильно переплетены, и автор непременно хочет заморозить всё это в статичном виде.

Обсудить хочу следующий принцип для разработки ОО-библиотек:

Каждый проблемный домен должен содержать свой центральный класс, содержащий наиболее полную (а не наиболее непротиворечивую) для данного домена функциональность.

Примеры использования этого принципа я вижу в System.Windows.Forms.Control и System.IO.Stream. Примеры из других библиотек приводить не буду, потому что толком в них не шарю.

Как аргумент в защиту принципа могу привести умственный опыт: представим библиотеку, в которой работа с файлами ведется при помощи InputSystemFile, OutputTextFile, IONetworkFile, SequentialBinaryIOFile и т.д. При этом абстрактный класс (или интерфейс), лежащий в корне иерархии, содержит только Name (getName) и Close() (close()).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.