2012-08-24 27 views
0

我正在爲現有的REST API編寫Java API庫。庫API設計:多種方法的額外參數

REST API有一些postOperations(getPosts,getUserPosts,getGlobalPosts等) 所以我有一個postOperations的類,公開這個類。 現在我需要添加所有操作的選項來添加一組參數(generalParameters)。

您認爲更好的解決方案是什麼?

  1. 爲當前函數添加一個參數,這意味着有時用戶必須傳遞null(實際上是80%的時間)。
  2. 添加重載函數來獲得2個參數的每個操作(這意味着增加6-7重載方法的類)

我知道,這兩個方面的工作。 在大多數應用程序中這不是主要問題,但編寫其他庫時會使用它的庫似乎對我來說更重要一些。

您的意見是?什麼是更好的api揭露?

回答

0

我會做這樣的事情:

public void handle(some parameters) { 
    //handle params 
} 
public void handle() { 
    handle(null, null, -1, w/e); 
} 

根據您的編輯:

這裏該代碼使用選項2;如果你添加另一個重載的方法,它不會傳入一個空值,但是它們通過null

+0

我實際上不必爲此做出3個功能。 handle()可以在其中調用句柄(params)。 但它仍然意味着重複所有的功能至少x2。 – arikg

+0

@arikg爲什麼你必須複製所有的功能?你只需要複製他們的方法頭(減去參數),然後讓他們調用另一個方法,空值 –

+0

是的,這就是我的意思,複製頭......我意識到這一點。我所問的不是如何解決這個問題,我實際上是在問你爲什麼認爲這是更好的方法? – arikg

0

在這兩個選擇之間,我更喜歡#1,除非向後兼容性是問題。我認爲讓圖書館用戶意識到參數並迫使他們作出關於是否提交參數的明智決定是很好的做法。

另一種方法是創建一個用於更細粒度控制的上下文對象。而不是將generalParameters爲數據結構,把他們作爲上下文的屬性:

class PostOperations { 
    public void getPosts() { 
    return getPostContext().getPosts(); 
    } 

    public void getPostContext() { 
    return new PostContext(); 
    } 
} 

class PostContext { 
    public void setGeneralProperty1() {...} 
    public void setGeneralProperty2() {...} 
    public void getPosts() {...} 
} 

你可以決定如何將各種獲取*郵方法建模。根據它們在系統中的含義,你可以讓PostContext擁有所有這些方法,或者你可以在PostContext上有一個影響它的getPosts()行爲的狀態(例如PostContext.setUserOnly(true)),或者你可以使用類層次結構(例如class UserPostContext extends PostContext