BeInteractive?!コーディング規約

http://pear.php.net/manual/ja/standards.php を参考に書いた

インデント

  • スペース4つ
    • タブだと環境によって変わったりするし。8つは長過ぎる。
    • でもエディタの設定忘れてたまにタブになってることがある。すいません。
  • ↑について指摘。http://to.tumblr.com/post/11042505
    • 「俺はインデント = スペース4つと解釈してるよ」ということだったので、他人が触る前提なら確かに行頭タブ+後はスペースの方が親切だし意味的にも合ってる気がする。
    • ちなみに「俺の画面で見えてるとおりに、他のやつも見えるべき」みたいなデザイナのオナニー的思考は確かにあります。それは否定しません。

制御構造

  • キーワードと括弧の間はスペースひとつ開ける
    • メソッド呼び出しと区別するため
  • 省略可能な場合でも波括弧は省略しない
    • バグの混入を防ぐため
    • 統一感を出すため(見た目的に)
  • キーワードと波括弧は同じ行
    • 関数定義と区別するため
  • elseは閉じ波括弧の次の行
    • コメントアウトや移動/編集しやすくするため
if (flag) {
    doSomething();
}
else {
    doSomethingElse();
}
  • switchはこう
    • caseで1個、中身で1個インデント下げ
    • breakは揃える
    • defaultは基本最後だがフォールスルー使う場合や意味的に違う位置が良い場合はこの限りではない
switch (condition) {
    case 1:
        doA();
        break;
    case 2:
        doB();
        break;
    default:
        doDefault();
        break;
}

メソッド呼び出し

  • メソッド名と括弧の間にスペースは空けない
  • 括弧と最初の引数の間にスペースは空けない
  • 引数とカンマの間にスペースは空けない
  • カンマの後はスペースをひとつ開ける
  • 最後の引数と括弧の間にスペースは空けない
var result:uint = doSomething(arg1, arg2, arg3);
  • 引数が複数行にまたがる場合カンマの後で改行し開始位置を揃える
var result:uint = doSomething(arg1, arg2,
                              arg3, arg4);

演算子

  • 演算子の前後にはスペースを入れる
  • 括弧はスペースを入れない
var val:uint = a * (b + (c.hoge() - d));
  • インクリメント/デクリメントについては片方だけスペース

型指定

  • :の前後にスペースは入れない
var hoge:String = 'hoge';
public function hoge():void
{
}
  • 型指定は省略しない
  • 全てを代入可能な場合は、アスタリスクを使って明示する
var object:*;

キャスト

  • 基本は()によるキャスト
  • asによるキャストは例外を発生させたくない場合のみ
  • きちんと意味を考えて使い分ける

クラス定義

  • ライセンスブロックが最初に来てその後package
  • packageもclassも改行してから波括弧
  • クラス定義の前にimport
  • privateなclassを定義する場合、定義前に1行ずつ空ける
/*
 * ライセンスブロック
 */
package org.libspark
{
    import flash.display.Sprite;
    import flash.display.MovieClip;

    /**
     * ASDoc
     */
    public class Hoge
    {
        /**
         * ASDoc
         */
        public function Hoge()
        {
        }
    }
}

import flash.utils.getTimer;

class PrivateClass
{
}

class PrivateClass2
{
}

メンバ定義順

  • 基本順: public -> protected|internal|private
  • 基本順: const -> var -> function
  • 基本順: static -> instance
public class Hoge
{
    // staticな変数と定数

    // staticなメソッド

    // コンストラクタ

    // private変数まとめて書く

    // getter/setterをまとめて書く

    // publicメソッド

    // privateメソッド

    // イベントハンドラ
}
  • ただし関連性の高いメソッドはできるだけ近くに置く

メンバ定義

  • (public|internal|protected|private) static override はこの順で書く
    • アクセス修飾子が全て端に揃っていた方が見易い
    • 出現頻度の高い順でもある
  • 定数及びstaticな変数についてはインライン初期化しても構わないが、インスタンス変数はできるだけコンストラクタで初期化する
    • 初期化が分散すると見づらいため
public class Hoge
{
    private static var instances:Array = new Array();

    public function Hoge()
    {
        list = new Array();
    }

    private var list:Array;

命名規則

  • camelCaseで書く
hogeFuga
fooBarBaz
  • 定数は全て大文字で_区切り
PUBLIC_STATIC_CONSTANT
  • できるだけ簡潔な命名を心がけるが、変な省略はしない
  • Booleanを返す変数/メソッドはtrue/falseが何を表現するのか分かり易いように命名する
  • privateな変数には全て_をつける
    • 見分け易く統一感がある
    • 同名のgetter/setterを書き易い(後からgetter/setterが必要になった場合を含めて)
    • 同名のローカル変数を作ることが出来る(特に配列)
  • ループ用カウンタは i, j, k, ...
  • 配列の長さを保持する変数は l
private var _list:Array;

public function get list():Array
{
    return _list;
}

public functoin initializeList(value:Number):void
{
    var list:Array = _list;
    var l:uint = list.length;
    for (var i:uint = 0; i < l; ++i) {
        list[i] = value;
    }
}
  • イベントリスナは target名 + イベント名 + Handler
    • targetが明白及びthisである場合は省略可
buttonClickHandler
enterFrameHandler
  • thisは基本的に使わない。インスタンスとローカルで名前が重複した場合のみ。

関数定義

  • 型指定の後は改行して波括弧
    • 制御構造と区別するため
  • 引数の書き方は関数呼び出しと同じ
public function hoge(arg1:String, arg2:Number, arg3:Boolean = true, ...rest:Array):void
{
}

getter/setter

  • getter -> setter の順で書く
  • setterの引数名はvalueで統一する
public function get property():Object
{
    return _property;
}


public function set property(value:Object):void
{
    _property = value;
}

コメント

  • 全て // を使う
  • 複数行も // を使う
    • 最初1行だったものを複数行にする必要が出てきたときも直さなくて良い
  • // の後はスペースひとつあける
    • /**/ これは書くのが面倒
    • 統一感がある
  • コメントは流れるように書く
    • 普通の文章として読めることを意識して
// hogeであれば
if (isHoge) {
    // A処理を行う
    A();
}
// そうでなければ
else {
    // B処理を行って
    // C処理に受け流す
    C(B());
}
  • /**/は複数行のコードをコメントアウトする時に使う
    • コメントアウトする部分の前後に/**/を書くと、/の追加と削除だけでコメントアウトの切り替えが出来る

コメントアウトされていない状態:

a;
/**/
b;
c;
d;
/**/
e;

コメントアウトされている状態:

a;
/**
b;
c;
d;
/**/
e;
  • ASDocはASDocの記法に従う