W3Cschool
恭喜您成為首批注冊用戶
獲得88經驗值獎勵
你可能有很多關于 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 視為說明框架特色的簡潔文檔。
除此之外,當你依賴簡潔的接口,你的代碼能夠很簡單的被了解和維護。比起搜索一個大型復雜的類里有哪些可用的方法,你有一個簡單,干凈的接口可以參考。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: