Domanda

Ho scritto un wrapper per un oggetto COM che escludeva solo le stringhe come input, quindi nella buona pratica OOP ho avvolto la stringa in una funzione in modo che fosse più facile da costruire e chiamare.

Mi stavo solo chiedendo se qualcuno potesse pensare a un modo migliore per fare il seguente codice.

   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

La quantità di argomenti che la funzione deve prendere è la mia più grande preoccupazione. Questo non è poi così male, ma ci sono alcune altre funzioni che potrei dover svolgere in futuro che richiederanno molti più argomenti, quindi cerco principalmente modi migliori per costruire funzioni di argomento di grandi dimensioni.

È stato utile?

Soluzione

In questo caso sembra che molti dei parametri siano solo "valori di configurazione" (che finiscono per essere stringhe), potresti modificarlo per accettare una singola classe per tutta la configurazione che prepari prima della chiamata e che ti restituirà la stringa di conseguenza.

Qualcosa di simile

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()
    }
}

Altri suggerimenti

Un modo per gestire le funzioni che possono accettare molti argomenti è quello di creare un nuovo tipo di oggetto il cui unico scopo è contenere argomenti per quella funzione. Quindi si crea un nuovo oggetto di quel tipo, si impostano le proprietà secondo necessità, quindi si passa quel riferimento a un oggetto alla funzione OpenTable .

Dato che non conosco il tuo linguaggio di programmazione, lo terrò come pseudo codice, ma la mia risposta generale è usare ann array come parametro singolo:

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, l'ultima parte della tua funzione non ha senso per me, ma penso che l'idea di array di parametri dovrebbe trovarsi. Buona fortuna.

Puoi cambiare tutti i tuoi parametri booleani in un singolo parametro di un enum , contrassegnato come Flags . Ecco una dichiarazione di esempio:

' Define an Enum with FlagsAttribute.
<FlagsAttribute( )> _
Enum TableOptions as Short
    Hide = 1
    AsReadOnly = 2
    Interactive = 4
    NoIndex = 8
    ViewAutomatic = 16
End Enum
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top