Как бы вы назвали этот класс CRUD? - PullRequest
8 голосов
/ 08 мая 2009

Пытаясь избежать ловушки SomethingManager здесь ...

Допустим, я собираюсь написать редактор пользователей, который позволит администраторам создавать пользователей в системе. Довольно базовая функциональность - просмотр списка существующих пользователей, создание нового пользователя, обновление существующего пользователя, удаление пользователя.

Давайте также скажем, что я решил написать «бизнес» класс для обработки этих основных операций CRUD. Это, вероятно, как будет выглядеть интерфейс:

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

Например, внутри метода SaveUser () я проверял бы данные (используя другой класс), а затем фактически сохранял данные в базе данных (снова используя другой класс).

Мой вопрос: как мне назвать этот класс? Этот класс делает слишком много, и поэтому я должен разделить его на несколько классов?

Ответы [ 10 ]

7 голосов
/ 08 мая 2009

Называть сложно, если не соблюдается SRP :) Но имена членов часто используются неправильно.

В твоем случае я сделаю что-то вроде этого:

  • ответственность за реализацию заключается в покрытии указанного договора о постоянстве
  • "кто" под огнем

Думает без голоса - постоянство сделано для пользователя, и соответствующее имя может быть IUserRepository - методов не больше чем для CRUD - из-за того, что IUserRepository предназначен для пользователя, необязательно иметь UserSave, UserUpdate, поскольку он тормозит общий способ использования

Магия здесь ... просто сделайте это:

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

Это сложно? Что делать с кастомным?

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

В коде, использующем контейнер IoC, вы можете легко это сделать

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

удачи :) 1022 *

5 голосов
/ 08 мая 2009

Я поддерживаю вызов ChrisW, чтобы просто назвать его «Пользователь».

Каждый раз, когда вы вводите одну и ту же строку в имя почти каждого метода, ее следует удалить из имен методов и указать имя класса.

3 голосов
/ 08 мая 2009

IUserRepository - как в шаблоне Репозиторий .

2 голосов
/ 08 мая 2009

Может стать универсальным интерфейсом.

ICrud<T> { }

Или по мотивам IUserStore.

IStore<T> { }
2 голосов
/ 08 мая 2009

Тот факт, что у вас возникли проблемы с присвоением ему названия, должен быть гигантским красным флагом, что это неправильно.

Здесь применяется принцип единой ответственности (и принцип разделения интерфейса). Разбейте его на различные операции, которые вам нужны.

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

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

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

и тогда их становится намного проще называть, потому что теперь действительно применяется только одно имя. Поверьте мне, если вы дизайнер, ваши разработчики будут любить вас за то, что вы делаете вещи простыми для понимания и использования.

2 голосов
/ 08 мая 2009

IUserRepository или IUserServices.

2 голосов
/ 08 мая 2009

Я бы предпочел IUserStorage или IUserStore

1 голос
/ 08 мая 2009

Как насчет того, чтобы назвать его «Пользователи» (или «AuthorizedUsers» или «CollectionOfUsers»)?

1 голос
/ 08 мая 2009

Почему не просто IUserCRUD? CRUD, как предпочел «управлять», не имеет 10 значений.

0 голосов
/ 09 мая 2009

Я бы пошел с UserActions. Это описывает набор функций, которые вы хотите сделать; он избегает ловушки называть его коллекцией (так как он на самом деле ничего не собирает, просто извлекает коллекцию).

Но я также переосмыслил бы, что этот класс в этой форме в первую очередь. Похоже, что вы пытаетесь поставить на место менеджер персистентности; Существуют ли другие типы объектов, которые вы хотите сохранить таким образом? Можете ли вы извлечь какую-либо общую функциональность, которая затем может быть выведена в базовый класс? Возможно класс "PersistenceManager" или что-то подобное? Затем, если это абсолютно необходимо (и я не уверен, что это будет), вы можете получить «UserPersistenceManager», который будет работать только с объектами пользователя. (Я полагаю, что в этом нет необходимости, потому что вы можете выполнять все, что вам нужно, только с PersistenceManager; об этом может сказать только ваша конкретная реализация.)

...