secondlife コーディングルール

俺俺 AS3 のコーディングするときに適用しているルール。特に何かのコーディング規約を参考にしているわけではなくなんとなく。JavaScript? 書く感じに近いかも

全般

こんな感じに書いてます。(このコードは動かないよ!)

package com.example {
    import flash.display.Sprite;

    public class Example extends Sprite {
        public function Example() {
            super();
        }

        public function fooBarBaz(arg1:Number, arg2:RegExp, ... args):String {
            var foo:String = 'foo';
            if (foo == bar) {
                //
            }

            for (var i:uint = 0; i < expression; i++) {
            }

            for each (var key:String in hash) {
                hash[key] = baz();
            }
            return foo;
        }

        public function mouseDownHandler(e:Event):void {
            //
        }
    }
}

インデント

tab は使わずスペース四つ

スペース位置

  • {, } を書く場合は必ず前にスペースを入れる
    if (exp) {
        //
    } else if (exp) {
        //
    } else {
        //
    }
    
  • = の前後もスペースを入れる
  • , 行末でない; の後にはスペースを入れる
        call(foo, bar, baz);
        for (var i:uint = 0; i < expression; i++) {
    
  • 型指定 : の前後はスペースを入れない
        var foo:String = '';
        public function foo():void {
    

変数, 関数名

  • 基本は camelCase
        fooBarBaz
        originalSize
        completeHandler
    
  • 頭に _ はつけない。_をつけるのは getter/setter でラップする変数のみ
        private var _size:int;
        
        public function get size():int {
            return _size;
        }
        
        public function set size(newSize:int):void {
            _size = newSize;
        }
    
  • this でのインスタンス変数(プロパティ)呼び出しは基本行わない。ローカル変数で重複する場合や、見通しが悪い時のみつける
        public var times:uint;
        public function run(times:uint):void {
            this.times = times;
        }
    

キャスト

  • キャストはただの変数キャストなら 型() で、レシーバ呼び出しの戻り値では as で行う。型() と as だと挙動がちがうけどまぁ、、、。見通し優先。
        var x:Number = Number(num);
    
        var x:Number = foo.methodCall() as Number;
    
        // この書き方は見づらいのでしない
        var x:Number = Number(foo.methodCall());
    

イベントリスナ

  • 自分自身に対するリスナはイベント名の camelCase + Handler で
        private function mouseDownHandler(e:Event):void {
    
  • 自分自身のプロパティや変数に対するリスナ(バインドメソッド)の場合は、変数名 + イベント名 + camelCase + Handler で
        private var star:Sprite;
        // 中略
        private function starMouseDownHandler(e:Event):void {
    

コメント

  • コメントは一行、後置なら // で。三行以上やドキュメントなら /* */ で。
        // コメント
    
        /*
         * 三行
         */
    

前置 if/for

  • 前置 if は基本一行で書く。
        if (a == b || c == d) foo.callMethod(bar);
    

行が長いときは二行に。また三行以上の時は {} を使う。

    if (a == b || c == d || e == f) 
        foo.bar.bazcallMethod(arg1, arg2, arg3);
  • 前置 for(って云うの?) は使わない。for は後に複数行になることが多いので。

if/else if/else

  • 基本的に制御構造の部分は一行で書く
        if (exp) {
            //
        } else if (exp) {
            //
        } else {
            //
        }
    

行末のセミコロン

  • AS3 では行末のセミコロンを省略できる場合がほとんどが、明示的に ; はつける。
        foo = bar;
        doSomething();
        fooBarBaz(arg);
    
  • Ruby だとセミコロン省略が普通だけど AS3 だとなんか気持ち悪いんだよね…。
        // これでも動く、けど気持ち悪い
        foo = bar
        doSomething()
        fooBarBaz(arg)