2011-11-24 1 views
2

내 지오메트리 컬렉션에 멋진 디자인 패턴을 구현하는 깔끔한 방법을 찾고 있습니다. 바로 지금 내 기하학 유형 계층 구조의 맨 위에 Geometry이라는 특성이 있습니다. 아이디어는 모든 지오메트리가 특성을 상속하도록 한 다음 특정 지오메트리 유형에 대한 특정 코드를 구현하는 것입니다. 기하학적 객체로서 이러한 형상은 다양한 방법을 구현해야합니다. 예를 들어 다른 지오메트리와의 거리를 계산하는 기능을 예로 들어 보겠습니다.이 점을 distanceTo이라고합니다. 이해야 할 가장 깨끗한 방법은 지금처럼 Geometry 특성의 방법을 가지고 :기하학 유형 계층 구조에 대한 깔끔한 디자인 패턴

def distanceTo(geometry : Geometry) : Double 

내 문제는 이것이다 : 내가 입력하지 않고도 기하학에서이 방법 (말하는 Rectangle)를 구현하려면 어떻게 존재하는 모든 도형에 대해 확인 하시겠습니까? 요청을 개별 지오메트리에 위임 할 수있는 편리한 방법이 있습니까?

건배, 스칼라 이후

+1

"이중 발송"과 "방문자 패턴"을 찾아 볼 수 있습니다. 이러한 것들이 N^2 또는 그와 유사한 함수를 구현할 필요가 없도록 해줄뿐입니다. 그들은 일을 좀 더 쉽게 만들고 더 체계화 된 방식으로 해줍니다. –

+0

double dispatch와 visitor 패턴은 Java와 같이 언어 수준의 여러 디스패치 * 패턴 매칭이 부족한 언어로이를 수행하는 좋은 방법입니다. 그러나 방문자 패턴은 상당히 복잡하고 많은 상용구 코드가 필요합니다. –

답변

2

multiple dispatch이없는, 가장 좋은 건 기하학적 객체의 쌍에 일치하는 패턴이다.

(geo1, geo2) match { 
    case (Rectangle(x1,y1,w1,h1), Rectangle(x2,y2,w2,h2)) => .... 
    ... 
} 

같은 뭔가 당신은이 메소드를 호출하는 Geometry 특성에 편리한 방법을 정의 할 수 있습니다. Geometry이 봉인 된 특성 인 경우 컴파일러는 패턴 일치가 누락 된 경우 경고를 표시합니다.

+0

네, 그렇게 생각했습니다. 더 나은 해결책이 있기를 바랬지만 대신 N^2 변종을 고수 할 것입니다. 답장을 보내 주셔서 감사합니다. –

+0

사례의 절반을 면도하기 위해 재귀를 사용하는 것을 잊지 마십시오. (Rectangle, Circle)에 대한 코드를 작성하고 위의 일치에서 마지막 경우를 distance라고하는 함수로 가정하고'case (a, b) => distance (b, a) '라고 말하십시오. (원, 직사각형)이 처리됩니다. –

+0

@ 바트 : 조합을 놓치면 무한 루프가 생기기 때문에 나쁜 생각입니다. 동일한 효과를 얻는 더 좋은 방법은 먼저 셰이프 유형별로 쌍을 정렬하는 것입니다. –