你会说这个CRUD课程的名字是什么?

时间:2009-05-08 18:33:39

标签: naming-conventions crud

试图避免SomethingManager陷阱......

假设我要编写一个用户编辑器,允许管理员在系统中创建用户。非常基本的功能 - 查看现有用户列表,创建新用户,更新现有用户,删除用户。

我们还要说,我决定编写一个“业务”类来处理这些基本的CRUD操作。这可能是界面的样子:

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

在SaveUser()方法中,我会验证数据(使用不同的类)然后实际将数据保存到数据库(再次使用另一个类)。

我的问题是,我应该为这堂课命名什么?这个类做得太多了,因此我应该把它分成多个类吗?

10 个答案:

答案 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执行所需的一切;但是只有你的具体实现可以告诉你,尽管如此。)