2008-09-29 6 views
8

나는 그 라이브러리에 jQuery 강조와 같은 방법을 연결하는 철학을 정말 좋아합니다. 나는 그것을 아주 우아하고 명료하게 발견했다.체인 가능한 방법의 장점과 단점?

저는 주로 자바 개발자로서이 연습이이 언어에서 더 많이 사용되지 않은 이유를 항상 알고 있습니다. 예를 들어 Collection 인터페이스는 메소드를 추가/제거하는 방식으로 설계되지 않았으므로 매우 슬프다.

이 관행에 반대하는 실제적인 죄책감이 있습니까? 아니면 이전에 충분한 "성적 호소력"이 부족한 부분입니까?

답변

0

마틴 파울러 (Martin Fowler)는이 주제를 '유창한 인터페이스'인 http://www.martinfowler.com/bliki/FluentInterface.html에 대해 논의합니다. 한 가지 주요한 문제는 유창한 인터페이스가 인간을 위해 설계 되었기 때문에 Spring과 같은 프레임 워크는이를 이해할 수 없다는 것입니다. 유창한 인터페이스를 사용하면 유지 보수가 한 가지 의미 (가독성)는 있지만 유지 보수성이 떨어집니다 (유연성).

1

나는이 접근법도 정말 좋아합니다. 내가 생각할 수있는 유일한 단점은 모든 방법의 끝에서 '돌아 오는'것이 때때로 약간 어색한 것처럼 보인다는 것입니다. 예를 들어, JQuery의 경우 플러그인을 허용하는 데 약간의 어색함이 있습니다. 왜냐하면 "당신이 당신의 반환을 잊지 않도록하십시오!"라고해야하기 때문입니다. 그러나 컴파일 타임에 그것을 잡을 좋은 방법은 없습니다.

+0

java가 '다른 반환 값이 지정되지 않은 경우이를 반환합니다.'라는 pragma가 있으면 좋을까요? 아니면 컴파일러 경고 일 가능성이 높습니다. –

1

반환 유형이 느슨한 경우에만 문제가 발생하므로 체이닝은 작업을 수행하는 작업에는 좋지만 작업을 계산하는 작업에는 적합하지 않습니다.

또 다른 문제는 체인을 사용하여 인라이닝을위한 간단한 함수 호출을 쉽게 결정할 수 없다는 것입니다. 그러나 만약 당신의 체인이 계산을하지 않고 오퍼레이션을한다면, 컴파일러가 어쨌든 아무것도 변경하지 않을 가능성이 가장 높습니다.

0

JavaScript는 일류 시민으로서의 기능을 갖춘 기능 언어입니다.
개체를 메서드에 추가/제거하고 매개 변수로 함수를 전달하면이 언어에서는 자연스럽지 않습니다.

반면에 Java는 엄격히 OO이며, 클래스 외부에 함수가 존재할 수 없습니다. 상속, 합성 및 인터페이스를 사용하는 것이이 언어에 더 자연스러운 방법입니다.

+0

그리고? OO/functionnal 개념과 메소드 호출 작성 방식 간의 관계는 무엇입니까? 패러다임은 x = a.b()가 아닌 a.b(). c()를 사용하는 데 실제로 영향을 미칩니 까? x.c()? 나는 그렇게 생각하지 않는다. – gizmo

+0

죄송합니다. 잘못된 예입니다. 나는 a.b()를 쓰고 싶었다. 물론 a.c(). – gizmo

+0

아, 함수를 오버라이드하는 의미에서 연쇄를 취한 다음 이벤트를 버블 링 할 때처럼 새 함수의 끝에서 이전 함수를 호출합니다. 함수가 올바른 객체를 반환하는 한 설명하는 것처럼 연결은 실제로 Java에서 가능합니다. – PhiLho

3

IMO 검사를 위해 매개 변수가없는 경향이 있으므로 디버깅하는 것은 힘듭니다.

+0

필자가 아는 한, 모든 실제 IDE는 체인 가능한 메소드의 디버깅을 용이하게하고 매개 변수로 사용되는 메소드 호출을 용이하게하는 단계 - 인/스텝 아웃 기능을 제공합니다. – gizmo

0

연결 가능한 방법은 우리의 디자인 툴백에서 또 다른 훌륭한 도구입니다. 그냥 당신이 일반적인 "나는 망치가, 따라서 모든 문제는 손톱이다"디자인 엉망으로 실행하지 않도록하십시오.

모든 디자인 문제는 연결 가능한 방법으로 해결되지 않습니다. 때로는 인터페이스를 사용하기 쉽게 만드는 데 도움이됩니다 (즉, 언급 한 컬렉션 문제). 때로는 그렇지 않습니다. 트릭은 어떤 경우가 적용되는지를 파악하는 것입니다.

2

체인 가능한 메소드 및 상속에 공통적 인 문제가 있습니다. F1(), F2() 등의 메소드가 C를 리턴하는 클래스 C를 가지고 있다고 가정하십시오. C 클래스로부터 D 클래스를 파생 시키면 메소드 F1, F2 등이 D를 리턴하여 D의 체인 가능한 메소드가 다음을 수행 할 수 있습니다. 사슬 어디서든 호출 할 수 있습니다.

+0

C++에서는 일반적으로 CRTP로 해결됩니다. http://en.wikipedia.org/wiki/Curiously_Recurring_Template_Pattern –

+0

사실, 불행히도 .NET 제네릭에서는 템플릿 매개 변수를 일반 클래스의 기본 클래스 사양에 사용할 수 없습니다. Eric Lippert는 자신의 블로그 (http://blogs.msdn.com/ericlipper)에서 제네릭의 .NET 구현에서 이러한 제한이 불가피한 이유에 대해 설명합니다. – LBushkin

+0

C#이 공변 반환 형식을 지원하면 문제가 줄어들 수 있습니다. 그 동안 new 키워드를 사용하여 기본 메소드를 숨기고 해당 리턴 유형을 사용하는 버전으로 바꿀 수 있습니다. 이 경우에는 코드 복제를 피하기 위해 기본 클래스를 호출하는 것이 좋습니다. – LBushkin

관련 문제