如果我有一个用户并且我希望该用户注册,那么使用一个接受用户的Register方法的注册类是否更好,或者它是否足以让一个具有Register方法的User对象
public class Registration
{
public void Register(User user)
{
}
}
public class User
{
public void Register()
{
}
}
以另一种方式做到这一点有什么好处?
答案 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 ));
}
}