1. ActionScript / Говнокод #12405

    −94

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    if (!Player.instance.friendMode && (this._complete || (this._wait == 0
            && !this._actionProgress
            && this.data.step
            && this.data.step.tags.find(BSequenceStep.TAG_INDICATOR)
            && this.data.step.waitTimeMs > 0
            )
            )
            ) {
        if (!this._ico) {
            if (!this._complete && (this.buildable.tags.find(Buildable.TAG_CREATURE) ||
                    this.buildable.tags.find(Buildable.TAG_BUSH) ||
                    this.buildable.tags.find(Buildable.TAG_CROP))) {
                this._ico = new GameObjectIco(GameObjectIco.TYPE_TALK, this);
            }
            else {
                this._ico = new GameObjectIco(GameObjectIco.TYPE_REWARD, this);
            }
            alignIco();
        }
    }
    else {
        this.removeIco();
    }

    Запостил: kyzi007, 10 Января 2013

    Комментарии (19) RSS

    • Ну так тут и не упростить особо... можно переписать find чтобы принимало несколько параметров, но зависит от того, как часто нужно искать разные параметры. Если это единичный случай - то я бы не стал.
      Ответить
      • Не единичный. И я боюсь что в таких местах сидят логические баги. Но менять не буду пока, хватит того что 150 строк выгребла сегодня с того класса. А класс - год обжект на котором кусище логики висит (
        Ответить
    • Что уж?.. надо было еще и if(this && ....
      Ответить
    • мда, тут бы не помешала инверсия логики, т.е. вместо тучи условий - куча мелких триггеров, определенные цепочки которых натуральным образом дают нужный результат.
      Ответить
      • Точно. Как минимум что-нибудь такое (cформатировал в своем стиле, но не в этом суть):
        if (Player.instance.friendMode ||
            (!this._complete &&
                (this._wait ||
                 this._actionProgress ||
                !this.data.step ||
                !this.data.step.tags.find(BSequenceStep.TAG_INDICATOR) ||
                 this.data.step.waitTimeMs <= 0)))
        {
            this.removeIco();
        }
        else if (!this._ico)
        {
            GameObjectIco icoType;
            
            if (this._complete ||
                !this.buildable.tags.find(Buildable.TAG_CREATURE) &&
                !this.buildable.tags.find(Buildable.TAG_BUSH) &&
                !this.buildable.tags.find(Buildable.TAG_CROP))
            {
                icoType = GameObjectIco.TYPE_REWARD;
            }
            else
            {
                icoType = GameObjectIco.TYPE_TALK;
            }
            
            this._ico = new GameObjectIco(icoType, this);
            alignIco();
        }
        Ответить
      • Тут нужно, конечно, видеть весь код полностью, чтобы придумать хорошую стратегию для рефакторинга. Что бы я искал в первую очередь: повторяющиеся условия в разных функциях. Например, если в другой функции тоже есть проверка на Player.instance.friendMode - создать отдельный класс, которы активен только в состоянии, когда эта херня истенна: таким образом у нас бы получилось два класса с одинаковым интерфейсом: FriendMode и EnemyMode. В них уже не нужно было бы делать первую проверку. Их можно (возможно?) дальше разделить на несколько других состояний - типа complete, wait и т.д. где конкретные функции бы определялись в состояниях, а класс FriendMode / EnemyMode только транслировал бы вызов функции текущему состоянию, по типу:
        public function growABush():void {
            this.buildingState.growABush();
        }

        если текущее состояние было, например, BuildingStateComplete, то его метод growABush() создавал бы новый куст, а если состояние было BuildingStateBusy - то ошибка / игнор и т.п.
        Ответить
    • > this.buildable.tags.find(Buildable.TAG_BUSH)
      > new GameObjectIco(GameObjectIco.TYPE_TALK, this);
      Главгер разговаривает с кустами и посевами?
      Ответить
      • Опередил. :)
        Ответить
      • Тут скорее странно то, что кусты, животные и посевы были зачислены в категорию стройматериалов... но это уже такое... может там игра про биоинженеров.
        Ответить
        • Это кусты, здания, герой. Говорю же - год обжект. Посевы кстати это здания.
          Ответить
          • Я помню. в одном нашем прототипе растения были actor-ами (по идее этот класс предназначался для персонажей и неписи).
            Ответить
        • Раньше кусты и здания еще умели голодать, но я вынесла таки вверх по иерархии это. Но не все разлепить можно не уйдя в недельную отладку багов. Только вчера убила слово dynamic в "dynamic class AssetData". Теперь надежда на то что с тестерами найдем все обращения к неведомым свойствам до обновления (зы игра уже даже не в бете).
          Ответить
          • И вдруг окажется, что 10% сервера кормило кусты крысиными хвостами и зубами стичей... в надежде на лазеронепробиваемые пластины.
            Ответить
    • На следующий неделе надеюсь грохнуть класс с такими методами -
      http://pastie.org/private/dftkc3rxqardwiglbr0nw
      Я плеать два месяца разбиралась в перерывах в багфиксинге как оно работает. Сейчас пятая попытка убийства.
      Ответить

    Добавить комментарий