Как реорганизовать функцию, которая принимает множество аргументов?

StackOverflow https://stackoverflow.com/questions/181605

Вопрос

Я написал оболочку для COM-объекта, который исключал только строки в качестве входных данных, поэтому в хорошей практике ООП я обернул строку в функцию, чтобы ее было легче создавать и вызывать.

Мне просто интересно, может ли кто-нибудь придумать лучший способ сделать следующий код.

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

Другие советы

Одним из способов обработки функций, которые могут принимать множество аргументов, является создание нового типа объекта, единственной целью которого является хранение аргументов для этой функции. Затем вы создаете новый объект этого типа, задаете необходимые свойства, а затем передаете эту ссылку на один объект в вашу функцию 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
}

Хорошо, последняя часть вашей функции не имеет смысла для меня, но идея массива параметров должна встретиться, я думаю. Удачи.

Вы можете переключить все ваши логические параметры на один параметр enum , помеченный как флаги . Вот пример объявления:

' Define an Enum with FlagsAttribute.
<FlagsAttribute( )> _
Enum TableOptions as Short
    Hide = 1
    AsReadOnly = 2
    Interactive = 4
    NoIndex = 8
    ViewAutomatic = 16
End Enum
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top