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.

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top