多くの引数を取る関数をリファクタリングする方法は?
-
05-07-2019 - |
質問
入力として文字列のみを除外するCOMオブジェクトのラッパーを作成したため、OOPの適切な実践では、文字列を関数でラップして、ビルドと呼び出しが容易になるようにしました。
次のコードを実行するより良い方法を誰かが考えられるかどうか疑問に思っていました。
Public Function OpenTable(ByVal TablePath As String, Optional ByVal OpenAs As String = Nothing, _
Optional ByVal Hide As Boolean = False, Optional ByVal AsReadOnly As Boolean = False, _
Optional ByVal Interactive As Boolean = True, Optional ByVal Password As String = Nothing, _
Optional ByVal NoIndex As Boolean = False, Optional ByVal ViewAutomatic As Boolean = True) As TableInfo
If String.IsNullOrEmpty(TablePath) Then
Throw New ArgumentNullException("TablePath", "TablePath cannot be null or empty")
End If
Dim Builder = New StringBuilder("Open Table ")
Builder.AppendFormat("{0}{1}{2}", ControlChars.Quote, TablePath, ControlChars.Quote)
If (Not String.IsNullOrEmpty(OpenAs)) Then Builder.AppendFormat(" as {0} ", OpenAs)
If (Hide) Then Builder.Append(" Hide ")
If (AsReadOnly) Then Builder.Append(" ReadOnly ")
If (Interactive) Then Builder.Append(" Interactive ")
If (Not String.IsNullOrEmpty(Password)) Then Builder.AppendFormat(" Password {0} ", Password)
If (NoIndex) Then Builder.Append(" NoIndex ")
If (ViewAutomatic) Then Builder.Append(" View Automatic ")
MyComApp.Do(Builder.ToString)
Dim FileInfo = New IO.FileInfo(TablePath)
Return New TableInfo(FileInfo.Name.Substring(0, InStrRev(FileInfo.Name, ".") - 1))
End Function
関数が取らなければならない引数の量は、私の最大の心配です。これはそれほど悪くはありませんが、今後さらに多くの引数を取る必要のある関数がいくつかあるので、主に大きな引数関数を作成するより良い方法を探しています。
解決
この場合、パラメーターの多くは単なる「構成値」(最終的には文字列)であるように見えるため、呼び出しの前に準備するすべての構成に対して単一のクラスを受け入れるように変更できますそれに応じて文字列。
次のようなもの
class COMConfiguration {
private bool Hide = false;
private bool AsReadOnly = false;
//and so on...
public void setHide(bool v) { Hide = v; }
//only setters
public string getConfigString() {
StringBuilder sb = new StringBuilder();
if (Hide) { sb.Append(" Hide "); }
if (AsReadOnly) { sb.Append(" ReadOnly "); }
//and so on
return sb.ToString()
}
}
他のヒント
多くの引数を取ることができる関数を処理する1つの方法は、その関数の引数を保持することを唯一の目的とする新しいオブジェクトタイプを作成することです。次に、そのタイプの新しいオブジェクトを作成し、必要に応じてプロパティを設定し、その1つのオブジェクト参照を OpenTable
関数に渡します。
私はあなたのプログラミング言語を知らないので、これを擬似コードのままにしますが、私の一般的な答えは、単一のパラメーターとしてann配列を使用することです:
function OpenTable( options As array) {
if (options is not array or options is empty) {
Throw exception
}
return_string = "";
if ( key is set ('readOnly', options) and is not empty) {
return_string = return_string + ' readonly';
}
// repeat last 3 lines for all your params
}
わかりました、あなたの関数の最後の部分は私には意味がありませんが、paramsの配列のアイデアは私が思うに出くわす必要があります。幸運を祈ります。
所属していません StackOverflow