많은 논증을 취하는 기능을 리팩터링하는 방법은 무엇입니까?
-
05-07-2019 - |
문제
나는 문자열을 입력으로 제외하고 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 당신의 기능의 마지막 부분은 나에게 의미가 없지만, 매개 변수 배열에 대한 아이디어는 내가 생각합니다. 행운을 빕니다.
제휴하지 않습니다 StackOverflow