5

这将是设计 API 的更好方法:

Example A:
public class UserService {
  public void addUser(final User user);
  public void addUserToIndex(final User user, final int index);
  public User lookUpUser(final User user);
  public User getUserByIndex(final int index );
  public void removeUser(final User user);
  public List<User> getAllUsers();
}

Example B:
public class UserService {
  public void add(final User user);
  public void add(final User user, final int index);
  public User lookUp(final User user);
  public User get(final int index);
  public void remove(final User user);
  public List<User> getAll();
}

显然这段代码不会运行 - 它应该只是显示问题。我更喜欢第二种方法。方法名称可能有点通用,但上下文(类名、参数、返回类型)使其非常清楚。第二种方法可能存在的一个问题是,如果我需要另一个具有相同类型的 get 方法会发生什么。例如,如果我想按年龄获取用户。提前感谢您的帮助。

库库

4

4 回答 4

3

您需要回答两个主要问题才能使您的选择更容易:

  1. 您是否绝对 100% 确定您永远不会与多个实体进行此服务交易?

    换句话说,是否存在一种情况,其中UserService会有其他方法,例如getRoles()?如果答案是肯定的,那么您肯定会选择选项 A

  2. 如果您肯定要为每个服务拥有一个实体,您甚至需要每个服务的接口还是更愿意使用通用的通用接口

    所以,你可以有类似的东西,而不是你的选项 B

    public class Service<T> {
        public void add(final T entity);
        public void add(final T entity, final int index);
        public T lookUp(final T entity);
        public T get(final int index);
        public void remove(final T entity);
        public List<T> getAll();
    }
    

    然后,需要更具体功能的具体服务可以扩展此通用服务。

于 2012-07-29T05:02:17.533 回答
2

鉴于当今的现代 IDE,我同意 Tomasz 的观点,这是一个相当主观的问题。

您必须考虑代码最终会是什么样子(以及 API 的可能扩展)。

a.add(b); // :P this would make no sense at all
a.addUser(b) // is at least more descriptive

支持和反对冗长的方法名称都有一个论据。就个人而言,凭借现代 IDE 的能力,我认为反对的论点正在慢慢减肥。

就个人而言,我更喜欢示例 A,它更清楚每种方法的意图

于 2012-07-29T04:30:41.340 回答
1

您的问题是“变得冗长”与“变得困惑”。由于变得冗长使客户端通过查看方法名称来猜测功能来编写代码。但是,我更喜欢第二个版本,因为方法签名(和返回类型)清楚地表明了它的作用。有了 IDE 支持和适当的注释/文档,第二版更加简洁且同样方便。

除了;没有其他方法可以解释UserService#add(User)会做任何事情。adding user其他方法也是如此。代码看起来很小,打字也更少。

于 2012-07-29T04:47:38.977 回答
1

第一种方法似乎更干净。预先提供更多信息。阅读代码的人会立即知道代码的含义,这在调试或维护别人的代码时很重要。

以下是 2 个示例,它们与您在 2 个最佳设计框架中所做的工作相近:

JDK7

package java.security.acl

public interface Group extends Principal
{

   public boolean addMember(Principal user);
   public boolean removeMember(Principal user);
   public boolean isMember(Principal member);
   public Enumeration<? extends Principal> members();
}

春天:

public interface GroupManager {

   List<String> findAllGroups();
   List<String> findUsersInGroup(String groupName);
   void createGroup(String groupName, List<GrantedAuthority> authorities);
   void deleteGroup(String groupName);
   void renameGroup(String oldName, String newName);
   void addUserToGroup(String username, String group);
   void removeUserFromGroup(String username, String groupName);
   List<GrantedAuthority> findGroupAuthorities(String groupName);
   void addGroupAuthority(String groupName, GrantedAuthority authority);
   void removeGroupAuthority(String groupName, GrantedAuthority authority);
}

从这些界面可以看出,如果我正在阅读代码,就可以立即知道代码在做什么,而无需返回查看对象的类型。

我投票支持您的示例 A。它只是让每个人的生活更简单。

于 2012-07-29T05:18:45.937 回答