読者です 読者をやめる 読者になる 読者になる

pblog

pplog.net を作っている @ppworks こと越川直人(Koshikawa Naoto)のブログ。esa LLCで働いてます(\\( ⁰⊖⁰)/)

コーディング規約 コーディングスタイル編

ActionScript3

http://opensource.adobe.com/wiki/display/flexsdk/Coding%20Conventionsを自分用にまとめた。
コーディングスタイル編です。命名規則よりも更に、個人/組織ごとにカスタマイズすればいいんだと思います。

コンパイルオプション

flex sdkにおけるコンパイルオプション

 -strict
 -show-actionscript-warnings

プロパティベースの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;
XML, XMLListは、new XML()ってなんですか。
var xml:XML = aaa;
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();

語法

括弧
  1. 、-、*、/、&&、||、<、<=、>、>=、==、!=といった一般的な演算子を使用する際に、不必要な括弧を記述しない。
var e:Number = a * b / (c + d);
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]);
}
三項演算子の利用

null判定など単純な場合において、利用する

return item ? item.label : null;
new 演算子で()を省略しない

引数がないばあいでも省略はしない

var shape:Shape = new Shape(); // new Shape;としない

ステートメント

セミコロンを省略しない
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が発生する
    ...
}
Classのコンストラクタ

インスタンスの変数に渡す引数がコンストラクタに含まれるのであれば、そのインスタンス変数と同じ名前を付ける。

public function MyClass(foo:int, bar:int)
{
    this.foo = foo;
    this.bar = bar;
}
パッケージステートメント内では、1つのpublic API (通常はクラス、場合によっては名前空間または関数)のみを配置する。

そもそもエラーになるし。

*1:TWentIeth of a Pointの略。1/20ピクセルを表す

*2:Javaのコーディング規約を参考に、勝手に追記しました。