什么是更好的oo设计方案,为什么?

时间:2010-09-15 21:23:25

标签: c# oop

如果我有一个用户并且我希望该用户注册,那么使用一个接受用户的Register方法的注册类是否更好,或者它是否足以让一个具有Register方法的User对象

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

    }
}

public class User
{
    public void Register()
    {

    }
}

以另一种方式做到这一点有什么好处?

5 个答案:

答案 0 :(得分:6)

我看待它的方式是根据现实生活中的对象进行思考。 “注册”是一个对象,一个真正的“东西”吗?可能不是。

在这种情况下,您拥有的真实“事物”是用户,以及他们正在注册的内容(例如,我假设您在谈论网站)。

所以 - 我可能会创建一个对象来代表用户注册的东西 - 例如,'Site',并在其上添加一个Register方法。

答案 1 :(得分:2)

我更喜欢第一个,因为第二个做出了一个紧密耦合的假设,即User知道要为注册的内容,而Register()并不意味着不同的东西继承道路。

答案 2 :(得分:2)

这个问题太过模糊,无法回答。我不知道“注册”在这种情况下意味着什么,但你是否有可能注册的不仅仅是一个用户?

这样做是否明智:

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

public class User : IRegisterable
{
}

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

我不知道,因为你没有告诉我们足够回答这个问题。例如,有多个注册可用吗?用户是否注册了某些内容,并可能稍后注册其他内容?

答案 3 :(得分:1)

我认为更好的设计将是

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

或     公共类MyApplicationClient {         public void注册(用户用户){...}     }

可能更好(可能是矫枉过正,根本不适合你的情况):

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

public class MyApplicationClient : IUserRegistry {}

public IUserRegistry {
    // Add, Remove, IsRegistered
}

您的第一个选项可以用英语翻译为: “可以注册用户的注册。”但是注册(记录)是注册(过程)的产物。

第二个选项要求用户知道要注册的上下文,你不要说“嘿,用户 - 自己去注册那个部门”。你说“嘿部门,这里是用户 - 注册他。”

所以方法Register()应该对用户起作用,用户正在注册,它不应该包含如何注册的细节(简单测试:注册可以根据用户注册的上下文而有所不同,因此用户应与注册细节无关。)

答案 4 :(得分: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 ));


    } 

}