http://opensource.adobe.com/wiki/display/flexsdk/Coding%20Conventionsを自分用にまとめた。
コーディングスタイル編です。命名規則よりも更に、個人/組織ごとにカスタマイズすればいいんだと思います。
プロパティベースのAPIを使う
メソッドベースではなくプロパティベースを極力使う。
- メソッドベース
function getNext():Object { ... } function hasNext():Boolean { ... }
- プロパティベース
function get next():Object { ... } function get hasNext():Boolean { ... }
型宣言
型宣言は必ず行う。不定の型の場合も明示的に示す。
var hoge; // だめ var hoge:*; // 良い(初期値がundefinedであることを表す際は*) var hoge:Object; // 良い(初期値がnullであることを表す際はObject)
配列の要素を明示的に
FP10からはVectorを使えばいいのかな、と思います。*の場合は、 var kome:Array /* of * */ = [];こんなの?なんか嫌。
これ書いておくとVectorに置き換えやすいかも?(思いつきです)
var a:Array /* of String */ = []; function f(a:Array /* of Number */):Array /* of Object */ { ... }
リテラル
undefinedは*宣言した変数以外では使わない
16進数では小文字のxと大文字のA〜Fを使う
var color:uint = 0xFFAA33;
RGBカラーは24bitの場合6桁。32bitの場合8桁で記述する。
var color24:uint = 0x000000; 0の桁も略さない var color32:uint = 0x00000000;
Numberリテラルにおいて、少数が一般的である場合、.0も略さない
var shape:Shape = new Shape(); shape.alpha = 1.0;
Numberリテラルであっても、座標に関しては整数で記述する
(twip*1の倍数でない場合の問題回避にもなる)
var shape:Shape = new Shape(); shape.x = 100; // 100.5とかやめようよ。ましてや100.07とか。。。
指数表現は小文字
1.0e12
Stringは""で囲う''はだめ
var string:String = "すとりんぐ!";
Arrayは[]、new Array()しない
var hogeList:Array = [];
Objectは{}、new Object()だめぜったい。
var oreObject:Object = {property: "あれこれ"};
RegExpは//、new RegExp()はモテない。
var pattern:RegExp = /\d+/g;
Functionは中身が一行でも;をつける。型宣言ももちろん書く
var hoge:Function = function():void {trace("I'm function!!!");}
Classの修飾子は同じクラス内で同一名を使用する場合のみ用いる
import mx.controls.Button; import my.controls.Button; ... var b:Button = new mx.controls.Button();
語法
Boolean値の確認
Boolean型の変数と、true, falseとの比較をしない。Number型に関しては、明示的に比較を行う。nullや空文字の判定も明示的に行う。
var flg:Boolean = true; var count:int = 0; var message:String = ""; if (flg) // if (flg == true)としない { if (count == 0) // if (count)としない { if (message == "") { trace("default message"); } else { trace(message); } } }
キャスティング
キャストを使う。asは例外を発生させたくない場合、かつ値がnullとなってよい場合のみ使う。
MovieClip(target).x += 100;
比較
等号比較の場合、変数を左辺へ記述する。不等号比較の場合、小なり記号に統一する*2
if (n == 3) { trace("おなじ"); } if (n < 3) { trace("ちいさい"); } if (3 < n) { trace("おおきい"); }
インクリメント・デクリメント
その意味が同等の場合、ポスト〜を使う。
var list:Array = [1, 2, 3, 4]; var length:uint = list.length; if (var i:uint = 0; i < length; i++) // ++iとしない { trace(i + ":" + list[i]); }
ステートメント
セミコロンを省略しない
var strict:String = "ちゃんと書く";
includeは#includeとしない
include "hoge.as";
import文でワイルドカード*を使用しない
import flash.display.MovieClip; // flash.display.*;としない
use namespaceを使わない。明示的にnamespaceで修飾する。
import mx.core.mx_internal; ... mx_internal::doSomething();
ifにおける{}の省略
if文に含まれる処理が一行である場合は、{}を省略する。但し、if/else文においていずれかに複数の処理がある場合は{}の省略はしない。
if (flag) doSomething(); else otherSomething(); if (flag) { doSomething1(); // 1行だけど、elseが複数行なので{}を省略しない } else { doSomething2(); doSomething3(); }
ifにおけるreturn
エラーチェックなど無駄な入れ子を構造を避けるために、失敗のreturnをなるべく先に記述する。
if (parameter.length < 0) { return false; } ... return true;
for文では含まれる処理が一の場合でも{}を省略しない。上限値を再評価する必要がない場合はローカル変数へ格納する。
var list:Array = [2, 3, 4, 5]; var length:uint = list.length; for (var i:uint = 0; i < length; i++) { ... }
while, do文では含まれる処理が一の場合でも{}を省略しない。
switch文ではcaseごとに{}で囲う
switch (n) { case 0: { foo(); break; } case 1: { bar(); return; } }
return文を余計な()で囲わない
return a + b; // return (a + b);としない
複数の宣言を一行で記述しない。
var a:uint = 1; // var a:uint = 1, b:uint = 2;としない var b:uint = 2;
overrideの記述は他のアクセス指示子よりも前に記述する。
override protected function hoge():void // protected override function hoge():voidとしない { ... }
アクセス指示子の指定は省略しない
ただし、アクセス指示子が記述可能場合のみ
static, finalの記述は他のアクセス指示子よりも後に記述する。
public static var hoge:String = ""; // static public var hoge:String = "";としない
定数はinstance変数としないでstatic変数とする
public static const HOGE_CONST:String = "hogeEvent"; // public const HOGE_CONST:String = "hogeEvent";としない
変数をデフォルト値以外で初期化したい場合は、コンストラクタでではなく宣言でこれを行う
これは、ずっとコンストラクタで行っていたので、そっちがいいなぁ。。。
private var counter:int = 1; // 以下のようにしない private var counter:int; public function Hoge() { counter = 1; }
ローカル変数は、その変数が初めて使用される時点、または使用される直前に宣言する。 すべての宣言を関数の最初の部分に記述することは避ける。
ローカル変数は、1つの関数内で1度だけ宣言するようする。 ActionScript 3はブロックス有効範囲のローカル変数に対応していない。
var a:int; if (flag) { a = 1; // var a:int = 1; 両方で宣言すると重複宣言のWarningが発生する ... } else { a = 2; // var a:int = 1; 両方で宣言すると重複宣言のWarningが発生する ... }