Wie würdest du diese CRUD-Klasse nennen?

Der Versuch, die SomethingManager trap here... Falle hier zu vermeiden...

Nehmen wir an, ich schreibe einen User-Editor, der es Administratoren ermöglicht, Benutzer im System zu erstellen. Ziemlich grundlegende Funktionalität - Anzeigen einer Liste vorhandener Benutzer, Erstellen eines neuen Benutzers, Aktualisieren eines vorhandenen Benutzers, Löschen eines Benutzers.

Lassen Sie uns auch sagen, dass ich mich entscheide, eine "Business"-Klasse zu schreiben, um diese grundlegenden CRUD-Operationen zu handhaben. Dies ist wahrscheinlich, wie die Schnittstelle aussehen würde:

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

Innerhalb der SaveUser()-Methode, zum Beispiel würde ich die Daten überprüfen (mit einer anderen Klasse) und dann tatsächlich die Daten in der Datenbank speichern (wieder mit einer anderen Klasse).

Meine Frage ist: Wie soll ich diese Klasse nennen? Tut diese Klasse zu viel und sollte ich sie deshalb in mehrere Klassen aufteilen?

Antwort auf "Wie würdest du diese CRUD-Klasse nennen? " 10 von antworten

Meine Präferenz wäre IUserStorage oder IUserStore

Warum nicht nur IUserCRUD? CRUD hat, wie oposed, um "verwalten" keine 10 Bedeutungen.

Wie wäre es, es "Users" (oder "AuthorizedUsers" oder "CollectionOfUsers") zu nennen?

IUserRepository -- wie im Repository pattern. Muster.

Ich bin abgeordnet ChrisW Anruf, um es nur "User" zu nennen.

Jedes Mal, wenn Sie die gleiche Zeichenfolge in den Namen fast jeder Methode setzen, sollte sie aus den Methodennamen entfernt und in den Klassennamen gesetzt werden.

IUserRepository oder IUserServices.

Die Tatsache, dass Sie Schwierigkeiten haben, dies zu benennen, sollte eine riesige rote Flagge sein, dass es falsch ist. Hier gilt das

Single Responsibility Principle (und Interface Segregation Principle). Teilen Sie es in die verschiedenen Operationen auf, 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 dann wird es viel einfacher, sie zu nennen, weil jetzt nur noch ein Name wirklich gilt. Vertrauen Sie mir, wenn Sie ein Designer sind, werden Ihre Entwickler Sie lieben, damit Sie die Dinge einfach zu verstehen und zu benutzen.

Es könnte eine generische Schnittstelle werden.

ICrud<T> { }

Oder inspiriert von IUserStore.

IStore<T> { }
- Methoden sind nicht mehr als für CRUD Was tun mit einem benutzerdefinierten?

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

Im Code mit einem IoC-Container können Sie ganz einfach

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

viel Glück :)

- wegen der Tatsache, dass das IUserRepository für den Benutzer ist, ist nicht notwendig, UserSave, UserUpdate zu haben, weil es die generische Nutzung Art und Weise

The Magic Is Here bremst ... nur das 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 ? - Persistenz erfolgt für den Benutzer und ein relevanter Name kann IUserRepository sein Aber die Namensgebung von Mitgliedern wird oft missbraucht.

In Ihrem Fall werde ich so etwas tun:

  • die Verantwortung der Umsetzung ist es, bestimmte Vertrag der Persistenz
  • "wer" ist unter Beschuss

Denkt ohne Stimme

Benennung ist schwierig, wenn nicht respektiert SRP :)

Würde ich mit UserActions. This describes the set of functionality you want to do; it avoids the trap of calling it a collection (since it doesn't actually collect anything, simply retrieves a collection). gehen. Dies beschreibt den Satz von Funktionen, die Sie tun möchten. Es vermeidet die Falle, es eine Sammlung zu nennen (da es eigentlich nichts sammelt, ruft einfach eine Auflistung ab).

Aber ich würde auch überdenken, diese Klasse in dieser Form überhaupt zu haben. Es sieht so aus, als ob das, was Sie zu setzen versuchen, ein Persistenz-Manager ist; Gibt es andere Arten von Objekten, die Sie auf diese Weise beibehalten möchten? Können Sie allgemeine Funktionen extrahieren, die dann zu einer Basisklasse abgeleitet werden können? Vielleicht eine PersistenceManager" class or somesuch? Then, if it's absolutely necessary (and I'm not certain it would be), you could derive a " "Klasse oder so? Dann, wenn es absolut notwendig ist (und ich bin mir nicht sicher, ob es sein würde), könnten Sie ein UserPersistenceManager" that would operate on User objects alone. (I believe it might not be necessary because you may be able to perform everything you need just from the ableiten, das nur auf Benutzerobjekten arbeiten würde. (Ich glaube, es könnte nicht notwendig sein, weil Sie in der Lage sein können, alles, was Sie brauchen, nur von der PersistenceManager; only your specific implementation can tell you that, though.) durchzuführen; nur Ihre spezifische Implementierung kann Ihnen das sagen, obwohl.)