سؤال

وكتبت المجمع لكائن COM أن تستثنى فقط سلاسل كمدخل، وذلك في الممارسة OOP جيدة I التفاف سلسلة حتى في وظيفة حتى أنه كان من الأسهل لبناء والدعوة.

وأنا أتساءل فقط إذا كان أي شخص يمكن التفكير في طريقة أفضل للقيام التعليمة البرمجية التالية.

   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 الخاص بك.

وبما أنني لا أعرف لغة البرمجة الخاصة بك، والتراسل الفوري ستعمل إبقاء هذا إلى رمز الزائفة، ولكن جوابي العامة هو استخدام آن مجموعة كمعلمة واحدة:

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
}

وطيب الجزء الأخير من وظيفة الخاص بك لا يجعل من المنطقي بالنسبة لي، ولكن الفكرة من مجموعة من بارامس يجب أن تأتي عبر ما أعتقد. حظا سعيدا.

ويمكنك تبديل جميع المعلمات منطقية لمعلمة واحدة من <لأ href = "http://msdn.microsoft.com/en-us/library/8h84wky1(VS.80).aspx" يختلط = "نوفولو noreferrer "> نوع تعداد أو وضع علامة أعلام . وإليك البيان سبيل المثال:

' Define an Enum with FlagsAttribute.
<FlagsAttribute( )> _
Enum TableOptions as Short
    Hide = 1
    AsReadOnly = 2
    Interactive = 4
    NoIndex = 8
    ViewAutomatic = 16
End Enum
scroll top