2017-02-23 42 views
0

我的問題不是「如何處理太多參數」,我在How to avoid "too many parameters" problem in API design?找到了答案。我需要的是有關實施的補充信息。「太多參數」保留私有變量或將其替換爲參數類

我有一類

internal class SomeClass 
{ 
    private string value1; 
    private DateTime value2; 
    private SomeEnum value3; 
    // and the same until valueALot 

    internal SomeClass(string val1, DateTime val2, SomeEnum val3, ...) 
    { } 
} 

,我和一個新的類SomeParameters

internal class SomeParameters 
{ 
    internal string value1 { get; set; } 
    internal DateTime value2 { get; set; } 
    internal SomeEnum value3 { get; set; } 
} 

internal class SomeClass 
{ 
    internal SomeClass(SomeParameters parameters) 
    { } 
} 

我的問題是替換構造函數的參數:在SomeClass類我應該保持獨立的變量,並從它們分配SomeParameters還是應該用SomeParameters類的實例替換它們?

解決方案1:

internal class SomeClass 
{ 
    private string value1; 
    private DateTime value2; 
    private SomeEnum value3; 

    internal SomeClass(SomeParameters parameters) 
    { 
     value1 = parameters.value1; 
     value2 = parameters.value2; 
     value3 = parameters.value3; 
    } 
} 

解決方案2:

internal class SomeClass 
{ 
    private SomeParameters _parameters; 

    internal SomeClass(SomeParameters parameters) 
    { 
     _parameters = parameters; 
    } 
} 

解決方案2似乎更容易,避免冗餘,但我不知道這是否是一個很好的做法。解決方案2是否意味着安全問題?

也許最簡單的解決方案是好的,我問自己太多的問題。

感謝您的反饋

+0

您演示的方式,它看起來像'SomeClass' *爲*參數包裝對象,這使得'SomeParameters'相當多餘。 – Abion47

+1

如果您將值保存在「SomeParameters」實例中,則應制作該實例的副本。否則,類的用戶可能稍後更改給定實例中的值(「SomeParameters」是引用類型),並且您可能不希望類中的值從外部更改。 –

+0

@ Abion47所以我提出它不好,SomeClass做了很多東西,不是一個包裝 –

回答

0

你SomeParameters實際上是在數據傳輸對象:

當你和一個遠程接口的工作,如遠程門面(388),每次調用它價格昂貴。因此,您需要減少呼叫數量,這意味着您需要在每次呼叫時傳輸更多的 數據。一種方法是使用大量參數。 但是,這對程序來說通常很尷尬 - 實際上,對於只返回單個 值的Java等語言而言,這通常是不可能的。

https://martinfowler.com/eaaCatalog/dataTransferObject.html

我會說,有什麼不對您的解決方案2,但我想更多地瞭解你的應用程序的背景和與您的SomeClass的業務。

另外一點,實在值得一讀:https://msdn.microsoft.com/en-us/library/ff649585.aspx