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が発生する
...
}