ソフトウェアエンジニアの日常の雑記

日々思ったことをまとめます

コンポジションとデリゲーション

一般のJava入門の書籍の中で、継承の仕組みはとても取り上げられるのだが、
コンポジション(集約)とデリゲーション(委譲)については、ほとんど触れられていないと思う。
個人的には継承と同じくらい重要であるコンポジションとデリゲーションの仕組みのおさらいをしておく。(初心者向け書籍にまともな記述がないので間違っていたらコメントください)

コンポジションというのは、外部クラスのインスタンスを自クラス内で宣言し機能を使おうというものである。
デリゲーションは、上記のコンポジションで宣言されたインスタンスで使えるメソッドを使うことである。
下記の例だと、実際の処理を行うComputerクラスとHumanクラスがあって、それを操作するmainメソッドを持ったOperatorクラスがいる。

Operatorクラスは、Humanクラスのメソッドを使い仕事をさせようとするが、Humanクラスはその中で、Computerクラスのインスタンスを立ち上げ、そのインスタンスを使いComputerクラスのメソッドを使い仕事をさせる。
この他クラスのインスタンスを自クラス内で作ることをコンポジション(集約)といい、そのインスタンスのメソッドで仕事をさせることをデリゲーション(委譲)というらしい。

詳細は理解を深めてから書くが、初心者本は、継承よりこちらの仕組みやパターンを載せるべきだと思う。継承の方が、extendsなどの用語があるから説明しやすいのだと思うが、実際の現場では、継承より委譲に方が多用される。
また、師と仰ぐべき知人の言葉を借りるが、継承を意識した設計をしていないクラスは継承すべきではない(すべてfinalで宣言した方がいい)という言葉が身に染みる。

final class Computer {
    void executor(){
        System.out.println("コンピュータです");  
        System.out.println("コンピュータが処理しています");
    }
}

final class Human {
    void executor(){
        System.out.println("人間です");
        System.out.println("コンピュータに処理させます");
        Computer comp = new Computer();    //コンポジション
        comp.executor();                   //デリゲーション
        
    }
}

final class Operator {
    final static void main(String[] args){
        Human hum = new Human();
        hum.executor();
    }
}