2015-02-12

メンバ名を見直す前にスコープを見直すべきだ!!!

例えば、こういうクラスがあったとする

/**
** ゲームキャラクラス
**/
class Character {

    /**
    * 歩行の状態にする。
    * @param $place 歩行する場所。
    */
    private function _walk($place){
        $this->_state = Const::STATE_WALK;
        $this->_place = $place;
    }

    /**
    * 山を歩いている状態にする。
    */
    public function walkInMountain(){
        $this->_walk(Const::PLACE_MOUNTAIN);
    }
}

「walkIn~~ってメソッド名長くね?」

「良く使うメソッドから、あんまり書くと、ソースが読みづらくなるんだよね。」

という突っ込みが入ったとする。

対応として、

walkInMountain → walkInMt

とかやってもいいけど、逆に分かりづらくなる。mtってなんやねんと。

そういうときは、メンバのスコープを見直すべきだ。

/**
** 歩行クラス
**/
class Walk {

    private $_chara = null;

    public function __construct($chara){
        $this->_chara = $chara;
    }

    /**
    * 歩行の状態にする。
    * @param $place 歩行する場所。
    */
    private function _walk($place){
        $this->_chara->state = Const::STATE_WALK;
        $this->_chara->place = $place;
    }

    /**
    * 山を歩いている状態にする。
    */
    public function mountain(){
        $this->_walk(Const::PLACE_MOUNTAIN);
    }
}

とすれば、呼び出し元から

$chara = new Character();
$chara->walk->mountain();

みたいに、

主語->動作->述語

という構文で記述できるので、すっきりすると思う。

before)
$chara->walkInMountain();

after)
$chara->walk->mountain();


アレ?名前の長さが変わらない!!!

でも、やりたいことはそういうことだ!

つたわれ!俺の思い!

他にも、メソッドスコープでいくと

int write()
{
    int numberWritable = 0;
     :
}

こんなのは

int write()
{
    int number = 0;
     :
}

にしてしまえ!

writeメソッドにあるんだから、writableだろう!

みたいな。

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん