Как лучше организовать классы / пакеты во фреймворке, чтобы клиент моего приложения мог легко их расширять?

Предположим, я отвечаю за разработку игры Scrabble, поскольку одним из основных требований клиента является возможность позже опробовать различные способы и режимы игры. Я уже сделал дизайн, который достаточно гибкий, чтобы поддерживать такого рода изменения. Остается только один вопрос: что предоставлять клиенту (модификаторы доступа к объектам) и как это организовать (как предоставлять мои объекты в пространствах имен / пакетах).

Реализации

Содержит все необходимые классы / код для реализации моей стандартной игры Scrabble в пакете Implementations.StandardScrabble. Если клиент решит реализовать другие варианты игры, он может создать их, например, в Implementations.XYZ. Все эти классы защищены пакетом, и единственное, что доступно снаружи пакета, - это фасад Game. Использует пакеты как домена, так и типов данных.

UI

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


В моем способе организации есть несколько недостатков, наиболее очевидным из которых является то, что если клиент хочет создать свою собственную версию игры, ему придется реализовать почти все самостоятельно. (Я разделяю в Домене интерфейсы, но он почти ничего не может с ними сделать). Я чувствую, что мне, может быть, следует пройти все Реализации » s в Домен, и тогда будет только Фасад, который создает мой стандартный Scrabble в пространстве имен реализации?

Как бы вы к этому подойти? Есть ли какие-нибудь рекомендации по созданию таких программ (в основном, фреймворков)?

Спасибо

6
задан DOK 26 October 2010 в 14:59
поделиться