Как реорганизовать функцию, которая принимает множество аргументов? - PullRequest
1 голос
/ 08 октября 2008

Я написал оболочку для 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

Мое беспокойство вызывает количество аргументов, которые должна принимать функция. Эта функция не так уж и плоха, но есть некоторые другие функции, которые мне, возможно, придется выполнять в будущем, которые будут принимать гораздо больше аргументов, поэтому я в основном ищу более эффективные способы создания функций с большими аргументами.

Ответы [ 4 ]

4 голосов
/ 08 октября 2008

В этом случае кажется, что многие параметры являются просто «значениями конфигурации» (которые в конечном итоге являются строками), вы можете изменить его так, чтобы он принимал один класс для всей конфигурации, которую вы подготовили перед вызовом и которая вернет вам строка соответственно.

Что-то вроде

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()
    }
}
2 голосов
/ 08 октября 2008

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

0 голосов
/ 08 октября 2008

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

' Define an Enum with FlagsAttribute.
<FlagsAttribute( )> _
Enum TableOptions as Short
    Hide = 1
    AsReadOnly = 2
    Interactive = 4
    NoIndex = 8
    ViewAutomatic = 16
End Enum
0 голосов
/ 08 октября 2008

Поскольку я не знаю ваш язык программирования, я собираюсь оставить это в псевдокоде, но мой общий ответ - использовать массив 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
}

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

...