Часто flex-разработчики работают в небольших командах, либо (о, ужас) в одиночку. А это может привести к тому, что утрачивается критическое отношение к своему коду. Но мы же не хотим деградации! =)

Некоторое время назад Adode выпустили инструмент, который покритикует, укажет на недоработки, ошибки и bad practices в коде – это FlexPMD.
Расшифровка PMD точно неизвестна, но мне нравится – Programming Mistake Detector. Эту технологию уже давно используют Java-разработчики.

Даже если вы пишете идеальный код (чего, конечно, не бывает), то будет полезно узнать про пару-тройку неиспользуемых методов или наличие пустых используемых методов. Или может в каком-то методе затесался неиспользуемый аргумент? =)

На пути к идеальному коду у вас три этапа:

  1. определение правил, на соответствие которым будет проверен код (используем FlexPMD Ruleset Creator)
  2. запуск FlexPMD и получение в результате файла с расширением pmd.xml
  3. просмотр pmd-файла, например, с помощью PMD Violations Viewer

Набор правил

Прежде всего необходимо определиться с набором правил, по которым будет проверяться код. Адобе предоставил FlexPMD Ruleset Creator, который по умолчанию предлагает набор из 84 правил разного приоритета: Error, Warning, Info. Этот набор можно редактировать и сгенерить файл pmd.xml, который будет в дальнейшем использоваться при проверке кода.

Расскажу кратко про некоторые правила.

Error priority

Ошибками считается:

  • использование BindingUtils и ChangeWatcher. Да и как тут не согласиться? Ведь на этапе компиляции вы не узнаете о том, что все плохо.
  • использование callLater. А кто бы сомневался?
  • использование dynamic классов, Dictionary, Object и *.
  • создание или удаление чайлдов внутри updateDisplayList и вообще не внутри createChildren
  • dispatch события внутри конструктора (а кому нужны такие события? =))
  • некорректные метаданные [Event]. Вот это удобно.
  • использование не статических констант. Константы обязаны быть статическими.
  • наличие неиспользуемых, методов, параметров и тд. Это полезно. Часто в больших проектах повисают неиспользуемые методы, классы и даже пакеты. =)

Warning priority

  • Предупреждают, что не надо инстанциировать переменную в цикле.
  • Не рекомендуют использовать статические переменные. И правильно.
  • Также не рекомендуют делать весь класс [Bindable]. Тоже правильно. Что тут скажешь?
  • Находит слишком сложные методы и указывает на это. Если программе метод кажется слишком сложным, то что же делать вашим коллегам?
  • Ну и конечно вложенные if else никуда не годятся.
  • Много импортов наводят программку на размышления о том, что этот объект связан слишком со многими. А это не есть гуд.
  • Слишком длинные методы, конструкторы и тп не нравятся никому.
  • Кстати, на нравятся заглавные буквы в названии пакетов. Что ж. Может в этом что-то есть.
  • Очень приятно, что даются рекомендации понижать уровень видимости методов. Ура-ура! =)
  • Слишком много параметров у метода? Да я сама это терпеть не могу.
  • Наблюдая переменные со странными именами (наличие цифр, tmp и тд), программа тоже дает об этом знать.

Info priority

  • Слишком короткое имя переменной.
  • Слишком длинная строка кода.
  • Конструктор какого-то фига имеет возвращаемое значение.
  • Отсутствует copyright header.

В общем, лично я считаю эту программу крайне полезной. Если вы практикуете в команде ревью кода, то это может помочь на начальном этапе. Если команды нет, то полезно для самоорганизации.

Шаги к идеальному коду с помощью Ant

Приведу шаги, в результате которых, вы сможете узнать всю правду про свой код. =)
Это вариант с использованием Ant.

  1. Скачиваем нужную версию http://opensource.adobe.com/wiki/display/flexpmd/Downloads из колонки “Ant Task”
  2. Распаковываем архив в любое удобное место, например в C:\Program Files\flex-pmd
  3. С помощью FlexPMD Ruleset Creator создаем файл pmd.xml и кладем в любое удобное место, например тоже в C:\Program Files\flex-pmd. Для начала можно правила не редактировать, а просто кликнуть “Export” и сохранить файл.
  4. В файл свойств для build.xml добавляем переменные
    FLEXPMD=c:/Program Files/flex-pmd
    FLEXPMD_VERSION=1.0.RC4
    Пример файла local.properties:
    FLEXPMD=c:/Program Files/flex-pmd
    FLEXPMD_VERSION=1.0.RC4
    SRC_DIR =${basedir}/src
    DEPLOY_DIR = ${basedir}/DEPLOY
  5. Пример build.xml:

    XML:

    <project name="" default="pmd">
      <!−− load previously defined configuration properties file −−>
      <property file="local.properties" />    
        <!−− delete and create the DEPLOY dir again −−>
      <target name="init">
        <delete dir="${DEPLOY_DIR}" />
        <mkdir dir="${DEPLOY_DIR}" />      
      </target>
      <taskdef name="flexPmd"
        classname="com.adobe.ac.pmd.ant.FlexPmdAntTask"
        classpath="${FLEXPMD}/flex-pmd-ant-task-${FLEXPMD_VERSION}.jar">
            <classpath>
                <pathelement location="${FLEXPMD}/flex-pmd-ruleset-api-${FLEXPMD_VERSION}.jar"/>
                <pathelement location="${FLEXPMD}/flex-pmd-ruleset-${FLEXPMD_VERSION}.jar"/>
                <pathelement location="${FLEXPMD}/flex-pmd-core-${FLEXPMD_VERSION}.jar"/>
                <pathelement location="${FLEXPMD}/as3-plugin-utils-${FLEXPMD_VERSION}.jar"/>
                <pathelement location="${FLEXPMD}/as3-parser-${FLEXPMD_VERSION}.jar"/>
                <pathelement location="${FLEXPMD}/pmd-4.2.2.jar"/>
                <pathelement location="${FLEXPMD}/commons-lang-2.4.jar"/>
                <pathelement location="${FLEXPMD}/flex-pmd-files-${FLEXPMD_VERSION}.jar"/>
                <pathelement location="${FLEXPMD}/as3-parser-api-${FLEXPMD_VERSION}.jar"/>
                <pathelement location="${FLEXPMD}/plexus-utils-1.0.2.jar"/>
            </classpath>
        </taskdef>
     
        <target name="pmd" depends="init">
            <flexPmd
                sourceDirectory="${SRC_DIR}"
                outputDirectory="${DEPLOY_DIR}"
                ruleSet="${FLEXPMD}/pmd.xml"/>
        </target>
    </project>
  6. Полученный pmd.xml анализируем с помощью PMD Violations Viewer
Теги: ant, flex, flexpmd

Трекбек адрес этой записи

URL трекбека (щелкните правой кнопкой мыши и скопируйте ссылку)

6 комментариев

Комментарий от: yzh44yzh [Посетитель]
Все ок, но смутило, что использование BindingUtils относят к ошибкам. Я использую переодически, но не от хорошей жизни. Просто не представляю, как можно выкрутится без них, например, в такой ситуации: http://juick.com/yzh44yzh/321622
2009-10-20 @ 14:38
Комментарий от: yzh44yzh [Посетитель]
Ах да, там же невидно, что у меня за ситуация. В моем блоге есть вьюшка, показывающая список статей. Там нельзя использовать List, потому что элементы списка имеют разную высоту. Вместо этого приходится использовать VBox. И поскольку я не могу использовать dataProvider, приходится явно пересоздавать в этом VBox дочерние элеметы при каждом изменении списка статей. Стало быть, при изменении списка статей в модели мне нужно вызывать метод.

И как тут обойтись без BindingUtils? В вышеуказанном линке описано, как я пытался выкрутиться с помощью MethodInvoker, но не получилось. И оказалось, что это вообще архитектурно неправильно -- вызывать в EventMap какие-либо методы во вьющках.
2009-10-20 @ 14:48
Комментарий от: yzh44yzh [Посетитель]
Проблема с BindingUtils решена http://juick.com/yzh44yzh/328213

Junik, можешь убрать нафиг мои комменты. Они тут не совсем в тему.

PS: комменты в блогах отстой, жуйк рулит :)
2009-10-20 @ 15:15
Junik, можешь убрать нафиг мои комменты. Они тут не совсем в тему.

Да уж пусть будут. =)
Кстати, использование BindingUtils можно часто заменить подпиской на события.
Я видела вот такую жесть:
BindingUtils.bindSetter(sizeChangeHandler, this, "width");
BindingUtils.bindSetter(sizeChangeHandler, this, "height");
Хотя послушать событие resize было бы как-то логичнее. =)
2009-10-20 @ 15:34
Комментарий от: AS3Coder [Посетитель] · http://as3coder.blogspot.com/
Есть и плагин для FlashDevelop http://www.swfgeek.net/2009/09/18/using-flex-pmd-in-flashdevelop-3/
2009-10-22 @ 10:29
Комментарий от: Михайло [Посетитель]
PMD = Project Mess Detector
2009-11-16 @ 15:34

Эта запись имеет 1 отзыв, ожидающий модерации...

Оставить комментарий


Ваш email адрес. (Не будет показан на сайте.)

Ваш URL будет показан.
:!: :?: :idea: :) :D :p B) ;) :> :roll: :oops: :| :-/ :( :'( |-| :>> :yes: ;D :P :)) 88| :. :no: XX( :lalala: :crazy: >:XX
(Заменить прерывания строк на <br />)
(Имя, email и сайт)
(Разрешить пользователям посылать вам сообщения (ваш email не отображается).)
3 + 2 + 7 - 1?
antispam test

Вы можете использовать OpenID чтобы предоставить ваше имя, email и url.