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

    −184.5

    1. 1
    2. 2
    3. 3
    4. 4
    override public function toString():String
        {
            return Object(container).toString() + "." + super.toString();
        }

    Еще одно украшение Флексового фреймворка: mx.core::Repeater.
    Для тех, кто не в курсе: toString() вызываетйса автоматически когда мы пытаемся вывести информацию об объекте в консоль. (Т.е. жизненно необходим для тестирования). Свойство container у репитера радко, но может буть null, но изза того, что флексовые разработчики не категорически никогда не кастуют ничего, то это должно было бы выкинуть исключение, но, конвертация используемая в примере (вместо каста) в силу особенностей языка вместо того чтобы просто умереть с исключением создаст новый динамический объект, врезультате получим что-то типа:
    "[Object object].имяКомпонента".
    т.е. на самом деле код должен был выглядеть примерно так:

    return (this.container ? this.container.toString() + "." : "") + super.toString();

    Запостил: wvxvw, 05 Февраля 2010

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

    • Для тех, кто не в курсе: toString() вызывается автоматически когда мы пытаемся вывести информацию об объекте в консоль. (Т.е. жизненно необходим для тестирования). Свойство container у репитера редко, но может быть null, но изза того, что флексовые разработчики категорически никогда не кастуют ничего, то это должно было бы выкинуть исключение, но, конвертация используемая в примере (вместо каста) в силу особенностей языка вместо того чтобы просто умереть с исключением создаст новый динамический объект, врезультате получим что-то типа:
      (Прошу прощения - куча ошибок, надо больше спать...)
      Ответить
      • Object(container) - это не совсем каст... Это создание нового объекта из старого. Чтобы вылетел эксепшн достаточно было просто сделать container.toString()
        Настолько я помню, null объектом не является во флеше, прога выпадет.

        Ну в общем, это не совсем прям говнокод. Скорее баг, который надо запостить в соответстующие органы =)
        Ответить
        • Не, фишка в том, что код рабочий. т.е. Object(null) - получаем [Object object] но это явно не то, что автор хотел. Просто container типизован как какой-то интерфейс, а вызов toSrting() у объекта типизированого как интерфейст даст ошибку компиляции, вот автор и влепил конвертацию незадумтваясь, вместо того, чтобы на null проверить.
          Ответить
    • override перед toString() не нужен
      дока - http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/Object.html#toString%28%29
      Ответить
      • Не, с этим там как раз все в порядке - Repeater наследуется от UIComponent, а там toString() уже определен, поэтому надо override.
        Ответить

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