継承か保有か

public class Price {
    private Long price;

    public Price(Long price) {
        this.price = price;
    };

    public add(Price another) {
        return new Price(this.price + another.price);
    }
}

みたいな Price クラスがあった時に、

public class Yen {
    private Price price;
    public Yen(Price price) {
        this.price = price;
    };

    public Yen add(yen) {
        return new Yen(this.price.add(yen.price));
    };
}

//...

Yen yen = new Yen(new Price(10));
yen.add(anotherYen);

を定義するのか

public class Yen extends Price {
    // ...
}

// ...

を定義するか。

最初に考えたのは、「それぞれここがしんどいなー」だった

ここがしんどい継承

継承だと、子クラスのインスタンスを使う側は親クラスのドメインを知らないと結局どんなメッセージを打てるのかわからない。 複雑なアプリケーションならより一層、親子関係にあるすべてのクラスのドメインが果たす責務に詳しくならなければ...。

ここがしんどい保有

こっちがわりと有用なのではないかと思っていた。 親クラスのデフォルト実装を公開するのに、毎回関数を定義しなければいけないけど、そのかわり親クラスの振る舞いを一部しか知らなくて良い。

そもそも役割が違うのでは?

委譲か継承か、それが問題だ – Where is the mate to the Sock ?

やっぱりそうらしい。 ていうか社内の情報共有ツールで他の人が書いた日報のツッコミでこのブログを見つけた。弊社良いな。

いや、そもそも設計思想が違うのか??

Priceを継承したYenは、通貨単位の「円」はPriceの振る舞いを拡張したものだというドメインの理解を主張している。 一方でPriceを保有するYenは、通貨単位の「円」はPriceを自身の属性の一部だと主張している。

どっちがいいとかではなく、ドメインの理解が違うんだろうな。