Вопрос

Пытаясь избежать Что - то вроде менеджера ловушка здесь...

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

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

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

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

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

Это было полезно?

Решение

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

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

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

Думает без голоса - сохранение выполняется для пользователя, и соответствующим именем может быть IUserRepository - методы предназначены не более чем для CRUD - из-за того, что IUserRepository предназначен для user, нет необходимости сохранять 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" });
  }
} 

удачи :)

Другие советы

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

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

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

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

IUserRepository или IUserServices.

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

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

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

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

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

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

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

ICrud<T> { }

Или вдохновленный IUserStore.

IStore<T> { }

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

Как насчет вызова " Users " (или " AuthorizedUsers " или " CollectionOfUsers ")?

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top