2012-09-13 71 views
4

有我在一天一次調用一個函數:有大量參數的函數是否有任何解決方法?

new SubmitLogs().mail(IP, date_time_UTC, date_time_IST , pageVisited , userCountry , userRegion , city , userAgent); 

函數參數保持增長。最初它是這樣的:

new SubmitLogs().mail(IP, date_time_UTC, userAgent); 

現在它有5個更多的參數。預計一週內會有更多的爭論。現在我不喜歡這樣。保留具有這麼多論點的函數對我來說似乎不是一件好事。有沒有解決這個問題的方法?如果它不斷增長,我將永遠不想向函數發送50個參數。這個電話所做的是通過電子郵件將短信和短題目的細節發送給參與者。

+0

創建這些參數的數據對象類和對象傳遞給方法。 #2的 –

回答

10

你有兩種選擇真的

  1. 嘗試和組的一些參數彙集成一個對象。這將把相似的東西封裝在一起。例如,您可以將userRegion,userCountry和city放在一個位置對象中

  2. 或者,Builder模式很好。 Josh Bloch的Effective Java有一個很好的章節。

+1

+1。對於我們這些沒有喬希的書的人來說,你可能希望用一個小例子總結一下這個模式。 – dasblinkenlight

+0

剛剛添加了該章節的鏈接:) – RNJ

0

創建一個值對象並傳遞該值對象。如果它是遠程調用或其他東西,請記住執行Serializable。

class MailParams { 

    String ip; 
    String dateTimeUTC; 
    String dateTimeIST; 
    // .... and so on 
} 
1

聽起來像你需要更多的對象來表示組的相關對象。

new SubmitLogs().mail(IP, date_time_UTC, date_time_IST , pageVisited , userCountry , userRegion , city , userAgent); 

看起來像有一些物體等待出來。

public class UserLocation { 
    private string userCountry; 
    private string userRegion; 
    private string city; 
    // ... 
} 

現在你已經簡化了一點

new SubmitLogs().mail(IP, data_time_UTC, date_time_IST, pageVisited, userLocation, userAgent); 

我不知道你的域名,但它可能是你可以找到數據的其他羣體,使這些結合在一起。

一旦你將數據放在一起,你可能會發現方法開始自然移動到這些類。例如,UserLocation可能有一個方法將這些信息寫入流。

+0

UserLocation是一回事。這可能是因爲爭論根本沒有關係! – saplingPro

+0

@grassPro我們通常在一個函數中發送類似的項目。如果沒有一個論點與他們之間有任何關係,那麼這是一個設計問題 –

0

我只會將必要的參數作爲參數發送到此方法,並且所有可選參數都將通過Map提供,其中此地圖的關鍵字爲Enum,其中包含可能的可選項列表參數及其類型和值是給定調用的該屬性的值。

new SubmitLogs().mail(sender, receiver, subject, body, ImmutableMap.<SubmitLogMailParams, Object>of(<param1>, <value1>, <param2>, <value2>, ...); 
0

提供的方法的不同實施方式中 - 用3個PARAMS,電子郵件()和10個PARAMS等郵件(),所以匹配的最好的一個可以使用。

3

這聽起來像:

  1. 的封裝問題。將您的論點集中到一個或多個邏輯相關對象中
  2. 範圍問題。 你的方法試圖做得太多嗎?或者,您可以在包含對象上配置此實例類型信息。

我的一個朋友曾經對我說過。

如果你有10個參數的函數,它通常是一個跡象,表明 你忘了另外5

相關問題