struct{} func (d Dog) Speak() { fmt.Println("I am a dog.") } // Robot構造体 type Robot struct{} func (r Robot) Speak() { fmt.Println("I am a robot.") } func introduce(s Speaker) { s.Speak() } func main() { // Dog, Robot はSpeakerインターフェイスを満たす d := Dog{} r := Robot{} // 振る舞いを切り替えられる introduce(d) // I am a dog. introduce(r) // I am a robot. } 36 インターフェイスの利点 == 振る舞いを切り替えられる
} // Dog クラス class Dog implements Speaker { public function speak(): void { echo 'I am a dog.' . PHP_EOL; } } // Robot クラス class Robot implements Speaker { public function speak(): void { echo 'I am a robot.' . PHP_EOL; } } function introduce(Speaker $speaker): void { $speaker->speak(); } // メイン処理 $dog = new Dog(); $robot = new Robot(); introduce($dog); // I am a dog. introduce($robot); // I am a robot. 37 PHPだとこう
function methodTwo(): void; } // methodOneのみを持つ //(TwoMethodsインターフェイスを実装しない, できない) class PartialOne { public function methodOne(): void {} } // methodOneとmethodTwoを持つ //(TwoMethodsインターフェイスを実装) class PartialTwo implements TwoMethods { public function methodOne(): void {} public function methodTwo(): void {} } // 3つのメソッドを持つが、TwoMethodsの2つを実装している class ExtraMethods implements TwoMethods { public function methodOne(): void {} public function methodTwo(): void {} public function methodThree(): void {} } // TwoMethodsインターフェイスを受け取る関数 function useTwoMethods(TwoMethods $t): void { $t->methodOne(); $t->methodTwo(); } // メイン処理 function main(): void { $partialOne = new PartialOne(); $partialTwo = new PartialTwo(); $extraMethods = new ExtraMethods(); // PartialOneはTwoMethodsを実装していな いのでエラー // useTwoMethods($partialOne); useTwoMethods($partialTwo); // OK useTwoMethods($extraMethods); // OK } main(); 51 PHPだとこう
void; } // methodOneとmethodTwoを実装 //(TwoMethodsインターフェイスを実装) class PartialOne implements TwoMethods { public function methodOne(): void {} public function methodTwo(): void {} } 53 TwoMethodsインターフェイスを実装するには 手間はかかるが明示的
public function __construct( private UserRepositoryInterface $userRepository ) {} public function handle(int $userId): User { // ユーザーをIDで取得 return $this->userRepository->getUserByID($userId); } } 61 UseCase/UserUseCase.php
// 3. class RegisterUserUseCase { public function __construct( private UserRepositoryInterface $userRepository ){} public function handle(): void { $user = new User(1, 'taro'); $this->userRepository->save($user); } } // 2. interface UserRepositoryInterface { public function getUserByID(int $id): ?User; public function save(User $user): void; } // 1. class UserRepository implements UserRepositoryInterface { public function getUserByID(int $userId): User { return new User($userId, 'taro'); // 仮の実装 } public function save(User $user): void { // ここでユーザーを保存するロジックを実装 // 例えば、データベースにユーザー情報を保存するなど echo 'User saved: ' . $user->name; } }
// 3. class RegisterUserUseCase { public function __construct( private UserRepositoryInterface $userRepository ){} public function handle(): void { $user = new User(1, 'taro'); $this->userRepository->save($user); } } // 2. interface UserRepositoryInterface { public function getUserByID(int $id): ?User; public function save(User $user): void; } // 1. class UserRepository implements UserRepositoryInterface { public function getUserByID(int $userId): User { return new User($userId, 'taro'); // 仮の実装 } public function save(User $user): void { // ここでユーザーを保存するロジックを実装 // 例えば、データベースにユーザー情報を保存するなど echo 'User saved: ' . $user->name; } } そもそも最初から抽象化されてそう (インターフェイスにある程度メソッドがありそう)