Итак, этот вопрос является своего рода продолжением ( как обращаться с несколькими аргументами событий ). Этот вопрос заставил меня задуматься над этим, но он достаточно отличается, чтобы оправдать свою нить.
Я создаю игру (для развлечения и в целях обучения) и хотел бы знать, использую ли я хорошие стандарты для дизайна или нет. Я думаю, что мог бы пойти на ОТТ по разделению интересов, или просто все неправильно понял, но я надеюсь, что это не так. У меня нет проблем переписать его, так как я хочу изучить «лучшие практики» и их практическое применение.
EDIT
Позвольте мне объяснить немного больше об игре. Она основана на игре Jawbreaker, которую можно найти на многих мобильных телефонах ( быстрое демо здесь можно найти ). Цель состоит в том, чтобы выбрать шары, которые находятся в группах, чтобы вывести их из игры и набрать как можно больше очков.
Я пытаюсь немного его расширить, и у меня разные типы досок, шары движутся по-разному и разные типы шаров, шары могут просто идти туда, куда им говорят, или они могут что-то делать по пути.
Итак, вот структура объектов, которые я создал, в верхней строке показаны библиотеки DLL с их объектами, во второй строке - ссылки на эти объекты:
(источник: ggpht.com )
Вот моя попытка сделать UML:
альтернативный текст http://yuml.me/3279d2ac
Нажмите здесь, чтобы перейти на полную страницу для UML, она немного больше и, надеюсь, легче читать
Библиотека объектов содержит основные объекты, используемые в игре, шары и доску. Они не содержат никакой логики о том, как они действуют / реагируют на ситуации (мяч реализует методы CompareTo и Equals). Может быть X количество реализаций IBall (и то же самое для IBoard, хотя я не думаю, что их будет много).
InstanceManager DLL используется в качестве способа создания объектов, но не уверен, что это на 100% необходимо, чтобы это могло быть в DLL объектов. Фабрики - это статические классы, которые имеют различные перегруженные методы для создания объектов IBall. BallFactory может принимать перечисление BallType, объект Drawing.Color и т. Д. BoardFactory очень похожа. Jawbreaker - это одноэлементный объект, который имеет дело с такими вещами, как удержание случайного объекта, так как он используется очень регулярно, а также с некоторыми данными GameConfiguration (не очень актуальными для этой темы).
Engine DLL - это то место, где происходит большая часть работы. LogicFactories принимает объекты BallType и BoardType для создания соответствующих логических объектов. Логические объекты используются для управления работой объектов IBall и IBoard. BallLogic сообщает мячу, что он может сделать, когда начнутся его события. Например, когда выбран мяч, в логике шара вызывается метод, говорящий о том, что был выбран шар X на доске Y. Мяч может делать то, что должен / мог сделать его тип. BoardLogic очень похож и имеет дело с тем, как действует доска.
Объект Engine - это еще один синглтон, и именно так графический интерфейс взаимодействует со всей игрой. Графический интерфейс не будет создавать экземпляры других объектов напрямую.
Итак, для подведения итогов классы IBall и IBoard содержат только данные о них, классы логики имеют дело со всеми функциями.
Я бы хотел знать:
1) Это разумный подход?
2) Должна ли (вообще) логика быть отделена от объектов / данных?
3) Я зашел слишком далеко с разделением интересов?
4) Любые другие комментарии о дизайне / структуре
EDIT
ThПричина, по которой я использовал пару синглетонов, отчасти из-за простоты доступа к данным в одном месте без постоянного удержания объектов, а также просто потому, что это одиночная игра, и она не будет масштабироваться ни до высокого уровня, ни на нескольких машинах. , Я понимаю, что они не велики, и это не то, чем я регулярно пользуюсь, но ценю комментарии.
Спасибо за ваши мысли и отзывы.