Как бы вы назвали этот класс CRUD?
-
20-08-2019 - |
Вопрос
Пытаясь избежать Что - то вроде менеджера ловушка здесь...
Допустим, я собираюсь написать пользовательский редактор, который позволит администраторам создавать пользователей в системе.Довольно простая функциональность - просмотр списка существующих пользователей, создание нового пользователя, обновление существующего пользователя, удаление пользователя.
Давайте также скажем, что я решил написать "бизнес"-класс для обработки этих базовых операций 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; это будет действовать только на объекты пользователя. (Я полагаю, что в этом нет необходимости, потому что вы можете выполнять все, что вам нужно, только из <=>; об этом может сказать только ваша конкретная реализация.)