Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Проверить на наличие геттера (http://www.flasher.ru/forum/showthread.php?t=215632)

Appleman 19.07.2018 15:42

Проверить на наличие геттера
 
Друзья, подскажите, пожалуйста, как проверить наличие в классе геттера, зная строку для обращения? Попытка написать:

Код AS3:

trace(SomeClass.hasOwnProperty(PropID))

выдаёт false, даже если геттер в нём прописан. Больше ничего дельного в голову не приходит.

СлаваRa 19.07.2018 18:20

Отказаться от использования столь ужасного подхода к программированию?

alexandrratush 19.07.2018 18:30

Какая задача стоит перед вами? Вам может помочь рефлексия.

СлаваRa 19.07.2018 21:23

Ну какая, вестимо поверить наличие геттера в объекте по строковому ключу.

Appleman 20.07.2018 10:04

Решил. Оказывается, если геттер не объявлен как public, то ничего не получается. Изначально был с модификатором internal.

Цитата:

Сообщение от СлаваRa (Сообщение 1205725)
Отказаться от использования столь ужасного подхода к программированию?

Это процесс не быстрый :)

СлаваRa 20.07.2018 10:29

Чем дольше вы тяните, тем масштабнее будут проблемы и демотивация, но я могу лишь советовать :)

Appleman 20.07.2018 12:38

СлаваRa, ко мне можно и нужно на "ты" :)

Я же не специально... У меня первый проект, я уже год делаю его для себя, в своё удовольствие и в меру собственных способностей. Расширение кругозора происходит стремительно, поэтому уже раза 2 почти полностью переписывал. И скорее всего, это не последний раз.

Если конкретно по обсуждаемому вопросу, но ноги растут вот отсюда. После того как я распихал многочисленные свойства класса Character по нескольким подключаемым классам, возникла проблема с обращениями к ним извне. Они у меня происходят через передачу строкового ID нужного свойства. Раньше я спокойно писал в любом месте, где есть ссылка на экземпляр персонажа: character[PropID], а теперь не могу, так как теперь свойство propID может быть как в самом классе Character, так и в Skills, Personality, Statuses и т.п.

На сегодня лучшее, что по этому поводу придумалось - это сделать единый метод, который будет проверять, где "живёт" запрашиваемое свойство, и выдавать его значение. Заодно применять к нему модификаторы, "подрезать" его при необходимости по установленному максимуму и т.п. Вот такой код:

Код AS3:

public function getProp (propID: String) : * // Возвращает значение свойства по ID
                {
                        if (this.hasOwnProperty(propID)) return this[propID];
 
                        var componentID: String = this.redirectByPropID(propID);
                        return this[componentID][propID];
                }
 
protected function redirectByPropID(propID: String) : String  // Возвращает ID компонента, хранящего свойство
                {
                        if (_personality.hasOwnProperty(propID)) return ChIDs.COMPONENT_PERSONALITY;
                        if (_parameters.hasOwnProperty(propID)) return ChIDs.COMPONENT_PARAMETERS;
                        if (_skills.hasOwnProperty(propID)) return ChIDs.COMPONENT_SKILLS;
 
                        throw (CLASS_DEBUG_NAME + "-> redirectByPropID: неизвестный ID параметра. Используйте константы класса ID персонажей!");               
                }

Если есть что покритиковать и предложить, буду признателен.

caseyryan 27.07.2018 22:09

Не обращая внимания на весь этот ужас в коде, все же спрошу)

А что если у тебя и _personality и _parameters будет содержать свойство propID?
Какое-то странное условие, мягко говоря.
И кстати, на сколько я помню, такая конструкция может легко отвалиться с ошибкой, если класс не динамический

Appleman 28.07.2018 00:15

Цитата:

Сообщение от caseyryan (Сообщение 1205746)
Не обращая внимания на весь этот ужас в коде, все же спрошу)

Ужас - в самом подходе или в его реализации? Не стесняйся, мне самому не нравится, но ничего лучше не придумалось пока.

Цитата:

А что если у тебя и _personality и _parameters будет содержать свойство propID?
Какое-то странное условие, мягко говоря.
Вообще такого быть не должно, так как я изначально разделил разные свойства персонажа на несколько блоков. Но теоретически, конечно, будет косяк, т.к. всегда будет возвращаться ссылка на первый проверяемый компонент.

Цитата:

И кстати, на сколько я помню, такая конструкция может легко отвалиться с ошибкой, если класс не динамический
Не, классы не динамические, всё работает. Главное, чтобы геттеры внутри имели модификатор public. Со всеми остальными hasOwnProperty выдаёт false.

СлаваRa 28.07.2018 00:51

с таким подходом не возможно:
- рефакторинг
- обнаружение синтаксисческих ошибок на этапе компиляции
- обнаружение ошибок логики(вопрос выше про совпадение имен)
- нормальная работа IDE
- ...


Часовой пояс GMT +4, время: 15:27.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2022, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.