Как избежать сильной связи?
Я пытался разобраться с этой проблемой на прошлой неделе и, похоже, не могу найти решения, которое не требовало бы ни одноэлементной, ни жесткой связи. Я занимаюсь разработкой трехмерной космической игры, ранняя демонстрация которой здесь...
www.sugarspook.com/darkmatters/demo.html
... и я дохожу до того, что добавляю миссии, которые игрок сможет выбрать на экране "один на один" (класс Хад).
Структура игры:
Класс Game содержит классы Hud и ObjectsList.
Класс ObjectsList содержит различные игровые объекты, в том числе игрока, различные виды кораблей, планет и орбиталей (космических станций).
Миссии создаются, когда Игрок попадает на определенное расстояние от Орбитали.
Миссии добавляются в класс MissionsList, который находится внутри ObjectsList.
Миссии могут стать недоступными и истекать без предупреждения (как если бы они были выбраны другим пилотом), поэтому список, отображаемый в Hud, является динамичным и регулярно обновляется.
Ранее у меня были миссии, отправляющие события вплоть до игры, которая, в свою очередь, сообщает Хаду об изменениях. Это кажется мне немного неуклюжим, поскольку существуют различные более глубокие "уровни" Хад, на которые необходимо передать информацию. Я получаю множество одинаковых функций по всей цепочке.
Решение, о котором я думал, заключалось в том, чтобы вставить ссылку на класс MissionsList в Hud, что позволило ему прослушивать обновления из списка Missonslist. Я слышал, что это плохая практика - смешивать состояние чего-либо с его отображением, но я не вижу, как еще получить "живой" список Миссий в Хад. Напротив, если Hud содержит только отображаемые детали без ссылки на объект Миссии, который сгенерировал эти детали, когда игрок выбирает Миссию из Hud, как я могу определить, какая Миссия была выбрана? Хорошо ли в этом случае крепкое соединение? Или я должен использовать синглтон для общения с Хадом? Если что-то в корне не так, я полагаю, мне будет приятно узнать, что это такое и каково лучшее решение. Благодарю.
1 ответ
Ну, простой ответ: почему бы не соединиться через промежуточный интерфейс?
interface IMissionList
{
ObservableCollection<IMission> Missions{get;}
}
Затем в своей инъекции зависимостей свяжите это с чем-то, что может разрешить экземпляр, синглтон, константу или т. Д.
затем введите его в конструктор вашего Hud
Hud(IMissionList missionList){}
Теперь вы слабо связаны с контрактом, выполнение которого может быть изменено в любой момент, если реализация придерживается контракта. Кроме того, из-за инъекции ваш Hud должен сам позаботиться о том, чтобы использовать IMissionList, а не находить его.
[Edit] Извините, это C#, но, надеюсь, идея полезна. См. Для интерфейсов actioncript и внедрения зависимостей для Actionscript