Показать сообщение отдельно
Старый 13.06.2018, 16:02
Appleman вне форума Посмотреть профиль Отправить личное сообщение для Appleman Найти все сообщения от Appleman
  № 1  
Ответить с цитированием
Appleman
 
Аватар для Appleman

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
По умолчанию Про делегирование

Друзья! Заранее прошу простить за большую простыню, буду признателен тем, кто сподобится дочитать её до конца и ответить что-то вразумительное. Разрабатывая свою игру, я постоянно сталкиваюсь с одним и тем же вопросом, ответ на который всегда даётся мучительно, а будучи найденным, практически никогда не приносит удовлетворения от правильного решения. Это вопрос о том, какую полноту функционала давать тому или иному классу. Чтобы было понятнее, сразу покажу пример.

Вью персонажа - класс 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 ссылку на интересующую область (я так пока и сделал).

В общем, вопрос частный такой. Какому из классов правильнее поручить выполнение всей перечисленной выше логики? А вопрос общий, чем в принципе следует руководствоваться при решении подобных задач. Какие могут быть указатели/маркеры/индикаторы, которые могут помочь сориентироваться?

Спасибо.
__________________
Не сломано - не чини!