為什么用 Contracts

2018-02-24 15:51 更新

你可能有很多關于 contracts 的問題。如為什么要使用接口?使用接口會不會變的更復雜?

讓我們用下面的標題來解釋為什么要使用接口:低耦合和簡單性。
低耦合

首先,看一些強耦合的緩存實現代碼。如下:

<?php namespace App\Orders;

class Repository {

    /**
     * The cache.
     */
    protected $cache;

    /**
     * Create a new repository instance.
     *
     * @param  \SomePackage\Cache\Memcached  $cache
     * @return void
     */
    public function __construct(\SomePackage\Cache\Memcached $cache)
    {
        $this->cache = $cache;
    }

    /**
     * Retrieve an Order by ID.
     *
     * @param  int  $id
     * @return Order
     */
    public function find($id)
    {
        if ($this->cache->has($id))
        {
            //
        }
    }

}

在上面的類里,代碼跟緩存實現之間是強耦合。理由是它會依賴于擴展包庫( package vendor )的特定緩存類。一旦這個擴展包的 API 更改了,我們的代碼也要跟著改變。

同樣的,如果想要將底層的緩存技術(比如 Memcached )抽換成另一種(像 Redis ),又一次的我們必須修改這個 repository 類。我們的 repository 不應該知道這么多關于誰提供了數據,或是如何提供等等細節(jié)。

比起上面的做法,我們可以改用一個簡單、和擴展包無關的接口來改進代碼:

<?php namespace App\Orders;

use Illuminate\Contracts\Cache\Repository as Cache;

class Repository {

    /**
     * Create a new repository instance.
     *
     * @param  Cache  $cache
     * @return void
     */
    public function __construct(Cache $cache)
    {
        $this->cache = $cache;
    }

}

現在上面的代碼沒有跟任何擴展包耦合,甚至是 Laravel。既然 contracts 擴展包沒有包含實現和任何依賴,你可以很簡單的對任何 contract 進行實現,你可以很簡單的寫一個替換的實現,甚至是替換 contracts,讓你可以替換緩存實現而不用修改任何用到緩存的代碼。
簡單性

當所有的 Laravel 服務都簡潔的使用簡單的接口定義,就能夠很簡單的決定一個服務需要提供的功能。** 可以將 contracts 視為說明框架特色的簡潔文檔。

除此之外,當你依賴簡潔的接口,你的代碼能夠很簡單的被了解和維護。比起搜索一個大型復雜的類里有哪些可用的方法,你有一個簡單,干凈的接口可以參考。

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號