【Flex】Flexのコーディング規約のお話
こんにちは、橋本です。
今日はFlexのコーディング規約についてお話しようと思います。
「え、Flexにコーディング規約なんてあったの!?」
とお思いの方も多いかと思いますが、実は公式のコーディング規約が存在します。
Flex SDK coding conventions and best practices
今日はこの中で個人的に気になったところを拾って見ていきたいと思います。
略語
原則は、略語を使用しないということになっていますが、一部標準化されている略語があります。
acc: accessibility(アクセシビリティ)。使用例: ButtonAccImpl
auto: automatic(自動)。使用例: autoLayout
eval: evaluate(評価)。使用例: EvalBindingResponder
impl: implementation(実装)。使用例: ButtonAccImpl
info: information(情報)。使用例: GridRowInfo
num: number(数値)。使用例: numChildren
min: minimum(最小)。使用例: minWidth
max: maximum(最大)。使用例: maxHeight
nav: navigation(ナビゲーション)。使用例: NavBar
regexp: regular expression(正規表現)。使用例: RegExpValidator
util: utility(ユーティリティ)。使用例: StringUtil
個人的には、obj(object)、arr(array)、str(string)なんかも標準に入れても良い気がするのですが。
プロパティ名(変数およびgetter/setter)
小文字で綴りを開始し、以後の連語をキャメルケース方式で記述します。例: i、width、numChildren。
ループのインデックスにはi、上限値にはnをそれぞれ使用します。 内部ループのインデックスにはj、上限値にはmをそれぞれ使用します。
for (var i:int = 0; i < n; i++)
{
for (var j:int = 0; j < m; j++)
{
...
}
}
for-inループの変数には、p(プロパティの頭文字)を使用します。
for (var p:String in o)
{
...
}
for文に関しては、特に異論はないのですが、for-in文の規約には個人的に納得出来ないというか、微妙な気がします。
pってわかりにくいですよね?
for-in文の中でさらにfor-in文を使うときにはどうするんでしょうか?pをプロパティの頭文字と言うのであれば、qだとおかしいですよね?だとすると、p2?
微妙ですね。。。
ストレージ変数名
getter/setterのfooのストレージ変数には、_fooという名前を付けます。
これも、好き嫌いがあると思います。個人的には、内部プロパティについては、全て_hogehogeといった感じで、アンダーバーからスタートする変数名に統一するのが、意外と分かりやすくていいんじゃないかな、と。
イベントハンドラ名
イベントハンドラには、イベントの種類を示す語句に「Handler」を結合した名前を付けます。例: mouseDownHandler()。
仮にハンドラが、サブコンポーネント(this}}以外のものなど)によってディスパッチされるイベント用のものである場合は、ハンドラ名の前にサブコンポーネント名を付け、これらをアンダースコアで結合します。例: textInput_focusInHandler()。
イベントハンドラについては、onを接頭詞として付ける派(onMouseDown、など)の方もいらっしゃるかと思いますが、FlashBuilder4から追加された、イベントハンドラを自動で作成してくれる機能では、上記の規約に従ってメソッドが作成されるので、こちらに移行した方がいろいろと楽かもしれません。
引数名
各setterの引数には、valueを使用します。
public function set label(value:String):void
各イベントハンドラの引数には、(e、evt、eventObjではなく)eventを使用します。
protected function mouseDownHandler(event:Event):void
個人的には、setterの引数には、setする引数名を使いたくなるんですが。。
private var _hoge:String;
public function set hoge(hoge:String):void
{
_hoge = hoge;
}
どっちがわかりやすいんでしょうか。
型宣言
すべての定数、変数、関数引数、関数の戻り値に対して、型宣言を記述します。
Arrayデータ型を宣言する場合は、/* of ElementType */の体裁のコメントをArray直後に記述し、配列要素の型を示すようにします。 将来バージョンの言語では、型付けされた配列が含まれる見込みです。
これは、めんどくさいんですが、慣れるとコードが読みやすくていいかもしれません。
こんな感じです。
var arr:Array /* of String */ = [];
また、この規約はFlash10以降使えるようになった、Vectorクラスの記述に似せたものなのかもしれません。
Vectorクラスは配列みたいなものなのですが、中に格納するデータの型を指定する必要があります。
private var vector:Vector.<String>;
リテラル
String:
文字列の区切りとしては、たとえその文字列にクオーテーションマークが文字として含まれている場合でも、アポストロフィ(1重引用符)ではなくクオーテーションマーク(2重引用符)を使用します。
"What's up, \"Big Boy\"?";
Array:
new Array()