2011-06-10 7 views
0

값이 before, after 또는 none 인 클래스가 enum DoStuff입니다. 이 이름들은 실제 이름이 아니지만 그 의미를 알 수 있습니다. 클래스는 메소드 foo을 가지고 있습니다.이 코드를 작성하는 더 좋은 방법이 있습니까?

public [type] MyProperty { 
    get { 
     if(enumValue == DoStuff.Before) 
      foo(); 

     [type] result = //Do calculations here 

     if(enumValue == DoStuff.After) 
      foo(); 

     return result; 
    } 
} 

이러한 전/후 계산 부른다 추출하는 방법이 있나요 : 다음 무엇

다음과 같이 각각의 모양, 다른 유형의 읽기 전용 속성의 집합입니다? 나는 현재이 개 솔루션을 생각할 수 있습니다 :

  • 가 대리자를 취하고, 적절한 장소에 foo를 호출하는 개인 방법을 만듭니다. 이 글을 쓰고있는 플랫폼에 제네릭이 없기 때문에 복잡합니다.

  • 는 어느 래퍼 호출과 uninstantiable 기본 클래스를 확인하고 잘 알려진 패턴이있는 전에 적절한 장소

의 호출로, 기본 클래스의 속성에 액세스 서브 클래스 후 도출 이런 종류의 구조?

+2

스타일에 대한 일반적인 의견으로 초기화를 제외하고 속성 게터 내에서 상태를 변경하지 않는 것이 좋습니다. – Reddog

+1

무한 재귀! –

+0

@Dan Tao : 죄송합니다. 내 잘못이야. – Eric

답변

1

이 구문을 사용하는 방법 만듭니다

다음
delegate void Handler(); 

void DoHandler(Handler handler) 
{ 
     if(enumValue == DoStuff.Before) 
      foo(); 

     handler(); 

     if(enumValue == DoStuff.After) 
      foo(); 
} 

당신의 속성을

public [type] MyProperty 
{ 
    get 
    { 
     [type] result = default(type); 
     DoHandler(() => 
     { 
      int a = 5; 
      int b = 6; 
      result = a + b; 
     }); 
     return result; 
    } 
} 
+0

두 가지 문제가 있습니다. 첫째, 각 반환 값 유형에 대해 DoHandler 함수를 작성해야하므로 코드가 더 복잡해지며 클리너가 아닙니다. 두 번째로 나는 제네릭 지원이 없다는 질문에'Func '을 사용하지 않았다. – Eric

+0

글쎄, 당신은 약간 다를 수 있습니다. 나는 그것을 수정할 것이다. –

+0

C#에서 람다 안에서 클로저를 할 수 있습니까? – Eric

0

나는 enumValue를 지금 설정하고있는 곳이면 어디서나 적절한 장소에 Before and After 이벤트/위임자를 만들고 slop foo()를 두려워 할 것입니다. 그런 다음 전화 :

get { 
    BeforeDelegate(); 
    // Do calcs 
    AfterDelegate(); 
} 

무엇이 실제적인 용도입니까? 왜이 패턴이 필요한가요?

사이드 노트 : 그런 종류의 논리를 사용하는 게터가 있다면 그 방법에 넣을 가능성이 큽니다. 사람들을 놀라게 할 가능성은 적습니다. 메서드는 스칼라 값을 노출하는 것 이상의 값을 얻기 위해 무언가를 아마 수행했을 것이라고 암시합니다. EnumValue는 변경이 적절한 이벤트를 해고 할 때

+0

코드는 하드웨어와 인터페이스하기 때문에 하드웨어의 속성이므로 속성을 사용하는 것이 합리적입니다. [하드웨어] (http://www.sparkfun.com/datasheets/Components/HMC6352.pdf)에는 세 가지 모드가 있습니다 : 지속적으로 업데이트 ('연속', 일명 DoStuff.None), 요청시 업데이트 ('대기' 일명'DoStuff.Before'), read ('Query', 일명'DoStuff.After') 이후에 업데이트합니다. – Eric

+0

흠 ... 나는 여전히'GetPropertyValue()'호출을 더 편하게 생각할 것이지만, 시작하기에 애매한 일이다. 의사 결정 시점에서'foo()'이외의 것이 있습니까? 나는 이것이 "간결한 의미론"만큼이나 "최고의 패턴"문제라고 생각하지 않는다.그 모든 일이 발생하고 이것이 발생하는 유일한 속성 인 경우 열거 형 접근법이 매우 명확합니다. 이 모든 곳에서 이런 일이 발생하면 대리인/이벤트 접근 방식을 사용하게됩니다. –

0

나는 enamvalue 클래스를 사용하는 클래스, 에서 이벤트에 EnamumValue 및 이벤트 전후라는 이름의 한 속성이 별도의 클래스에서 열거 값을 넣어이 문제를 처리하기 위해 더 나은 생각

public class EnumValueClass 
{ 

    public event BeforeDelegate OnBefore(); 
    public event AfterDelegate OnAfter(); 
    private EnumType enumValue; 
    public EnumType EnumValue 
    { 
     get { 
      return enumValue; 
     } 
     set{ 
      this.enumValue = value; 
      if(enumValue == DoStuff.Before) 
       if(OnBefore!=null) 
        OnBefore(); 

      if(enumValue == DoStuff.After) 
       if(OnAfter!=null) 
        OnAfter(); 
     } 


    } 
} 
+0

통화 계약에 맞지 않습니다. 첫째, 'OnAfter'는 'OnBefore'와 같은 기능입니다. 더 중요한 것은, foo 메소드는 대부분의 프라퍼티 접근 전에 또는 후에 호출되어야한다는 것이다. 모드가 변경되면 호출 할 필요가 없습니다. – Eric

관련 문제