Pergunta

Tentando evitar a armadilha SomethingManager aqui ...

Vamos dizer que eu estou indo para escrever um editor de usuários que permitirá que os administradores para criar usuários no sistema. funcionalidade bastante básico - ver uma lista de usuários existentes, criar um novo usuário, atualizar um usuário existente, excluir um usuário

.

Vamos também dizer que eu decidir escrever uma classe "business" para lidar com essas operações básicas CRUD. Este é provavelmente o que a interface seria parecido com:

public interface ISomeUsefulName
{
    IList<User> FetchUsers();
    User FetchUser(int userId);
    bool SaveUser(User user);
    bool DeleteUser(int userId);
}

Dentro do método saveUser (), por exemplo, gostaria de validar os dados (usando uma classe diferente) e, em seguida, na verdade, salvar os dados em banco de dados (novamente usando outra classe).

A minha pergunta é, o que devo nomear esta classe? É essa classe fazendo muito e, portanto, eu deveria dividi-lo em várias classes?

Foi útil?

Solução

Naming é difícil, se não for respeitada SRP :) Mas os membros nomear muitas vezes é mal utilizado.

No seu caso eu vou fazer algo como isto:

  • a responsabilidade de implementação é para cobrir contrato especificado de persistência
  • "quem" está sob fogo

pensa sem voz - persistência é feito para o usuário e um nome relevante pode ser IUserRepository - métodos não são mais do que para CRUD - devido ao fato de que o IUserRepository é para o usuário, não é necessário ter UserSave, UserUpdate porque freia a forma de uso genérico

A mágica está aqui ... apenas fazer isso:

public interface IRepository<TYPE, KEY>{
  IList<TYPE> GetAll(KEY key);
  TYPE GetById(KEY key);
  void Save(TYPE obj);
  void Update(TYPE obj);
  void Delete(Key key);
}

É difícil? O que fazer com um personalizado?

public interface IUserRepository : IRepository<User, int>
{
   IList<User> GetAllMyFavorites(ICriteria crit);
   IList<Events> GetHistoryByUser(User user);   
}

No código usando um contêiner IoC você pode fazer facilmente

public UserController {
  private _userRepository = null;
  private _eventsRepository = null;

  public UserController(IUserRepository userRepository, 
  IRepository<Events,int> eventsRepository) 
  // if you are doing here just CRUD use the generic signature
  {
    _userRepository = userRepository;
    _eventsRepository = eventsRepository;
  }

  public MarkItAsGoldPartener(int userId){
     var user = userRepository.GetById(userId);
     user.PartnerType = PartnerTypes.Gold;
     userRepository.Save(user); // the user in member name is useless
     eventsRepository.Save(new Event(){Message = "The user" + UserId + "is golden" });
  }
} 

boa sorte:)

Outras dicas

Estou destacamento chamado de ChrisW apenas o nome "Usuário".

Toda vez que você encontrar-se colocar a mesma seqüência em nome de quase todos os método, ele deve ser removido dos nomes de métodos e colocar no nome da classe.

IUserRepository -. Como no Repository padrão

A minha preferência seria IUserStorage ou IUserStore

IUserRepository ou IUserServices.

O fato de que você está tendo problemas para nomear esta deve ser uma bandeira vermelha gigante que é errado.

Responsabilidade único princípio (e interface de segregação Princípio) se aplica aqui. Dividi-lo em várias operações que você precisa.

public interface IUserList
{
    IList<User> FetchUsers();
}

public interface IUser
{
   User FetchUser(int userId);
}

public interface IUserStore
{
    bool SaveUser(User user);
    bool DeleteUser(int userId);
}

e, em seguida, torna-se muito mais simples para nomeá-los, porque agora apenas um nome realmente se aplica. Confie em mim, se você é um designer seus devs vai amar você para fazer coisas simples de entender e usar.

Ele poderia se tornar uma interface genérica.

ICrud<T> { }

Ou inspirado por IUserStore.

IStore<T> { }

Por que não apenas CRUD usuário? CRUD tem, ao contrário de 'gerir' há 10 significados.

Como cerca de chamá-lo "Users" (ou "AuthorizedUsers" ou "CollectionOfUsers")?

Eu iria com UserActions. Este descreve o conjunto de funcionalidades que você quer fazer; evita a armadilha de chamá-lo uma coleção (uma vez que na verdade não nada coleta, simplesmente recupera uma coleção).

Mas eu também repensar tendo esta classe desta forma, em primeiro lugar. Parece que você está tentando colocar no lugar é um gerenciador de persistência; existem outros tipos de objetos que você está indo querer persistir desta maneira? você pode extrair qualquer funcionalidade comum que pode então ser derivada para uma classe base? Talvez uma classe "PersistenceManager" ou algo assim? Então, se é absolutamente necessário (e eu não estou certo de que seria), você poderia derivar uma "UserPersistenceManager" que operaria em objetos Usuário sozinho. (Eu acredito que ele pode não ser necessário porque você pode ser capaz de realizar tudo que você precisa apenas do PersistenceManager; só a sua implementação específica pode dizer-lhe que, no entanto.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top