2014-06-13 2 views
2

기타 코드 찾기 응용 프로그램을 구축 중입니다. fretboard를 표현하기 위해 다차원 배열을 사용합니다. 배열의 각 요소는 문자열 속성 'Note'가있는 FretSpace 구조체로 표현됩니다. fretboard를 통해 노트 속성을 초기화하기 위해, fretboard와 함께 작업 할 기타 문자열의 세부 사항을 전달합니다. 이 작업은 GuitarTuner 클래스에서 수행됩니다. 다음은 FretSpace 클래스입니다. -연결 if 문 패턴

public struct FretSpace : IPlottable, IResourceConsumer 
{ 
    public string Note { get; set; } 

    public int XPos { get; set; } 

    public int YPos { get; set; } 

    public string ResourceName { get; set; } 


    public override string ToString() 
    { 
     return string.Format("[{0}] Note:{1} XPos:{2} YPos{3} ResourceName:{4}", 
      GetType().Name, Note, XPos, YPos, ResourceName); 
    } 
} 

기타 튜너 클래스는 한 번에 한 문자열 씩 조정합니다. 이 경우, 튜닝은 모든 FretSpace Note 속성을 해당 프렛 위치에 맞는 음표로 초기화하는 것을 의미합니다. TuneString 메서드에서 작업중인 문자열을 확인하고 선택한 문자열에 적용 할 메모 목록을 반환합니다. 나는 내 코드를보고 큰 냄새가 난다. 여기에 TuneString 방법의 문제가되는 부분은 다음과 같습니다 -

public void TuneString(GuitarString stringToTune, FretSpace[,] fretboard) 
    { 
     List<string> notes = null; 

     if (stringToTune == GuitarString.ELow) 
     { 
      notes = _scaleGenerator.GetScale(Scale.E).ToList(); 
     } 
     if (stringToTune == GuitarString.A) 
     { 
      notes = _scaleGenerator.GetScale(Scale.A).ToList(); 
     } 
     if (stringToTune == GuitarString.D) 
     { 
      notes = _scaleGenerator.GetScale(Scale.D).ToList(); 
     } 
     if (stringToTune == GuitarString.G) 
     { 
      notes = _scaleGenerator.GetScale(Scale.G).ToList(); 
     } 
     if (stringToTune == GuitarString.B) 
     { 
      notes = _scaleGenerator.GetScale(Scale.B).ToList(); 
     } 
     if (stringToTune == GuitarString.EHigh) 
     { 
      notes = _scaleGenerator.GetScale(Scale.E).ToList(); 
     } //carry on and tune the string using the notes we returned 

나는 어떤 디자인 패턴 마스터입니다 없지만 코드는 냄새에 대한 I 빠르게 날카로운 코를 획득하고있다. 동일한 메소드가 매번 호출되지만 다른 매개 변수 만 있으면이 작업을 수행하는 더 좋은 방법이 있습니까? 나는 사령부를 보았다. 값이 반환되는 곳에서는 적용되지 않지만 내가 틀렸다면 나를 수정하십시오. 나는 또한 공장을 보았다. 그러나 이것은 대상의 계열을 반환하는 것과 관련이있다.이 경우에는 적용되지 않는다. I'v는 한 시간의 가장 좋은 부분에 대해 스택 오버 플로우를 검색하여 관련 예제를 찾을 수없는 것 같습니다. 누구든지 도와 줄 수 있어요. 감사.

+0

당신이 말하는 코드 냄새는 무엇입니까? Btw,'else if' 또는'switch'를 사용하십시오. –

+0

저는 제가 끊임없이 제 디자인 결정에 의문을 제기하는 그 단계에 있습니다. 나는 아마추어이고 그것은 내게 보이지도 느끼지 않습니다. 내가하고 싶은 일을하는 더 좋은 방법이 있다면. 마찬가지로이 설계에 아무런 문제가 없다면, 또한 알아야합니다. 그렇지 않으면 switch 문 제안은 고마워했다. –

답변

6

나는 개인적으로 Dictionary<GuitarString, Scale>을 만들고 거기에 문자열과 눈금 사이에 매핑을 저장합니다. 그런 다음 해당 문자열을 간단히 조회하여 규모를 얻을 수 있습니다.

var stringToScaleMap = new Dictionary<GuitarString, Scale> 
          { 
           { GuitarString.ELow, Scale.E } 
           , { GuitarString.A, Scale.A } 
           // etc... 
          } 

var scale = stringToScaleMap[stringToTune]; 
notes = _scaleGenerator.GetScale(scale).ToList(); 

지도를 구성에 저장하거나 프로젝트의 어딘가에 간단하게 하드 코딩 할 수 있습니다. 매핑이 변경되지 않으므로 후자는 아마도 가장 간단한 옵션 일 것입니다.

+0

나에게 잘 어울리 며, 다른 대안이 없으면 그걸 바랄 것이다. 감사. –