はじめに
委譲についてまとめる
委譲とは
再利用したい機能を持つオブジェクトを、現在のクラスのプロパティとして取り込む。
継承はis-a
の関係であるが、委譲はhas-a
の関係であると言える。
参考コード1
file
プロパティにSqlFileObject
オブジェクトを保持(has)し、必要に応じてそこから既成のメソッドを利用する。
delegate_basic.php
class fileLogger {
private DateTime $current;
private SqlFileObject $file;
public function __construct(string $logname) {
$this->current = new DateTime();
$this->file = new SqlFileObject("{$logname}-{$this->current->format('Ymd')}.log", 'a');
}
public function fwrite(string $str) {
$this->file->fwrite("[{$this->current->format('Y/m/d')}]{$str}¥n");
}
$logger = new fileLogger('log');
$logger->fwrite('HogeHoge Text');
}
委譲の良いところ
クラス同士の関係が緩まるところ。利用しているのがプロパティのため、委譲先の内部的な実装に左右される心配がない。
また、クラス同士の関係が固定されない。委譲先を変更するのも自由だし、複数のクラスに処理を委ねることも、インスタンス単位に委譲先を切り替えることすら可能。
継承を想定して設計されたクラスでないならば、まずは継承よりも委譲を利用すべき。