Попрощайтесь с if/else в рабочем коде.
1. Я хочу выпить колы, поэтому я
(new Myself)->getCola();
На самом деле: я иду туда один
2. Но иногда я хочу, чтобы другой меня доставал, поэтому я
(new Big)->getCola(); (new Gong)->getCola();
На самом деле: я спрашиваю их напрямую
3. Я постоянно повторяюсь, делая это, поэтому я делаю
bind('friend', random(new Big, new Gong)); // then make('friend')->getCola();
На самом деле: я кричу: «Кто-нибудь может принести мне колу, пожалуйста?» и один из них ответит
Это МОК.
4. Выглядит лучше, но я также просто хочу как-нибудь выпить пива, тогда я позабочусь о том, чтобы они могли его купить, поэтому я так и делаю.
interface Friend { public function giveMoneyForBeer(int $money): self } // then class Big implements Friend {...} class Gong implements Friend {...}
Теперь я, когда хочу пива, так и делаю
make('friend')->giveMoneyForBeer(100)->getBeer();
На самом деле: я иду к кому-то, даю ему 100 и прошу пива.
5. Почти готово, я обернул эти сложности в Фасад, так что я просто делаю
Friend::getBeer(100);
Преимущества
Теперь я могу настроить своих друзей в зависимости от ситуации, настроив список
У нас вечеринка (на производстве)
bind('friend', random(new Big, new Gong, new Art, new Boss));
или я просто хочу, чтобы это было отдельно (тестирование на моем локальном компьютере)
bind('friend', new Myself);
Не касаясь производственного кода.