2014-03-04 72 views
2

我們在今天的工作中花了一段時間爭論這個話題,我想我需要聽聽其他一些看法。單一責任/分離擔憂PHP

開始我們的討論點被設計爲了類的某種 - 即

class order { 

    private $productList; 

    public function __construct() 

     //some kind of constructor 
    } 

    public function getProductList() 
    { 
     return $this->productList; 
    } 

} 

所以訂單對象持有一個抽象的產品清單(產品基本上是一個集合)上,我們可以執行某些操作/質譜操作(即獲得所有產品的總量,獲得總稅額等)。到目前爲止,我們都同意這種設計。但是,當它來到真正建立這個順序列表,我們 - 讓我們說 - 不同意:)

我就已經開始這樣的:

class productList { 
    /** @var array */ 
    private $productList; 

    public function add(Product $product) 
    { 
     $this>-productList[] = $product; 
    } 
} 

也有使用工廠另一個想法:

class ProductListFactory { 
    private $productRepository; 

    public function __construct(ProductRepository $productRepository) 
    { 
     $this->productRepository = $productRepository; 
    } 

    public function createFromOrderNumber($orderNumber) 
    { 
     $products = $this->productRepository->getAllProdctsForOrder($orderNumber); 

     return new ProductList($products); 
    } 
} 

class ProductList { 
    /** @var array */ 
    private $products; 

    public function __construct(array $products) 
    { 
     $this->products = $products; 
    } 
} 

我可以看到在這裏使用工廠的「魅力」,而不允許從「外部」向列表添加新產品。但不知何故,這對我來說並不合適。也許任何人都可以在這點上啓發我:)謝謝!

+2

沒有辦法以任何方式回答這個問題,不會歸結爲「意見」。人們可以去元,也會爭辯說,爲一個「笨蛋」類項目構建一個完整的對象也是矯枉過正的,這使得整個問題都沒有實際意義。 –

+2

取決於項目是否是長期的。如果它將是長期的,我會選擇工廠,因爲它可以讓你改變事情而不必改變太多。假設你想要構建一些與衆不同的東西。像馬克B說這是一個意見。 –

回答

0

什麼可以推動您的選擇是一種設計或另一種設計的方式將允許您輕鬆測試您的代碼。 ProductListFactory可以通過productRepository模擬注入,因此它是測試的好點。

PS:我希望你沒有代碼,你添加的功能就是這樣,否則你肯定會感到失望;)

$這個> -productList [] = $產品;

+0

有人可能會爭辯說,另一種方法也適用於測試。這一切只取決於你對該方法的貢獻。 – ethan

+0

:)這是沒有生產代碼,甚至複製粘貼代碼 - 我只是想用一些簡單的例子來解決這個問題。你對測試是正確的 - 但我不會測試工廠 - 我會用一系列模擬產品實例化產品列表... – marty

1

我認爲工廠的方法可能會更好,在你的情況下,因爲你正在與一個團隊合作。如果只是你,只要你的代碼是合理的,那麼以對你最有意義的方式編寫它是有意義的。然而,在與一個團隊合作時,你正在與不同的思想人士合作,他們每個人都有不同的想法,應該怎樣做。試圖版本化,重新分析和擴展在這種情況下編寫的代碼,但沒有定義方法的代碼會導致各種頭髮拉動的情況。當然,你可以爲你所建議的方法定義一個方法論,但工廠方法是一個被證明的方法,這將迫使人們編寫符合某些期望的代碼。它本質上是有序的,並且具有內在的可擴展性。如果我是你,我會在這種情況下服從我的隊友。

+0

我認爲你是對的。也許就是這麼簡單。 – marty