2013-04-26 53 views
0

我最近有一段時間來重構一箇舊的個人項目,我想用它來學習如何最好地處理這種類。php - 用對象組合重構一個類

問題是我的課(項目)有兩個性別與它相關聯(將來可能更像一個項目的海報和項目的帽子/配件),每個性別使用幾乎相同的方法獲取和設置關於它們的東西(get_productImage,set_price等)。

我想重構類,以便不用每個函數的男性和女性副本,我可以讓代碼寫一次,並使用它兩次(或更多)。這是(一個非常簡單的例子)我到目前爲止:

class Item 
{ 
    public $ID, $displayDate; 
    public $male, $female; 

    public function __construct($ID) 
    { 
     //Fancy code to initialize stuff like $displayDate 
     $male = new Gender('male', $ID, $displayDate); 
     $female = new Gender('female', $ID, $displayDate); 
    } 
} 

class Gender 
{ 
    private $ID, $displayDate; 

    public function get_currentPrice() 
    { 
     //The current price of the gender changes based on the display date vs the current date and then adjusts the price accordingly and returns it. 
    } 
} 

有沒有一種方法,我可以重新寫這個更好?我的另一個問題是,顯示日期可以(也將會)改變和洗牌很多,所以對它的任何改變都需要傳播到性別課上,這也將使這一個巨大的混亂...

如果有幫助,我使用的是PHP 5.4,所以任何新增加的東西都可以在這裏使用。

+0

你不能使用繼承 – Dave 2013-04-26 12:47:10

+0

@Dave我不想繼承的原因是我真的想要封裝不同類型的項目的一個類。項目中的大部分內容都是相同的,並且會半頻繁地更改,所以我寧願在一個地方更改它,而不是在兩個擴展類中更改它。 – Klathmon 2013-04-26 12:53:59

+0

如何創建一個存儲子對象及其關係實例的容器類。所以你會有班級$ useritems,它擁有哪些$ items和哪些$ gender被選擇和關聯。或者也許你可以用一個列表來保存關係? – Dave 2013-04-26 13:02:48

回答

1

我看到兩種常用的解決方法。

一個是你在單個類上粘貼兩個性別並區分帶有某種標誌的男性/女性(例如,你打算擁有兩個以上性別的「類型」)。

另一個是使用特質。

例如,您知道$ displayDate總是以get/set方式進行處理。因此,您可以創建一個特性,比如hasDisplayDate,指定屬性(受保護的$ displayDate)以及所有必要的方法。而在性別中,您只需添加「使用hasDisplayDate」即可混合特質。您可以在需要時重載特徵中存在的方法。

+0

有趣我從來不知道PHP有特質。要爲此付出努力。 – Dave 2013-04-26 13:05:33

+0

你可以擴展在這裏如何使用特質?我讀了一些關於他們的文章,但我很難理解他們如何應用於這種情況。 – Klathmon 2013-04-26 13:08:35

+0

我已經添加了一個簡短例子的要點:[鏈接](https://gist.github.com/ozgg/5467319) – 2013-04-26 13:18:53