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 ));
}
}