Wie Funktion Refactoring, dass viele Argumente übernimmt?
-
05-07-2019 - |
Frage
ich einen Wrapper für ein COM-Objekt geschrieben, die nur Zeichenkette als Eingabe ausgenommen, so in guter OOP Praxis ich die Schnur nach oben in einer Funktion gewickelt, so dass es leichter war, zu bauen und zu nennen.
Ich habe mich nur gefragt, ob jemand einen besseren Weg denken konnte, den folgenden Code zu tun.
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
Die Menge der Argumente, die die Funktion zu übernehmen hat, ist meine größte Sorge. Dies ist nicht so schlecht, aber es gibt einige andere Funktionen, die ich in Zukunft machen müssen können, dass viel mehr Argumente nehmen, so dass ich es hauptsächlich auf der Suche nach besseren Möglichkeiten, großes Argumente Funktionen zu bauen.
Lösung
In diesem Fall scheint es, viele der Parameter sind nur ‚Konfigurationswert‘ (das sind Strings am Ende), man könnte es ändern, um eine einzelne Klasse für die ganze Konfiguration zu übernehmen, die Sie vor dem Anruf vorbereiten und das wird Sie zurückkommen die Zeichenfolge entsprechend.
So etwas wie
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()
}
}
Andere Tipps
Eine Möglichkeit, Funktionen zu handhaben, dass viele Argumente nehmen kann, ist einen neuen Objekttyp, deren einzigen Zweck zu schaffen, ist für diese Funktion Argumente zu halten. Dann erstellen Sie ein neues Objekt dieser Art, stellen Sie die Eigenschaften nach Bedarf, dann passieren, dass ein Objekt Bezug auf Ihre OpenTable
Funktion.
Da ich Ihre Programmiersprache weiß nicht, halten im gonna dies zu Pseudo-Code, aber meine allgemeine Antwort ist ann Array als einzelne Parameter zu verwenden:
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
}
Ok der letzte Teil Ihrer Funktion muß nicht Sinn für mich, aber die Idee der Anordnung von params kommen sollte, über denke ich. Viel Glück.
können Sie schalten Sie alle Ihre boolean Parameter auf einen einzelnen Parameter eines enum Typ, markiert als Flags . Hier ist ein Beispiel-Deklaration:
' Define an Enum with FlagsAttribute.
<FlagsAttribute( )> _
Enum TableOptions as Short
Hide = 1
AsReadOnly = 2
Interactive = 4
NoIndex = 8
ViewAutomatic = 16
End Enum