2012-03-11 3 views
16

Clojure 멀티 메소드를 이해하려고 얼마 동안 시간을 ​​보냈습니다. 필자가 이해하는 한, 주요 "프로"멀티 메소드 논쟁은 유연성이지만, 왜 단순한 if 또는 case 문보다 다중 방법이 더 나은지에 대한 논쟁과 혼동 스럽다. 누가 다형성과 과장된 사례 진술 사이의 경계가 어디에서 유래 되었습니까?Clojure의 멀티 메소드가 'if'또는 'case'문장보다 나은 이유

편집 : 질문에서 내가 'if'문과 비교하는 데 더 관심을 가져야 했음에 틀림 없었습니다. 답변 해 주셔서 감사합니다.

+0

if 문과 overglorified goto 사이에 그어진 선은 어디에 있습니까? – Kevin

+1

http://stackoverflow.com/q/5986120/625403에 관심이있을 수 있습니다. 정확히 중복되지는 않지만 밀접하게 관련되어 있습니다. – amalloy

답변

16

다중 방법과 큰 if 문의 차이점은 case 문을 포함하는 함수를 수정하여 if 문에 사례를 추가해야한다는 것입니다. 기존 메서드를 건드리지 않고 새 메서드를 추가 할 수 있습니다.

라이브러리 내부에 다중 방법을 정의하고 사용자가 자신의 데이터 형식으로 확장 할 수있게하려면 아무런 문제가 없습니다. 대신 if 문을 사용했다면 큰 문제가됩니다.

+0

아, 그건 정말로 내가 잘 이해하지 못했던 것입니다. 고마워요! 따라서 다중 메소드는 defmulti가 선언 된 네임 스페이스에 국한되지 않습니까? – Iger

+0

@Iger 맞아요. – sepp2k

23

A, B, C, D 및 E 유형이 있고 m1, m2, m3 메소드가 이전 유형의 단일 인수를 취한다고 가정 해 보겠습니다. 다음과 같이 테이블에 넣을 수 있습니다.

| A | B | C | D | E | 
m1 | | | | | | 
m2 | | | | | | 
m3 | | | | | | 

"switch"문 전략은이 테이블에서 한 번에 하나의 행을 구현합니다. 새 유형 F를 추가한다고 가정하십시오. 모든 구현을 수정하여 지원해야합니다.

클래스 기반 다형성 (C++, Java 등)을 사용하면 대신 전체 열을 구현할 수 있습니다. 이미 정의 된 클래스를 변경할 필요가 없으므로 새 유형을 추가하는 것이 쉽습니다. 그러나 새로운 방법을 추가하는 것은 어렵습니다. 다른 모든 유형에 추가해야하기 때문입니다.

멀티 메소드를 사용하면 서로 독립적으로 테이블의 단일 셀을 구현할 수 있습니다.

이 유연성은 다중 인수로 발송해야하는 경우 더 커집니다. 새로운 인수가있을 때마다이 테이블에 또 다른 차원이 추가되고 swich 기반 및 class 기반의 발송은 모두 매우 복잡해집니다 (방문자 패턴).

멀티 메소드는 실제로는 인수의 유형뿐만 아니라 거의 모든 것을 처리 할 수 ​​있으므로 실제로는 훨씬 일반적인 것입니다.

1

위 ivant의 대답은 this article에서 살펴볼 수 있습니다. 그것은 프로토콜의 힘을 설명하는 훌륭한 일을합니다. 멀티 메소드를 여러 차원의 프로토콜로 생각하십시오.