2015-05-22 70 views
0

在下面的代碼中,我有一個叫做Dog的類。狗可以做很多事情,如樹皮或坐。狗也有特徵,如品種,性別或顏色。PHP OOP設計 - 從功能中分離'特性'

如果你有一隻擁有許多特徵和許多功能的狗,那麼這個代碼在將來可能會變得混亂,那麼OOP適當的方法來區分這些東西,比如狗的特徵和功能呢?

難道只是創建其他類,如class DogCharacteristicsclass DogFunctions並有一個父類叫Dog

我已閱讀http://www.ibm.com/developerworks/library/os-php-7oohabits/所以它讓我思考如何實現良好的面向對象的習慣。

class Dog 
{ 
    private $breed; 

    public function getBreed() 
    { 
     return $this->breed; 
    } 

    public function setBreed($breed) 
    { 
     $this->breed = $breed; 
    } 


    public function getDogInfo() 
    { 
     return "This dog is " . $this->getBreed(); 
    } 

    public function bark() 
    { 
     return "The dog barks!"; 
    } 

    public function sit() 
    { 
     return "The dog sits."; 
    } 
} 

如何改善上面的代碼,以便它堅持良好的生活習慣OOP和分離出狗的功能VS特點呢?

回答

0

有幾種方法,但我們現在經常看到的一種方法是特質。使用特徵,你可以將你的代碼分成不同的文件,同時保持整個想法。問題在於如果您使用IDE,則您的方法的特徵文件將隨錯誤閃爍,因爲它不知道從哪裏獲取特性。

class Dog 
{ 
    use DogCharacteristics; 
    use DogMethods; 
} 

trait DogCharacteristics 
{ 
    var $breed; 
    var $color; 
} 

trait DogMethods 
{ 
    public function walk(){} 
    public function bark(){} 
} 

它遠非最好的方法,但它是今天在框架中使用很多的方法。這令我

的一件事是:

  • 該代碼可以在未來獲得混亂,如果你有一隻狗有許多特點和許多功能

這是一個不錯的辦法。過度優化代碼通常不是一個好方法。你應該專注於用單元測試寫出清晰,文檔化的代碼,這將允許你稍後重構,而不是一開始就思考如何做到最好。

+0

另一件我忘了提到,因爲你談論PHP7。 PHP7應該具有屬性存取器功能,通過將「getXYZ」和「setXYZ」功能簡化爲簡化版本,將大大簡化實體代碼。所以,不要太擔心,這是正常的,並不意味着如果你的實體中有太多屬性,那麼你就會嚴重編碼。 –

+0

另一件事,記住不要因爲狗是動物而陷入Liskov Susbstitution陷阱我將把一些代碼移到一個子類中。這通常是不好的做法,最終會促進糟糕的編碼習慣和圍繞你的應用程序的混亂。 –