2010-09-15 2 views
2

Если у меня есть Пользователь, и я хочу, чтобы этот пользователь регистрировался, лучше ли иметь класс регистрации с методом Register, который принимает пользователя, или он достаточно хорош, чтобы иметь объект пользователя, который имеет метод RegisterЧто такое лучший сценарий проектирования и почему?

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

    } 
} 

public class User 
{ 
    public void Register() 
    { 

    } 
} 

Каковы преимущества этого в одном направлении над другим?

ответ

6

То, как я смотрю на это, нужно думать в терминах объектов реальной жизни. Является ли «Регистрация» объектом, настоящей «вещью»? Возможно нет.

Реальные «вещи», которые у вас есть в этом сценарии, - это Пользователь и то, с чем они регистрируются (например, предположим, что вы говорите о веб-сайте).

Так что, я бы, вероятно, создал объект, который представляет собой вещь, которую пользователь регистрирует с помощью «Site», например, и добавляет к нему метод Register.

+0

Итак, если пользователь регистрировался в клиентском приложении, у меня мог бы быть класс Client с методом Register? Я вас правильно понял? – Xaisoft

+0

По существу, да, хотя слово «клиент» может привести к путанице, может быть лучше назвать его «ClientApplication». –

2

Я бы предпочел первый, как второй делает Сильносвязанная предположение, что User знает, что зарегистрировать для, и что Register() не будет означать разные вещи вниз по дороге наследования.

+0

Я согласен с тобой. По какой-то причине первый способ кажется лучше, а второй способ связывает мой метод Register и объект User вместе. – Xaisoft

2

Этот вопрос слишком расплывчато для ответа. Я не знаю, что означает «Register» в этом контексте, но возможно ли, что вы сможете зарегистрировать больше, чем просто пользователь?

Будет ли это быть умным, чтобы сделать:

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

public class User : IRegisterable 
{ 
} 

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

Я не знаю, потому что вы не сказали нам достаточно, чтобы ответить на этот вопрос. Существуют ли, например, несколько регистраций? Является ли пользователь зарегистрированным для чего-то и может зарегистрироваться для чего-то еще позже?

+0

В этом случае по регистру я имею в виду, например, Регистрация пользователя на веб-сайт. Поэтому я бы получил данные и сохранил их в базе данных. – Xaisoft

1

Я думаю, что лучше дизайн оо бы

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

или общественного класса MyApplicationClient { общественного недействительными Регистрация (пользователь Пользователь) {...}}

Даже лучше может быть (вероятно, overkill, и не работает для вашего дела вообще):

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

public class MyApplicationClient : IUserRegistry {} 

public IUserRegistry { 
    // Add, Remove, IsRegistered 
} 

Ваш первый вариант мог бы перевести ел на английском языке: «Регистрация, которая может регистрировать пользователя». Но регистрация (запись) является продуктом регистрации (процесса).

Второй вариант требует, чтобы пользователь знал контекст, в который он должен быть зарегистрирован, вы не говорите: «Эй, пройдите, зарегистрируйтесь в этом отделе». вы говорите: «Эй, отдел, вот пользователь - зарегистрируй его».

Таким образом, метод Register() действует на пользователя, пользователь регистрируется, он не должен содержать подробных сведений о том, как он зарегистрирован (простой тест: регистрация может быть различной в зависимости от того, какой пользователь контекста должен быть зарегистрирован, поэтому пользователь должны быть агностическими к деталям регистрации).

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


    } 

} 
Смежные вопросы