문제

나는 문자열을 입력으로 제외하고 COM 객체에 대한 래퍼를 썼으므로 좋은 OOP 연습에서는 끈을 함수로 래빙하여 만들고 호출하기가 더 쉬워졌습니다.

누군가가 다음 코드를 수행하는 더 좋은 방법을 생각할 수 있는지 궁금했습니다.

   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
}

Ok 당신의 기능의 마지막 부분은 나에게 의미가 없지만, 매개 변수 배열에 대한 아이디어는 내가 생각합니다. 행운을 빕니다.

모든 부울 매개 변수를 단일 매개 변수로 전환 할 수 있습니다. 열거적 유형, 표시 깃발. 예제 선언은 다음과 같습니다.

' 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