Проверить на наличие геттера
Друзья, подскажите, пожалуйста, как проверить наличие в классе геттера, зная строку для обращения? Попытка написать:
Код AS3:
|
Отказаться от использования столь ужасного подхода к программированию?
|
Какая задача стоит перед вами? Вам может помочь рефлексия.
|
Ну какая, вестимо поверить наличие геттера в объекте по строковому ключу.
|
Решил. Оказывается, если геттер не объявлен как public, то ничего не получается. Изначально был с модификатором internal.
Цитата:
|
Чем дольше вы тяните, тем масштабнее будут проблемы и демотивация, но я могу лишь советовать :)
|
СлаваRa, ко мне можно и нужно на "ты" :)
Я же не специально... У меня первый проект, я уже год делаю его для себя, в своё удовольствие и в меру собственных способностей. Расширение кругозора происходит стремительно, поэтому уже раза 2 почти полностью переписывал. И скорее всего, это не последний раз. Если конкретно по обсуждаемому вопросу, но ноги растут вот отсюда. После того как я распихал многочисленные свойства класса Character по нескольким подключаемым классам, возникла проблема с обращениями к ним извне. Они у меня происходят через передачу строкового ID нужного свойства. Раньше я спокойно писал в любом месте, где есть ссылка на экземпляр персонажа: character[PropID], а теперь не могу, так как теперь свойство propID может быть как в самом классе Character, так и в Skills, Personality, Statuses и т.п. На сегодня лучшее, что по этому поводу придумалось - это сделать единый метод, который будет проверять, где "живёт" запрашиваемое свойство, и выдавать его значение. Заодно применять к нему модификаторы, "подрезать" его при необходимости по установленному максимуму и т.п. Вот такой код: Код AS3:
|
Не обращая внимания на весь этот ужас в коде, все же спрошу)
А что если у тебя и _personality и _parameters будет содержать свойство propID? Какое-то странное условие, мягко говоря. И кстати, на сколько я помню, такая конструкция может легко отвалиться с ошибкой, если класс не динамический |
Цитата:
Цитата:
Цитата:
|
с таким подходом не возможно:
- рефакторинг - обнаружение синтаксисческих ошибок на этапе компиляции - обнаружение ошибок логики(вопрос выше про совпадение имен) - нормальная работа IDE - ... |
Цитата:
|
СлаваRa, caseyryan, согласен, подход - дерьмо.
Цитата:
Давайте я попробую привести ещё пример и задать вопрос. Изначально в классе Character были прописаны свойства из "досье", которые остаются неизменными (сила, интеллект), свойства, отслеживающих текущие параметры (энергия, ХП), скиллы. От такой огромной простыни (сами свойства, сеттеры/геттеры, методы обработки) у меня класс сильно "распух". Чтобы всё это хозяйство организовать, придумалось раскидать свойства не нескольким новым классам. Но возникла новая проблема. У меня происходит много обращений за значениями свойств, переданных как параметры. Наиболее типичный случай - класс проверки условий доступности игровых действий. Вот его пример: Код AS3:
Или я вас не правильно понял, и главный объект критики - это подход, при котором запросы текущих значений свойств сделаны через их строковые идентификаторы? |
Цитата:
|
Отлично! Друзья, я вам буду очень признателен за любую наводку на более "красивое" решение.
Я попытался максимально компактно и доходчиво сформулировать ниже, почему у меня активно применяются строковые ID. Класс игрового действия состоит из 3-х компонентов: справочных данных (ActionData), а также 2-х персонажей, один из которых - "актор" (кто активно действует), а второй - "реципиент" (кто принимает эффект от действия). Вот смотрите кусочек класса ActionEntity: Код AS3:
ActionData (наследник класса ADEntity) - содержит "справочные" данные действия. Они неизменны, и теоретически их можно (и наверное нужно) вообще из кода перенести куда-нибудь, но сейчас не об этом. Важно, что там формулируются условия нескольких видов: критические (при их невыполнении действие не будет создано), видимости (действие не будет выведено игроку) и активности (действие будет неактивно). Вот как это сделано сейчас: Код AS3:
Вот маленький кусочек кода, где создаётся действие рукопашной атаки: Код AS3:
В классе ActionEntity запуск проверки условий выглядит так: Код AS3:
Добавлено через 21 час 11 минут Посидел-подумал... Вот такой вариант проверки условий придумался без использования строковых идентификаторов. Код AS3:
|
Не читал последнее сообщение, но
обращайся напрямую через компоненты, например: character.progression.xp Либо создай псевдо-свойства в базовом классе с геттерами, которые будут вызывать геттеры соответствующего свойства в его компоненте Добавлено через 3 минуты Но на компоненты имеет смысл делить, когда есть еще и дополнительная функциональность, связанная с этими свойствами, иначе получаем запах "Data Object". Если ее нет, но свойств слишком много, проверь принцип одной обязанности - класс должен отвечать только за что-то одно. Например, раньше у меня класс игрока содержал две абсолютно несвязанные друг с другом части - представление прогресса игрока и его раскачки и представление игрока в бою (с хп, маной и т. д.). Потом я их разделил на два класса |
Вроде интерфейсы прям-таки и напрашиваются.
|
Часовой пояс GMT +4, время: 15:47. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.