题
试图避免的 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
只是需要的一切,只有你的具体实现可以告诉你的是,虽然。)