2014-01-07 4 views
0

지금은 다른 유형의 항목에 대해 매우 큰 모델 세트가있는 대형 프로그램이 있습니다. 각각의 경우는 상기 아이템의 특성을 설정하고, 그렇게 사용한다. 예를 들어매우 큰 VB 사례 문

:

Select Case Animal 
Case "Dalamatian", "Collie","Lab" 
.Legs = 4 
.Ears = "Floppy" 
.FurIsFuzzy = True 
Case "Elephant" 
.Legs = 4 
.HasTrunk = True 
.HasTusks = True 
Case "Panda", "Polar" 
.IsBear = True 

당신은 아이디어를 얻을. 모든 모델은 다른 속성, 다른 값을 가지고 있습니다. 상속 된 코드는 2,000 모델 (약 100 건 이상!)입니다. 어느 것이 대단히 비효율적입니까. 여기 아카이브에서 메소드 또는 아마도 다형성의 사전을 만들어 이와 비슷한 질문을 한 것 같습니다. 이 문제점에 대한 VB.net에 대한 다른 가능한 제안은 무엇입니까? 아마도 조회 테이블을 생각하고 있었지만 case/switch 문과 비교하여 처리 비용을 알지 못합니다. 아이디어가 있으십니까? 아니면 그냥 괴물을 그대로 두어야합니까?

감사합니다.

+1

코드가 비효율적이지는 않지만 유지 관리 할 수 ​​없습니다. –

+0

이것은 [code review SE] (http://codereview.stackexchange.com/)에 대한 질문 일 수 있습니다. –

+0

@ TimSchmelter 적어도이 질문을 올바르게 이해하면 두 가지 모두라고 제안 할 것입니다. 이 결과는 평균적으로 100,000 개의 문자열을 비교하는 결과를 낳습니다. 해시를 사용하면이 값을 2000 해시 조회로 줄일 수 있습니다. – B2K

답변

0

리팩토링을 패턴으로 읽지 않으신다면 꼭 읽어 보시기 바랍니다. 이것은 기본적으로 메소드 사전이 수행하는 Command 패턴을 사용하는 좋은 예입니다.

읽기 능력 관점에서 볼 때 먼저 추출 방법을 사용하는 것이 좋습니다. 완료되면 case 문을 공유 사전으로 바꿀 수 있습니다. 이런 식으로 뭔가 :

Public Shared commands As New Dictionary(Of String, Action(Of AnimalClass))() 

' In your constructor 
If commands.Count = 0 then 
commands.Add("Dalmation",InitializeAsDog) 
commands.Add("Collie",InitializeAsDog) 
commands.Add("Lab",InitializeAsDog) 
... 
End If 

' Replace case statement with this: 

Dim callback as Action = commands.Item(Animal) 
callback(instanceOfAnimal) 

이 당신이 리팩토링에 대한 O (1) 효율성, 또는 O (2000) 모든 모델을 초기화 할 수 있습니다. 이것을 각 루프마다 100 번의 비교가 필요한 원래의 case 문과 비교해보십시오. 대략적으로 일치 항목이 발견 될 때까지 배열을 검색하는 것과 같습니다. 모든 모델을 초기화하려면 대략 O (100) 또는 O (200000) 정도가됩니다.

0

B2K,

흠, 더 나은 해결책 인 것 같습니다. 나는 동의한다. 그것은 비효율적 일 필요는 없지만, 나를 귀찮게하는 것은 유지해야한다. 이 목록은 소프트웨어에 더 많은 모델을 추가함에 따라 계속 증가하고 있습니다.

나는 확실히 책을보고 이것에 기회를 줄 것이다. 나는 우리가 비교를 줄여야한다고 동의한다.

감사합니다. K