From Apprentice To Artisan 02

#更进一步

使用另一个例子来巩固理解。或许我们想去通知客户缴费了,我们定义两个Interfaces (接口)、或者是Contracts (协议、约定,就是卖身契啦),这些约定在往后改变他们的实现更加灵活

//开账单者
interface BillerInterface {
    public function bill(array $user, $amount);
}

//账单通知者
interface BillingNotifierInterface {
    public function notify(array $user, $amount);
}

#下一个实现 BillerInterface 接口

// 条纹开账单者
class StripeBiller implements BillerInterface{
    public function __construct(BillingNotifierInterface $notifier)
    {
        $this->notifier = $notifier;
    }
    public function bill(array $user, $amount)
    {
        // Bill the user via Stripe...
        $this->notifier->notify($user, $amount);
    }

    // ...
}

通过划分每个类的职责、现在就很容易注入不同的notifer(账单通知者接口)的 implementation(实现)到 billing (账单)类中。比如,我们可以注入(inject)一个 SmsNotifier 或者 EmailNotfier ,Biller (账单者)不在关注通知的实现、只需要遵守contract (协议、接口)即可。只要类坚守他的协议(接口)、biller 就能接收它。不仅仅如此,這样我们不仅仅方便开发,而且可以通过 注入(injecting)一个模拟(mock) BillingNotifierInterface 的通知者 隔离来测试 biller 。

Be The Interface 使用接口

While writing interfaces might seem to a lot of extra work, they can actually make your development more rapid. Use interfaces to mock and test the entire back-end of your application before writing a single line of implementation!

写接口可能看上去挺麻烦,但实际上能加速你的开发。你不用实现任何接口,就能使用模拟库来模拟你的接口,进而测试整个后台逻辑!

#我们如何使用 依赖注入呢

$biller = new StripeBiller(new SmsNotifier);

這是就是依赖注入。biiler (开账单者)不再关注怎么通知用户了,只需要把它交个一个通知者即可。小小的改变使你的应用焕然一新,你的代码变得更加容易维护,因为类的职责是明确指定的。并且更加容易测试,测试时,你只需要简单注入模拟依赖去隔离code 即可。


#IoC 容器呢,依赖注入不需要IoC 容器么? 当然,下面章节,容器使依赖注入更加容易管理,但它并不是必要的,只要准守本章的原则,可以在任何项目中使用依赖注入,而不管是否使用了容器


#太像java (copy 过来的)

有人会说使用接口让PHP代码看上去太像Java了——即代码太罗嗦了——你必须定义接口然后实现它,要多按好多下键盘。

对于小而简单的应用来说,以上说法也对。 接口通常是不必要的。将代码耦合到那些你认为不会改变的地方也是可以的。在你确信不会改变的地方就没有必要使用接口了。架构师说“不会改变的地方是不存在的”。不过话说回来,有时候的确不会改。


在大型应用中接口是很有帮助的。和提升的代码灵活性、可测试性比起来,多敲键盘费的功夫就微不足道了。当你迅速的切换了代码实现的时候,你的经理一定会被你的神速吓一跳的。你也可以写出更适应变化的代码。


总而言之, 记住本书提倡“简单”架构。如果你在写小程序的时候无法遵守接口原则, 别觉得不好意思。 要记住我们写代码是要快乐的写。如果你不喜欢写接口,那就先简单的写代码吧。日后再精进即可。



该文只是方便我个人理解,参照:http://my.oschina.net/zgldh/blog/305556


你可能感兴趣的:(From Apprentice To Artisan 02)