2016-04-22 70 views
0

這裏的情景:SOLID原則,同時創建對象

用戶可以創建使用形式的形狀。

用戶將從形狀(圓形,正方形,矩形等)的選項列表中選擇,並通過點擊創建按鈕形狀提交表單。

他創建的形狀將鏈接到他的帳戶。

這裏是我如何接近它:

的接口Shape與方法簽名create()的形狀,這將是個人形類實現。

# Shape.php 
interface Shape { 
    public function create(); 
    public function area(); 
} 

# Rectangle.php 
class Rectangle implements Shape { 
    private $user; 
    private $data; # user submitted data 

    public __construct($user, $data) { 
     $this->user = $user; 
     $this->data = $data; 
    } 

    public function create() { 

     # get rectangle shape details from RectangleShapeAPI 

     $userShape = new UserShape; # the model to store data 
     $userShape->shape_id = $this->data['shape_id']; 
     $userShape->area = $this->area(); 
     $userShape->users_id = $user->id; 

     # save rectangle shape details from API 

     if (!$userShape->save()) { 
      return false; 
     } 
     return true; 
    } 

    public function area() { 
     return $this->data['length'] * $this->data['breadth']; 
    } 
} 

現在,我已經到過switch($shapeType)由用戶選擇以適當地實例化SquareCircleRectangle類的形狀類型。

$data = $_POST; 
switch($shapeType) { 
    case 'square': 
     Shape $shape = new Square($user, $data); 
     $shape->create(); 
    break; 

    and so on... 

} 

這是我在執行SOLID Principles第一步,我 想我可能得到它錯了。在這種情況下請原諒我。

問題是我認爲switch語句(我見過的例子 人們試圖消除switchconditions當他們嘗試 使用這些對象)。我只在使用 物體時纔看到這一點,我認爲這很容易實現。但是,我們可以實現在對象創建的時間(我無法找到此之外的任何 合理的解決方案比switch荷蘭國際集團在形狀)相同 。

其他的事情是,如何有效地處理$_POST數據,因爲將來數組的鍵可能會改變,並且可能發生任何事情。 你會如何處理這種情況?


以上的說明我的情況的簡化版本。

我有一個Accounts接口與add()方法是由FacebookAccount,GoogleAccountGoogleAccount和其他類實現。

現在方法add()這些帳戶是不同的,因此,作爲接口。 FacebookGoogle API對象被創建並且用戶數據被提取以存儲到UserAccount中。帳戶鏈接到用戶。


我歡迎所有希望通過SOLID原則解決此問題的人。我會非常感謝所有人,並希望我能瞭解很多關於原理和我做錯的事情。

謝謝。


編輯

鏈接SOLID原則:SOLID Principles Wikipedia

+0

您能否請包含一個指向上面的SOLID Princpiples的鏈接?在你的情況下,我會實現一個抽象的Shape類,並做這些東西,這是所有Shapes的commen,以避免冗餘。 – noreabu

+0

我已經包含鏈接。我也可以,但'create()'方法必須調用一些外部API來獲取一些數據並存儲'UserShape'對象。 'create()'的功能在形狀上有所不同。或者在我的情況下,賬戶之間的功能不同。 –

回答

0

終於想出了這兩個問題的解決方案。

開關問題

創建一個工廠類,將返回所需的對象。這將隱藏從場景中檢索對象的條件複雜性。

$_POST數據問題

這實際上是很容易的,是將數據傳遞給create方法,而不是傳遞給構造常識。將數據傳遞給create方法可解決此問題,因爲該方法僅處理創建新對象,而類的其他部分現在獨立於此更改。