Нашел в своих архивах правила оформления кода при написание приложение на actionscript, решил что будет кому-нибудь интересно и выложить так что вперед под кат.
Оглавление:
Порядок перечисления членов класса
ASDocs
Метаданные
Полный список порядка следования
Именование
this/super
Оформление кода
7.1 Общая шапка
7.2 Авторство класса
7.3 Спойлеры
7.4 ASDoc private
7.5 Block-style
7.6 Именование и аббревиатуры
7.7 Упорядочивание кода
7.8 Константы
Прочее
1. Порядок перечисления членов класса
Записывать члены класса лучше в определённом порядке, для того что бы любой человек мог сходу определить
место, где определен любой из интересующих его членов.
Можно поделить весь класс на 3 группы и оформлять его в этом порядке лучше их и записывать:
- статические члены (static)
- конструктор
- члены экземпляра
Второе деление проходит по типам членов:
- константы (const)
- переменные (var)
- свойства (get/set, геттер в этой паре всегда должен идти первым)
- методы
- обработчики событий
Констант у экземпляров не бывает. Фактически это свойства.
Дальше режим по видимости членов класса:
- public
- уникальный namespace
- internal
- protected
- private
Последние деление:
- Переопределённые члены (override)
- Члены интерфейса (implements)
- Обычные члены
- Все члены напрямую связанные с каким-то членом, лучше и писать рядом с ним, например:
private var _a:uint = 0;
public function get a():uint {
return this._a;
}
2. ASDocs
Все члены класса должны иметь ASDocs:
/**
* @private
*/
private var _a:uint = 0;
/**
* описание свойства
*/
public function get a():uint {
return this._a;
}
3. Метаданные
Метаданные описываются пред ASDoc'ами:
[Bindable]
/**
* описание свойства
*/
public function get a():uint {
return this._a;
}
3.1. Метаданные класса
Метаданных класса в своём большинстве может быть дофига, поэтому выделим 2 группы:
События ([Event(...)])
Прочие
4. Полный список порядка следования:
public static const.
namespace static const.
internal static const.
protected static const.
private static const.
private static var.
public static get/set.
namespace static get/set.
internal static get/set.
protected static get/set.
public static function.
namespace static function.
internal static function.
protected static function.
private static function.
constructor.
private var / const.
public override get/set
public implements get/set
public get/set
namespace override get/set
namespace get/set
internal override get/set
internal get/set
protected override get/set
protected get/set
public override function.
public implements function.
public function.
namespace override function.
namespace function.
internal override function.
internal function.
protected override function.
protected function.
private function.
events handlers.
5. Именование
- Константы (статические): UPPER_CASE;
- Публичные свойства, методы, имена локальных переменных: camelStyle (camel-style, верблюд, каждое слово с прописной, первое — со строчной);
- private/protected (internal и custom namespace по ситуации) свойства с обязательным подчеркиванием в начале: _camelStyle;
- Свойства, являющиеся членами экземпляра класса, объявленные как const по объявлению не отличаются от обычных свойств (т. е. не используется UPPER_CASE);
- Имена классов с прописной: MyClass;
- Имена обработчиков событий: handler_eventName. "eventName" является значением константы соответствующего события
(например MouseEvent.MOUSE_OVER -> handler_mouseOver)
6. this/super. Обязательное и повсеместное использование this.
Для вызова родительских методов и свойств по умолчанию рекомендуется использовать super (например super.addChild вместо this.addChild).
7. Оформление кода
7.1 Помимо упомянутого ASDoc необходимо также размещать шапку класса (в самом начале класса, год меняется в соответствии с текущим):
////////////////////////////////////////////////////////////////////////////////
//
// YOUR DOMAIN© ${year}
//
////////////////////////////////////////////////////////////////////////////////
7.2 Стандартный ASDoc с именем автора класса (перед объявлением класса в пакете):
/**
* @author %nickname%
* @version 1.0
* @playerversion Flash 9
* @langversion 3.0
*/
NB: Имя автора класса в дальнейшем не изменяется, даже если другой человек полностью его переписал. Авторство остается за тем, кто его создал.
7.3 Визуальное отделение (желательно) однотипных членов класса комментариями-спойлерами:
//------------------------------------------------------------------------
//
// Class variables
//
//------------------------------------------------------------------------
...переменные класса...
//------------------------------------------------------------------------
//
// Constructor
//
//------------------------------------------------------------------------
...конструктор...
и т. д.
7.4 Все недоступные снаружи (кроме public) члена класса должны иметь ASDoc @private:
/**
* @private
*/
7.5 Визуальное разделение блоков кода пустыми строками (обозначены как ***):
var x:Number = 10;
var y:Number = 20;
***
super.addChild...;
super.removeChild...;
super.setChildIndex...;
x = 50;
***
if (x > 40) {
(фигурная скобка не переносится, пустой строки после скобки также нет)
this.move(50, 60);
***
if (y == 90) {
super.doSomething();
this.doAnotherThing();
}
***
if (super.enabled) super.disable();
(в однострочном условии, цикле и т. п. фигурные скобки можно опустить и писать в одну строку)
this.render();
}
***
this.done();
7.6 При именовании следует избегать избыточности. Не стоит допускать имен, состоящих более чем из четырех слов.
Аббревиатуры и сокращения в нижний регистр не переводятся (playerID вместо playerId, CSSUtils вместо CssUtils, SWFFormat вместо SwfFormat и т. д.)
7.7 При написании однотипных членов класса стоит соблюдать логический порядок. Например, если некие команды сервера описаны в xml-файле, то их реализация в коде должна иметь в коде такой же порядок следования, что и в xml. Методы добавления/удаления чего-либо должны следовать вместе (addChild, потом removeChild и т. п.)
Порядок подписки/отписки на события какого либо объекта должен совпадать с порядком следования обработчиков:
super.addEventListener(Event.ADDED, this.handler_added);
super.addEventListener(Event.ADDED_TO_STAGE, this.handler_addedToStage);
super.addEventListener(Event.REMOVED_FROM_STAGE, this.handler_removedFromStage);
...
super.removeEventListener(Event.ADDED, this.handler_added);
super.removeEventListener(Event.ADDED_TO_STAGE, this.handler_addedToStage);
super.removeEventListener(Event.REMOVED_FROM_STAGE, this.handler_removedFromStage);
...
private function handler_added(event:Event):void {
...
}
private function handler_addedToStage(event:Event):void {
...
}
private function handler_removedFromStage(event:Event):void {
...
}
7.8 Константы событий и их значения напрямую связаны друг с другом путем перевода из UPPER_CASE в camelStyle. Т. е. если константа типа события имеет
имя VARIABLE_CHANGE, то значение его будет variableChange. Иные варианты не допускаются. При постановке метатега [Event] и при написании
подписки на события в Flex Builder редактор автоматически добавляет в список доступных события, указанные в метатегах, при этом имя константы будет получено
переводом значения параметра name из camelStyle в UPPER_CASE. При написании имени обработчика события после handler_ пишется значение константы.
8. Прочее
Для удобства разработки советую использовать Eclipse Monkey (http://download.eclipse.org/technology/dash/update) Эта тулза ускоряет разработку раз в несколько, за скриптами для него обращаться на m.sychev@crazybit.ru
Формат хранения swf-библиотек. Flash Player 10, Actionscript 3.0, Flash CS4. Именование через ‘_’ например: button_0_0_up, window_3_1, question_icon
Комментариев нет:
Отправить комментарий
Поделиться своими мыслями...