2011-07-12 21 views
1

我剛開始學習OOP,我發現很難確定功能屬於哪裏。讓我們用一個down投對於本例:我們如何確定對象在OOP中的責任?

當我們投一個,下面的交易必須發生:

  1. 遞減選民的repdownVotes計數。
  2. 減少收件人的rep
  3. 減少後score

所以......

  1. 我們如何確定哪些行爲屬於哪個對象?
  2. 這種功能在哪裏?在DAO層,服務層,還是實際的對象本身?

當對象互相交互時,例如在我的示例中,它變得越來越棘手。通常很難確定哪個功能屬於什麼對象等等......

回答

4

看看OO設計的SOLID原則,聯軸器&凝聚力。

OO可用於許多地方,但不限於此。您的業​​務層。你可以編寫你的Javascript面向對象。

我會模擬您的示例SO域與此類似(在C#中)。這是理想的OO代碼,在現實世界中會做出一些妥協,例如爲我的ORM公開字段。我試圖展示 - 每個對象都負責其數據,沒有人可以直接更改它;他們必須通過調用其中一種公共方法來要求該對象做某件事。

public class User 
{ 
    private int _reputation; 
    private int _downvotes; 

    public void Downvote(Post post) 
    { 
     DecreaseReputation(); 
     IncrementDownvotes(); 
     post.Downvote(); 
    } 

    public void RegisterDownvote() 
    { 
     DecreaseReputation(); 
    } 

    private void DecreaseReputation() 
    { 
     _reputation--; 
    } 

    private void IncrementDownvotes() 
    { 
     _downvotes++; 
    } 
} 

public class Post 
{ 
    private int _score; 
    private User _poster; 

    public void Downvote() 
    { 
     DecreaseScore(); 
     _poster.RegisterDownvote(); 
    } 

    private void DecreaseScore() 
    { 
     _score--; 
    } 
} 
+0

謝謝。這種行爲屬於VoteService是否公平?我試圖瞭解你的示例代碼屬於哪裏。我不知道C#,但我可以做出一些推論。代碼是否在單獨的類文件中表示單獨的片段,或者僅在單個Vote類中的對象被實例化和更改的行爲?在我的例子中,我忽略了提到第四個動作必須是將投票寫入投票表。 – Mohamad

+0

它屬於傳統3層體系結構(表示層/業務層/數據訪問層)中的業務層,這是典型的域代碼(如DDD;順便說一句,有人說DDD是OOP做對了)。沒有持久性(寫入表格),因爲它是DAL的關注點 - 對於業務來說,如果您正在寫入sql DB,文檔數據庫,或者甚至將所有內容都放在RAM中,那麼它就是非常重要的,只要它是年2050,你可以保證沒有數據會以這種方式丟失。這只是將您的疑慮分開的良好做法。 – driushkin

1

這不是一個簡單的問題,聽起來更像是一個設計模式問題,而不是一個OOP問題本身。在SO的情況下(我根據他們網站的假設設計模式作出假設),設計模式的所有「層」都與您稱之爲「交易」有關(不是我假設的DB術語你使用它的方式)。 UI層或View接受「反對票」,並且對於處理業務規則的層做出最有可能的ajax請求,這決定了當針對用戶投下「反對票」時實際發生的事情。此時,業務層會請求數據層更新某處的數據庫以更新用戶的分數,聲譽等。使用Web服務也可能會執行一些稍微不同的操作,他們會知道SO中的內容。就OOP而言;我確信在所有層,腳本和其他語言中都有很多OOP,但我可以想象,在你的例子中,SO並沒有圍繞「User」類對象傳遞投票;沒有必要。

這裏是例如非常流行的MVC設計模式:http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

相關問題