Get data from database } } class User { /** @var Database */ protected $db; public function __construct(Database $db) { $this->db = $db; } public function getByName(string $name) { return $this->db->getByName($name); } } %BUBCBTF 6TFS HFU#Z/BNF
Get data from database } } class User { /** @var Database */ protected $db; public function __construct(Database $db) { $this->db = $db; } public function getByName(string $name) { return $this->db->getByName($name); } } • Userクラスが欲しい のはデータ • データの取得元はど こでもいい • にも関わらずコード ではDatabaseクラス に依存している
Get data from database } } class User { /** @var Database */ protected $db; public function __construct(Database $db) { $this->db = $db; } public function getByName(string $name) { return $this->db->getByName($name); } } • Userクラスが欲しい のはデータ • データの取得元はど こでもいい • にも関わらずコード ではDatabaseクラス に依存している 6TFSΫϥε͕ຊʹඞཁͳͷ ʮHFU#Z/BNFΛ௨ͯ͡σʔλΛฦ͢ʯԿ͔
Database implements Repository { public function getByName(string $name) { // Get data from database } } • 「getByNameを通し てデータを得られる 何か」をInterfaceで 表現する • 各クラスはそれに従 い実装する
read(int $count); public function readLine(int $lineNum); public function close(); } Example - 完全なInterface readLine関数で⼀⾏ずつ読むのは簡単! ҰํͰ࣮ͱςετͷՃɺ ͦΕͷอकίετ͕ൃੜ͢Δ
setHeight(int $height); public function setName(string $name); public function setBrightness(int $level); public function setPixel(int $pixel); public function setEffect(string $effect); public function setExtension(string $ext); } Example - 複雑なInterface
setHeight(int $height); public function setName(string $name); public function setBrightness(int $level); public function setPixel(int $pixel); public function setEffect(string $effect); public function setExtension(string $ext); } Example - 複雑なInterface 画像に対して細やかな調整が可能!
setHeight(int $height); public function setName(string $name); public function setBrightness(int $level); public function setPixel(int $pixel); public function setEffect(string $effect); public function setExtension(string $ext); } Example - 複雑なInterface 画像に対して細やかな調整が可能! ҰํͰΠϯλʔϑΣʔεΛ ཧղ͢Δͷ͕͍͠
isRole(string $role): bool; public function isAdmin(): bool; public function isSysAdmin(): bool; public function isGeneral(): bool; } Person Interface 予測できる未来として「役割の種類が増える」ことが 考えられる
isRole(string $role): bool; public function isAdmin(): bool; public function isSysAdmin(): bool; public function isGeneral(): bool; } Person Interface 仮に役割が増えるとすると、 Interfaceの完全さを保とうとすればするほど メソッドは増え、保守性は下がる