オブジェクト指向って

以下OOPの話が挙がっていたので私見を述べようと思う。
「オブジェクト指向の価値ってよく分からないですよね」について - manie's blog
「オブジェクト指向でなぜつくるのか」を読んだ - ✘╹◡╹✘

以下の悪名高い動物のコード例を示す

public class Neko {
    public Neko() { ... }
    public void Nya() { ... }
}

public class Leg {
    public Leg(Neko neko, Where w) { ... }
    public void Walk(int stride) { ... }
}

と定義してあって、以下のように使うとする。

public class Main {
    public static void Main(string[] args) {
        var neko = new Neko();
        var fl = new Leg(neko, Where.Forepaw_Left);
        fl.Walk(10);

        var fr = new Leg(neko, Where.Forepaw_Right);
        ft.Walk(10);
    }
}

例えが悪い件に関しては勘弁してほしい。

このコードが何が言いたいかというと、処理シーケンス中に必要になるたびに具体的なインスタンスをその都度生成して必要な処理を行った場合、従来からある構造化プログラミング技法を使った方が良い結果が得られる(可能性が高い)という事だ。

"これから走る線路を自分で引いてる"という感覚だ。これは利用者がインスタンスの生成と利用の両方に気を配らなければならない関心事が分離されていない状態と考えられる。

従ってより"それらし"くするために以下ポイントを狙って書き直そうと思う。

狙うポイント
  • インスタンスの生成をシーケンスから(簡易な形で)分離する
  • 足がどうのという低次処理と歩くという高次処理をメインに一度に考えさせないようにする
public class Neko {
    public Leg ForepawLeft { get; private set; }
    public Leg ForepawRight{ get; private set; }
    public Leg BackPawLeft { get; private set; }
    public Leg BackPawRight { get; private set; }
    public Neko() { ... }
    public void Walk(int stride) { ... }
}

public class AccommodationSpace {
    public static Call(string name) { ... }
}

と宣言し利用者側で

public class Main {
    public static void Main(string[] args) {
        Neko neko = AccommodationSpace.Call("Mike");
        neko.Walk(10);
    }
}

といった所か。ある処理単位がなんでも知っている状態ににならないように関心事を分離して隠ぺいできていればそれらしい設計だろう。

とは言っても

簡単な使い捨てスクリプトなんかは全てstaticでも構わないし、保守する必要が無ければ分離なんか必要ないのだ。

増補改訂版Java言語で学ぶデザインパターン入門

増補改訂版Java言語で学ぶデザインパターン入門

アジャイルソフトウェア開発の奥義

アジャイルソフトウェア開発の奥義