Друзья! Заранее прошу простить за большую простыню, буду признателен тем, кто сподобится дочитать её до конца и ответить что-то вразумительное. Разрабатывая свою игру, я постоянно сталкиваюсь с одним и тем же вопросом, ответ на который всегда даётся мучительно, а будучи найденным, практически никогда не приносит удовлетворения от правильного решения. Это вопрос о том, какую полноту функционала давать тому или иному классу. Чтобы было понятнее, сразу покажу пример.
Вью персонажа - класс CharacterView, выводит и администрирует компоненты: портрет, шкалы здоровья, статус-иконки (типа "кровотечение", "благословение" и т.п.). Возьмём для примера область вывода статус-иконок. Это совсем "бездумный" класс StatusIconsArea, который реализует вот такие публичные методы:
Код AS3:
public function registerIcon (newIcon:BitmapIcon, iconID: String) : void // Регистрирует новую иконку статус-эффекта
public function showStatusIcon (iconID: String, showFirst: Boolean = false) : void // Показывает иконку
public function hideStatusIcon (iconID: String) : void // Прячет иконку
public function getIconByID(iconID: String) : BitmapIcon // Выдаёт зарегистрированную иконку
public function checkIconVisibility(iconID: String) : Boolean // Проверяет, отображается ли иконка
Таким образом, если из Модели "прилетает" событие на обновление статуса (типа push, с вложенным экземпляром StatusEffect), то класс CharacterView реализует всю логику, связанную с обработкой данного статус-эффекта. Код метода приведён ниже, но суть не в нём. Суть в том, что
именно CharacterView проверяет, есть ли такая статус-иконка в числе отображаемых, если да, то не надо ли убрать, а возможно только изменить оставшееся время действия статуса, обновить текст тултипа и т.п.
Код AS3:
public function updateStatusArea (statusArea: StatusIconsArea, status: StatusEffect, ch: Character) : void
{
if (status.timeLeft > 0)
{
var tooltipID: String = LanguageIDs.getPhraseID(status.statusID, ch.genderID);
var tooltipTxt: String = LanguagePack.getSinglePhrase(LanguageIDs.SECTION_TOOLTIPS_STATIC, tooltipID);
trace ("Устанавливаем/обновляем тултип:" + tooltipTxt);
if (status.timeLeft != GlobalDefaults.STATUS_TIME_PERMANENT)
{
var timeRemainTxt: String = LanguagePack.getSinglePhrase(LanguageIDs.SECTION_TOOLTIPS_DYNAMIC, LanguageIDs.TIME_REMAIN);
timeRemainTxt = timeRemainTxt.replace("%VALUE1%", status.timeLeft);
tooltipTxt = tooltipTxt.concat("\n", timeRemainTxt);
}
_tooltips.setDescription(_statusArea.getIconByID(iconFullID), tooltipTxt);
if (!statusArea.checkIconVisibility(iconFullID))
{
trace ("Иконки ID " + iconFullID + " нет среди отображаемых. Выводим!");
statusArea.showStatusIcon(iconFullID);
}
}
else
{
trace ("Убираем статус-иконку");
statusArea.hideStatusIcon(iconFullID)
}
dispatchEvent(new Event(ViewEventTypes.INSTRUCTION_COMPLETE));
}
Приведённая схема нормально работала до поры. Теперь же возникла необходимость выводить иконки статус-эффектов не только для самого персонажа, но и для экипированного в руки предмета. Тут же началась хрень. Нужно либо инкапсулировать весь функционал непосредственно внутрь класса StatusIconsArea, чтобы на входе он получал экземпляр StatusEffect из события и дальше разбирался сам. Либо внутри CharacterView завести дополнительный экземпляр StatusIconsArea, прикрутить его к окошку вывода экипированного предмета и передавать в метод updateStatusArea ссылку на интересующую область (я так пока и сделал).
В общем, вопрос частный такой. Какому из классов правильнее поручить выполнение всей перечисленной выше логики? А вопрос общий, чем в принципе следует руководствоваться при решении подобных задач. Какие могут быть указатели/маркеры/индикаторы, которые могут помочь сориентироваться?
Спасибо.