Pregunta

Escribí una envoltura para un objeto COM que solo exceptuaba cadenas como entrada, así que en una buena práctica de POO envolví la cadena en una función para que fuera más fácil de construir y llamar.

Me preguntaba si alguien podría pensar en una mejor manera de hacer el siguiente código.

   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 cantidad de argumentos que tiene que tomar la función es mi mayor preocupación. Este no es tan malo, pero hay algunas otras funciones que tendré que hacer en el futuro que requerirán muchos más argumentos, así que busco principalmente mejores formas de crear funciones de grandes argumentos.

¿Fue útil?

Solución

En este caso, parece que muchos de los parámetros son solo 'valores de configuración' (que terminan siendo cadenas), puede modificarlo para aceptar una clase única para toda la configuración que prepare antes de la llamada y que le devolverá la cadena en consecuencia.

Algo como

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

Otros consejos

Una forma de manejar funciones que pueden tomar muchos argumentos es crear un nuevo tipo de objeto cuyo único propósito es mantener argumentos para esa función. Luego crea un nuevo objeto de ese tipo, establece las propiedades según sea necesario y luego pasa esa referencia de objeto a su función OpenTable .

Ya que no conozco tu lenguaje de programación, voy a mantener esto en un pseudo código, pero mi respuesta general es usar ann array como único parámetro:

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, la última parte de su función no tiene sentido para mí, pero creo que la idea de la variedad de parámetros debería aparecer. Buena suerte.

Puede cambiar todos sus parámetros booleanos a un solo parámetro de enum , marcado como Flags . Aquí hay una declaración de ejemplo:

' Define an Enum with FlagsAttribute.
<FlagsAttribute( )> _
Enum TableOptions as Short
    Hide = 1
    AsReadOnly = 2
    Interactive = 4
    NoIndex = 8
    ViewAutomatic = 16
End Enum
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top