2010-03-25 2 views
8

나는 새로운 동적 키워드를 좋아하고 그것을 대체 방문자 패턴으로 사용할 수 있다고 읽었습니다.새로운 동적 키워드를 대체 switch 문으로 사용하는 것은 나쁜 생각입니까?

내가 선호하는 코드는 더 선언적으로 만듭니다.

'유형'의 모든 스위치 인스턴스를 동적 디스패치를 ​​구현하는 클래스로 바꾸는 것이 좋습니다.

class VistorTest 
{ 
    public string DynamicVisit(dynamic obj) 
    { 
     return Visit(obj); 
    } 


    private string Visit(string str) 
    { 
     return "a string was called with value " + str; 
    } 


    private string Visit(int value) 
    { 
     return "an int was called with value " + value; 
    } 
} 
+1

예. 나는 더 많은 단어가 필요하다. – Dykam

+0

혼란 스러움을 제외하고 이것이 오버로드와 다른 점을 나는 안다. –

+0

@Dykam, 더 알고 싶은 것은 무엇입니까? – WeNeedAnswers

답변

8

정말 "좋은 아이디어"로 간주됩니다.

이 방법은 상당히 세련된 방식으로 작동합니다. 그것은 몇 가지 장점과 다른 접근법에 대한 단점을 가지고 있습니다.

  1. 오류 검사가 잠재적 인 :

    1. 그것은
    2. 코드를 확장 할 간결하고 쉽다는 단점에 대한

    매우 간단하다 : 장점 측면에서

    모든 오류 검사는 런타임에 수행되어야하기 때문에 일반적인 방문자 구현보다 어렵습니다. 예를 들어, visitorTest.DynamicVisit(4.2);을 전달하면 런타임에는 예외가 발생하지만 컴파일시 불만은 발생하지 않습니다.
  2. 코드가 덜 명확하고 유지 관리 비용이 더 높을 수 있습니다.

개인적으로 나는 이것이 합리적인 접근이라고 생각합니다. 전형적인 구현의 방문자 패턴은 유지 관리 비용이 상당히 높으며 종종 테스트하기가 어렵습니다. 이로 인해 비용이 약간 높아지지만 구현이 훨씬 간단 해집니다.

좋은 오류 검사 기능을 사용하면 동적 접근 방식을 사용하는 데 문제가 없습니다. 개인적으로, 나는 합리적인 방법으로 수행하는 대안이 그렇지 않으면 꽤 심하게 될 수 있으므로 아마도 이와 같은 접근법을 사용할 것입니다.

그러나 여기에 몇 가지 변경 사항이 있습니다. 첫째, 내가 언급했듯이, 당신은 정말로 오류 검사를 포함 할 필요가있다.

class VistorTest 
{ 
    public string DynamicVisit(dynamic obj) 
    { 
     try 
     { 
      return Visit(obj); 
     } 
     catch (RuntimeBinderException e) 
     { 
      // Handle the exception here! 
      Console.WriteLine("Invalid type specified"); 
     } 
     return string.Empty; 
    } 

    // ...Rest of code 
+0

당신은 이것을 사용하여 오버 헤드를 알고 있습니까? 나는 동적 디스패치를하는 것이 일부 언어에서는 더 비싸다는 것을 읽었습니다. 나는 그것을 좋아하고 그것을 설탕처럼 내 모든 코드에 뿌리고 그것을 사용하고자한다. 그러나 나는 내가 올바르게있는 것을 읽었는지 확인해야한다. :) – WeNeedAnswers

+0

@WeNeedAnswers : 동적 인 디스패치는 실제로 상당히 최적화되어있다. . 이것은 유연한 C#에서 얻을 수있는 접근법의 가능성이 높습니다. 그렇지 않으면 내가 아는 최상의 (유연한) 옵션은 위임 접근법입니다. Judith Bishop이 등장했습니다 ... –

+0

@WeNeedAnswers : 실제로 코드 생성을 기반으로 한 이중 디스 패칭 옵션을 구현했지만 Dynamic은 이와 똑같은 작업을 수행합니다. 훨씬 쉬워. 나는 프로파일을 얻었지만, 이런 식으로 퍼포 레이션을하면 꽤 행복 할거라 생각된다. –

2

방문자 패턴이 일부 언어는하지 않는 것이 사실 해결하기 위해 주로 존재합니다

둘째, 실제로 무슨 일이 일어나고 있는지 더 분명 DynamicVisit 어떤 (약간) 그것을 만들 수도, 직접 dynamic을 만들 것 double dispatchmultiple dispatch을 허용하십시오.

다중 디스패치 또는 다중 메소드는 함수 또는 메소드가 둘 이상의 인수의 런타임 (동적) 유형을 기반으로 동적으로 디스패치 될 수있는 일부 객체 지향 프로그래밍 언어의 기능입니다. 이는 객체의 실제 파생 된 유형을 기반으로 메소드 호출이 동적으로 전달되는 단일 발송 다형성의 확장입니다. 다중 발송은 동적 발송을 일반화하여 두 개 이상의 개체 조합으로 작동합니다.

버전 4까지는 C#이 해당 언어 중 하나였습니다. 그러나 dynamic 키워드가 도입됨에 따라 C#을 통해 개발자는 표시된 것처럼이 디스패치 메커니즘을 선택할 수 있습니다. 이런 방식으로 사용하는 것은 잘못된 것이 없습니다.

switch (또는 C#이 유형 전환을 허용하지 않는다는 점을 감안할 때 더 많은 가능성이있는 발송 사전)은 default 케이스를 가질 수 있기 때문에 타입 안전성을 전혀 변경하지 않았습니다. 호출 할 함수를 찾습니다.이 함수는 바인딩 할 적절한 함수를 찾을 수없는 경우 정확히 동일하게 수행합니다.

관련 문제