2012-07-28 47 views
5

這將是更好的方式來設計的API:乾淨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(); 
} 

顯然,這代碼將不會運行 - 它應該只是顯示問題。我更喜歡第二種方法。方法名稱可能有點通用,但上下文(className,parameter,return Type)使其非常清晰。第二種方法可能存在的一個問題是,如果我需要另一種具有相同Type的get方法,會發生什麼情況。例如,如果我想讓用戶的年齡。預先感謝您的幫助。

褲褲

+1

+1例B,但我很難找到這個問題的建設性,因爲答案是非常主觀的 – 2012-07-28 22:08:14

+0

我認爲一個典型的用法是'userService.addUser(user)',這使得選項A相當多。 – Xion 2012-07-28 22:09:21

+2

而不是'public void add(final User user,final int index);',你應該考慮'public void insert(final User user,final int index);'。我相信這是Java API中常用的名稱。 – 2012-07-28 22:20:24

回答

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(); 
    } 
    

    混凝土業務。

2

鑑於現代IDE這些天,我與托馬斯同意,這是一個相當主觀的問題。

你必須考慮代碼可能最終看起來像什麼(以及API的可能擴展)。

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

有一個爭論和反對冗長的方法名稱。我個人以現代IDE的能力來說,反對的觀點正在慢慢減輕。

就個人而言,我更喜歡例如A,它是更清楚的了每個方法是做

+0

如果我繼承了'a.add(b)'代碼,我會感到不高興,我期望更多一點來自'a'和'b'的名字的創造力。 – akf 2012-07-29 05:34:49

+0

我會向你介紹整個爲我現在繼承的廢話寫了核心庫的人。我介紹過的每個新開發人員都是代碼crys – MadProgrammer 2012-07-29 05:41:06

1

您的問題是「越來越詳細的」 VS「感到困惑」的意圖。由於通過查看方法名稱來獲得詳細信息使客戶端通過猜測功能進行編碼。不過,我更喜歡第二個版本,因爲方法簽名(和返回類型)明確了它的作用。有了IDE支持和適當的評論/文檔,第2版更簡潔,同樣方便。

有沒有其他方式來解釋UserService#add(User)將做除adding user以外的任何事情;其他方法也一樣。該代碼看起來很小,並且輸入較少。

1

第一種方法似乎更清潔。提前瞭解更多信息。閱讀代碼的人會立即知道代碼的含義,這在調試或維護別人的代碼時很重要。

這裏有兩個例子是接近你從最好的設計框架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.它只是讓每個人的生活更簡單。

+0

你的意思是例子A更清潔? – kukudas 2012-07-29 10:51:44

+0

哦對不起..你是對的..將編輯..:D – 2012-07-29 11:12:28

+0

謝謝你的輸入沒問題。但是,如果您查看javas集合API,它也稱爲add(),而不是addElement或addObject。 – kukudas 2012-07-29 13:16:02