2010-09-15 82 views
2

如果我有一個用戶,並且我希望該用戶註冊,最好是使用註冊方法接受用戶的註冊類,還是僅僅具有用戶對象具有註冊方法什麼是更好的oo設計方案,爲什麼?

public class Registration 
{ 
    public void Register(User user) 
    { 

    } 
} 

public class User 
{ 
    public void Register() 
    { 

    } 
} 

這樣做比其他方式有什麼優勢?

回答

6

我想看看它的方式就是用現實生活中的物體來思考。 「註冊」是一個對象,一個真正的「事物」?可能不會。

在這種情況下,您所擁有的真實'東西'是用戶,以及他們註冊的東西(例如,假設您正在討論網站)。

所以 - 我可能會創建一個對象,代表用戶正在註冊的東西 - 例如,「Site」,並在其上添加一個Register方法。

+0

因此,如果用戶在客戶端應用程序上註冊,我可能會有一個名爲Client的類,並使用Register方法?我對你有正確的理解嗎? – Xaisoft 2010-09-15 21:57:35

+0

本質上,是的 - 儘管'客戶'這個詞可能最終導致混淆,但最好稱之爲'ClientApplication'。 – 2010-09-15 22:10:33

2

我寧願先,作爲第二使一個緊密耦合的假設User知道註冊,那Register()並不意味着不同的東西沿着繼承道路。

+0

我同意你的意見。出於某種原因,第一種方式似乎更好地流動,第二種方式似乎將我的註冊方法和用戶對象綁定在一起。 – Xaisoft 2010-09-15 21:44:34

2

這個問題太模糊了回答。我不知道在這種情況下「註冊」是什麼意思,但有可能您可以註冊更多的用戶嗎?

難道是聰明的事:

public interface IRegisterable 
{ 
    // ... something makes me registerable.... 
} 

public class User : IRegisterable 
{ 
} 

public class Register 
{ 
    public void Register(IRegisterable item) { } 
} 

我不知道,因爲你還沒有告訴我們足夠的來回答這個問題。例如有多個註冊嗎?用戶是否註冊了某些內容,並且可能稍後註冊其他內容?

+0

在這種情況下,通過註冊我的意思是註冊一個用戶到一個網站,例如。所以我會得到那裏的數據並將它們保存到數據庫中。 – Xaisoft 2010-09-15 21:42:51

1

我認爲更好的面向對象的設計將是

public class UserRegistry { 
    public void Register(User user) {...} 
} 

或 公共類MyApplicationClient { 公共無效註冊(用戶用戶){...}}

更妙的可能是(可能是一個矯枉過正,並且根本不適用於你的情況):

public class UserRegistrar { 
    public void Register(User user, IUserRegistry userRegistry) {...} 
} 

public class MyApplicationClient : IUserRegistry {} 

public IUserRegistry { 
    // Add, Remove, IsRegistered 
} 

你的第一個選擇可能是transl以英文吃飯: 「可註冊用戶的註冊」。但註冊(記錄)是註冊(過程)的產物。

第二個選項要求用戶知道要註冊的上下文,你不會說「嗨,用戶 - 去註冊你自己的部門」。你說「嗨部門,這裏是用戶 - 註冊他。」

所以方法Register()應該對用戶起作用,用戶正在註冊,它不應該包含註冊方式的細節(簡單測試:根據用戶註冊的上下文,註冊可以不同),因此用戶對於註冊細節應該是不可知的)。

0

使用戶能夠註冊,意味着用戶類必須有權訪問某種形式的註冊系統。因此它緊緊地綁定在某種形式的註冊系統上。如果您想爲使用不同系統註冊的管理員重新使用User類,該怎麼辦?

現在我可能不會使用下面的內容,但它只是一個關於如何認證或授權不是用戶責任的快速大腦放屁。這是系統的責任,也是系統內的一個子系統。

class User : IMember {} 
class Group : IMember {} 

class Resource : IResource {} 

// Assumes the User is already Authenticated in some way... 
class Authorisation 
{ 
    static bool IsAuthorised(IMember member, IResource resource) {} 
    static bool IsDenied(IMember member, IResource resource) {} 
    static bool IsAnyDenied(IEnumerable<IMember> members, IResource resource) {} 
    static bool IsAnyAuthorised(IEnumerable<IMember> members, IResource resource) {} 
} 

class System 
{ 
    bool CanEnterAdminArea(User user, IResource admin) 
    { 
     IEnumerable<Group> groups = u.Groups; 

     if (Authorisation.IsAnyDenied(groups, admin) { return false; } 
     if (Authorisation.IsDenied(user, admin) { return false; } 

     return (Authorisation.IsAuthorised(user, admin) 
      || Authorisation.IsAnyAuthorised(groups, admin)); 


    } 

} 
相關問題