试图避免SomethingManager陷阱......
假设我要编写一个用户编辑器,允许管理员在系统中创建用户。非常基本的功能 - 查看现有用户列表,创建新用户,更新现有用户,删除用户。
我们还要说,我决定编写一个“业务”类来处理这些基本的CRUD操作。这可能是界面的样子:
public interface ISomeUsefulName
{
IList<User> FetchUsers();
User FetchUser(int userId);
bool SaveUser(User user);
bool DeleteUser(int userId);
}
在SaveUser()方法中,我会验证数据(使用不同的类)然后实际将数据保存到数据库(再次使用另一个类)。
我的问题是,我应该为这堂课命名什么?这个类做得太多了,因此我应该把它分成多个类吗?
答案 0 :(得分:7)
如果不尊重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" });
}
}
祝你好运:)
答案 1 :(得分:5)
我正在支持ChrisW的电话,只是将其命名为“用户”。
每当你发现自己在几乎每个方法的名称中放入相同的字符串时,都应该从方法名称中删除它并放入类名。
答案 2 :(得分:3)
IUserRepository - 与Repository模式一样。
答案 3 :(得分:2)
我的偏好是IUserStorage或IUserStore
答案 4 :(得分:2)
IUserRepository或IUserServices。
答案 5 :(得分:2)
你在命名这个问题时遇到麻烦应该是一个巨大的红旗,这是错误的。
单一责任原则(和接口隔离原则)适用于此处。将其分解为您需要的各种操作。
public interface IUserList
{
IList<User> FetchUsers();
}
public interface IUser
{
User FetchUser(int userId);
}
public interface IUserStore
{
bool SaveUser(User user);
bool DeleteUser(int userId);
}
然后命名它们变得更加简单,因为现在只有一个名称真正适用。相信我,如果你是一名设计师,你的开发人员会爱你,使事情易于理解和使用。
答案 6 :(得分:2)
它可以成为通用界面。
ICrud<T> { }
或者受到IUserStore的启发。
IStore<T> { }
答案 7 :(得分:1)
为什么不只是用户CRUD? 与“管理”没有10个含义相反,CRUD有。
答案 8 :(得分:1)
如何称它为“用户”(或“AuthorizedUsers”或“CollectionOfUsers”)?
答案 9 :(得分:0)
我会选择UserActions
。这描述了您要执行的功能集;它避免了将其称为集合的陷阱(因为它实际上并不收集任何东西,只是检索集合)。
但我首先要重新考虑这种形式的课程。看起来你想要实现的是一个持久性管理器;你有什么其他类型的对象要以这种方式持久存在吗?您是否可以提取可以派生到基类的任何常用功能?也许是一个“PersistenceManager
”级或某些人?然后,如果它是绝对必要的(我不确定它会是什么),你可以得到一个“UserPersistenceManager
”,它将仅对User对象进行操作。 (我相信它可能没有必要,因为你可以从PersistenceManager
执行所需的一切;但是只有你的具体实现可以告诉你,尽管如此。)