试图避免的 SomethingManager 陷阱这里...

让我们说我要写一个用户编辑,这将使管理员可以创建的用户在系统上。非常基本的功能视一个列表中的现有用户,创建一个新的用户,更新现有的用户,删除的用户。

让我们也说,我决定写一个"业务"类,以处理这些基本的污物的操作。这可能是什么的接口将这样的:

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

内部SaveUser()方法,例如,我会验证数据(使用一个不同的类),然后实际上保存数据的数据库(再次使用另一类)。

我的问题是,什么我应该名这类?是的这类做太多,因此,我应该把它分成多个类?

有帮助吗?

解决方案

命名是困难的,如果不尊重SRP:) 但成员名是经常被滥用。

在你的情况我会做这样的事情:

  • 负责实施的是复盖指定的合同的持久性
  • "谁"是在火

认为没有声音 -坚持做是为用户和相关的名称可以IUserRepository -方法不是更多比。 -因为事实上的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" });
  }
} 

祝你好运:)

其他提示

我借调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> { }

为什么不只是用户CRUD? CRUD拥有,而不是“管理”没有10点的意思。

如何把它称为 “用户”(或 “AuthorizedUsers” 或 “CollectionOfUsers”)?

我会用UserActions去。这说明你想要做的功能集;它避免调用它集合(因为它实际上并没有收集什么东西,只是检索的集合)的陷阱。

但是我还重新考虑具有在首位这个类以这种形式。它看起来像你想到位的是一个持久性管理;在那里,你会想用这种方式坚持任何其他类型的对象?您可以提取,然后可以导出到一个基类的任何通用的功能?也许“PersistenceManager”类或诸如此类?然后,如果它是绝对必要的(而且我不能肯定它会),你可以得到一个“UserPersistenceManager”,将在用户对象单独行动。 (我相信它可能不是必要的,因为你可以执行你从PersistenceManager只是需要的一切,只有你的具体实现可以告诉你的是,虽然。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top