如果我有一個用戶,並且我希望該用戶註冊,最好是使用註冊方法接受用戶的註冊類,還是僅僅具有用戶對象具有註冊方法什麼是更好的oo設計方案,爲什麼?
public class Registration
{
public void Register(User user)
{
}
}
public class User
{
public void Register()
{
}
}
這樣做比其他方式有什麼優勢?
如果我有一個用戶,並且我希望該用戶註冊,最好是使用註冊方法接受用戶的註冊類,還是僅僅具有用戶對象具有註冊方法什麼是更好的oo設計方案,爲什麼?
public class Registration
{
public void Register(User user)
{
}
}
public class User
{
public void Register()
{
}
}
這樣做比其他方式有什麼優勢?
我想看看它的方式就是用現實生活中的物體來思考。 「註冊」是一個對象,一個真正的「事物」?可能不會。
在這種情況下,您所擁有的真實'東西'是用戶,以及他們註冊的東西(例如,假設您正在討論網站)。
所以 - 我可能會創建一個對象,代表用戶正在註冊的東西 - 例如,「Site」,並在其上添加一個Register方法。
我寧願先,作爲第二使一個緊密耦合的假設User
知道註冊爲,那Register()
並不意味着不同的東西沿着繼承道路。
我同意你的意見。出於某種原因,第一種方式似乎更好地流動,第二種方式似乎將我的註冊方法和用戶對象綁定在一起。 – Xaisoft 2010-09-15 21:44:34
這個問題太模糊了回答。我不知道在這種情況下「註冊」是什麼意思,但有可能您可以註冊更多的用戶嗎?
難道是聰明的事:
public interface IRegisterable
{
// ... something makes me registerable....
}
public class User : IRegisterable
{
}
public class Register
{
public void Register(IRegisterable item) { }
}
我不知道,因爲你還沒有告訴我們足夠的來回答這個問題。例如有多個註冊嗎?用戶是否註冊了某些內容,並且可能稍後註冊其他內容?
在這種情況下,通過註冊我的意思是註冊一個用戶到一個網站,例如。所以我會得到那裏的數據並將它們保存到數據庫中。 – Xaisoft 2010-09-15 21:42:51
我認爲更好的面向對象的設計將是
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()應該對用戶起作用,用戶正在註冊,它不應該包含註冊方式的細節(簡單測試:根據用戶註冊的上下文,註冊可以不同),因此用戶對於註冊細節應該是不可知的)。
使用戶能夠註冊,意味着用戶類必須有權訪問某種形式的註冊系統。因此它緊緊地綁定在某種形式的註冊系統上。如果您想爲使用不同系統註冊的管理員重新使用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));
}
}
因此,如果用戶在客戶端應用程序上註冊,我可能會有一個名爲Client的類,並使用Register方法?我對你有正確的理解嗎? – Xaisoft 2010-09-15 21:57:35
本質上,是的 - 儘管'客戶'這個詞可能最終導致混淆,但最好稱之爲'ClientApplication'。 – 2010-09-15 22:10:33