Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么是更好的oo设计方案?为什么?_C#_Oop - Fatal编程技术网

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

C# 什么是更好的oo设计方案?为什么?,c#,oop,C#,Oop,如果我有一个用户,并且我希望该用户注册,那么最好是拥有一个注册类和一个接受用户的注册方法,还是拥有一个拥有注册方法的用户对象就足够了 public class Registration { public void Register(User user) { } } public class User { public void Register() { } } 一种方法比另一种方法有什么好处?我更喜欢第一种方法,因为第二种方法是紧密耦合的假

如果我有一个用户,并且我希望该用户注册,那么最好是拥有一个注册类和一个接受用户的注册方法,还是拥有一个拥有注册方法的用户对象就足够了

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

    }
}

public class User
{
    public void Register()
    {

    }
}

一种方法比另一种方法有什么好处?

我更喜欢第一种方法,因为第二种方法是紧密耦合的假设,即
用户知道注册什么,并且
注册()
在继承过程中不会有不同的含义。

这个问题太模糊,无法回答。我不知道“注册”在这个上下文中是什么意思,但您是否可能注册的不仅仅是一个用户

这样做是否明智:

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

public class User : IRegisterable
{
}

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

我不知道,因为你没有告诉我们足够的答案。例如,是否有多个注册?用户是否正在注册某些东西,以后可能会注册其他东西?

我的看法是从现实生活中的对象来考虑。“注册”是一个对象,一个真实的“东西”吗?可能不会

在这个场景中,你真正拥有的“东西”是用户,以及他们注册的东西(例如,我假设你谈论的是一个网站)


因此,我可能会创建一个表示用户正在注册的对象,例如“Site”,并在其上添加一个Register方法。

我认为更好的oo设计应该是

public class UserRegistry {
    public void Register(User user) {...}
}
或 公共类MyApplicationClient{ 公共无效寄存器(用户){…} }

甚至更好的可能是(可能是过火了,对您的案例根本不起作用):

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

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


所以方法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 ));


    } 

}
class用户:IMember{}
类组:IMember{}
类资源:IResource{}
//假设用户已通过某种方式的身份验证。。。
类别授权
{
静态布尔已授权(IMember成员,IResource资源){}
静态bool已指定(IMember成员,IResource资源){}
静态bool IsAnyDenied(IEnumerable成员,IResource资源){}
静态bool isanyauthorized(IEnumerable成员,IResource资源){}
}
阶级制度
{
bool CanEnterAdminArea(用户用户,IResource管理员)
{
IEnumerable groups=u.groups;
if(authorization.IsAnyDenied(groups,admin){返回false;}
if(authorization.IsDenied(user,admin){返回false;}
返回(授权。已授权(用户、管理员)
||授权。获得授权(集团、管理);
} 
}

在这种情况下,注册意味着将用户注册到一个网站上。因此,我会获取这些数据并将其保存到数据库中。我同意你的看法。出于某种原因,第一种方法似乎流程更好,第二种方法似乎将我的注册方法和用户对象绑定在一起。因此,如果用户在客户端应用程序上注册,我可能会有一个名为Client的类使用Register方法吗?我理解正确了吗?基本上,是的-虽然“Client”一词可能会导致混淆,但最好称它为“ClientApplication”。
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 ));


    } 

}