Frage

Der Versuch, die SomethingManager Falle hier ...

zu vermeiden

Nehmen wir an, ich werde einen Benutzer-Editor schreiben, die Administratoren ermöglicht es Benutzern im System zu erstellen. Ziemlich einfach Funktionalität -. Eine Liste der vorhandenen Benutzer anzeigen, erstellen Sie einen neuen Benutzer, aktualisieren Sie einen vorhandenen Benutzer, einen Benutzer löschen

Lassen Sie uns auch sagen, dass ich entscheiden, eine „Business“ Klasse zu schreiben, diese grundlegenden CRUD-Operationen zu behandeln. Dies ist wahrscheinlich das, was die Schnittstelle aussehen würde:

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

Im Inneren des Saveuser () Methode, zum Beispiel, würde ich die Daten validieren (eine andere Klasse verwenden) und speichern Sie die Daten tatsächlich in die Datenbank (wieder eine andere Klasse verwendet wird).

Meine Frage ist, was soll ich diese Klasse nennen? Ist diese Klasse zu viel zu tun und deshalb sollte ich es in mehrere Klassen aufgeteilt?

War es hilfreich?

Lösung

Naming ist schwierig, wenn sich SRP nicht eingehalten :) Aber die Mitglieder Namensgebung wird oft missbraucht wird.

In Ihrem Fall werde ich so etwas tun:

  • in der Verantwortung der Umsetzung angegebenen Vertrag von Persistenz zu decken
  • "die" unter Feuer

Thinks ohne Stimme  - Persistenz wird für Benutzer durchgeführt und ein entsprechender Name kann sein IUserRepository  - Methoden sind nicht mehr als für CRUD  - aufgrund der Tatsache, dass die IUserRepository für Benutzer ist, ist nicht notwendig UserSave, UserUpdate weil es bremst die allgemeine Nutzung Weise

haben

Die Magie ist hier ... gerade dies zu tun:

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

Ist es schwierig? Was mit einem benutzerdefinierten man tun?

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

Im Code ein IoC-Container können Sie ganz einfach tun können,

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

Glück:)

Andere Tipps

I ChrisW Ruf bin entsendenden nur nennen es "User".

Alle Sie sich die Zeit finden, die gleiche Zeichenfolge im Namen von fast jede Methode, so sollte sie von den Methodennamen und setzen in den Klassennamen entfernt werden.

IUserRepository -. Wie in den Repository Muster

Meine Präferenz wäre IUserStorage oder IUserStore

IUserRepository oder IUserServices.

Die Tatsache, dass Sie Probleme haben Namensgebung dies eine riesige rote Fahne sein soll, dass es falsch ist.

Single Prinzip Verantwortung (und Interface-Segregationsprinzip) gelten auch hier. Break it up in die verschiedenen Operationen, die Sie benötigen.

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

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

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

und es wird dann viel einfacher, sie zu benennen, weil jetzt nur ein Name wirklich gilt. Vertrauen Sie mir, wenn Sie ein Designer Ihre Devs sind, werden Sie lieben, für die Dinge einfach zu verstehen und zu nutzen.

Es könnte eine generische Schnittstelle werden.

ICrud<T> { }

oder inspiriert von IUserStore.

IStore<T> { }

Warum nicht nur Benutzer CRUD? CRUD hat, im Gegensatz zu ‚verwalten‘ no 10 Bedeutungen.

Wie wäre es "Benutzer" (oder "AuthorizedUsers" oder "CollectionOfUsers") nennen?

würde ich mit UserActions gehen. Dies beschreibt den Satz von Funktionen, die Sie tun wollen; es vermeidet die Falle es sich um eine Sammlung von Aufrufen (da es eigentlich nichts sammeln, einfach ruft eine Sammlung).

Aber ich würde überdenken auch an erster Stelle in dieser Form dieser Klasse haben. Es sieht aus wie das, was Sie versuchen, in Stelle setzen ein Persistenz-Manager ist; gibt es andere Arten von Objekten, die Sie auf diese Weise wollen, werden bestehen? Können Sie jede gemeinsame Funktionalität extrahieren, die dann zu einer Basisklasse abgeleitet werden? Vielleicht eine „PersistenceManager“ Klasse, etc. zu jagen? Dann, wenn es absolut notwendig ist (und ich bin nicht sicher, es wäre), könnte man ein „UserPersistenceManager“ ableiten, die allein auf Benutzerobjekte arbeiten würden. (Ich glaube, es ist nicht notwendig sein könnte, weil Sie in der Lage sein, kann alles, was Sie gerade von der PersistenceManager ausführen müssen, nur spezifische Implementierung Sie, dass sagen kann, though.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top