2008-09-11 5 views
11

메서드를 void로 반환하는 대신 특정한 의미를 가지지 않는 경우에도 클래스에 대한 참조를 반환했습니다. 나에게 그것은 메소드가 호출되는 방식에 대한 더 많은 옵션을 제공하여 유창한 인터페이스와 같은 스타일로 사용할 수있게 해주고 아무 것도 할 필요가 없으므로 어떤 단점도 생각할 수없는 것처럼 보입니다. 반환 값 (심지어 그것을 저장).무효 대신에 이것을 반환하면 어떤 단점이 있습니까?

개체를 업데이트 한 다음 현재 값을 반환하려는 상황에 있다고 가정합니다. 나는 충동에 아래의 질문, 생각해 보면, 내가 동의합니다 대신

myObj.Update(); 
var val = myObj.GetCurrentValue(); 

말을 당신은

var val = myObj.Update().GetCurrentValue(); 

EDIT 말을 두 줄을 결합 할 수있을 것입니다 가능성이 불필요하고 복잡하게 될 가능성이 있지만, 공백보다는 오히려 이것을 반환에 관한 내 질문.

var val = myObj.Update()<.GetCurrentValue(); 

이 연산자는 myObj.Update (그래서 우선 순위가 낮은 순서 것)을 실행합니다 : 너희들이 언어를 가지고 어떻게 생각하십니까 관련 메모에

는 문법적의 새로운 비트를 포함 먼저 Update의 void 반환 대신 myObj에서 GetCurrentValue()를 호출하십시오.

필자는 "왼쪽의 첫 번째 유효한 개체에서 연산자의 오른쪽에 메서드를 호출하십시오"라는 연산자를 상상하고 있습니다. 이견있는 사람?

답변

9

나는 자바에서 실제로 void 메소드에 대한 표준 동작을 만드는 것에 대해 생각하고 있습니다. 당신이 그렇게한다면 당신은 더 많은 통사론을 필요로하지 않습니다.

유일한 단점은 성능입니다. 그러나 그것은 쉽게 측정됩니다.나는

편집 :-) 몇 분에 결과 해 드리겠습니다 :

가 참조를 반환하는 것은 무효 돌아보다 약간 느린 .. 무엇 놀람. 이것이 유일한 단점입니다. 귀하의 기능을 호출 할 때 몇 가지 진드기가 있습니다.

+0

smalltalk ftw, 비록 당신이 그걸로 멋지게 체인을 만들 수는 없지만 –

2

"self"또는 "this"를 반환하는 것은 흔히 "method chaining"이라고하는 일반적인 패턴입니다. 당신의 제안 된 설탕에 관해서는, 나는 그렇게 확신하지 않습니다. 나는 .NET 녀석이 아니지만 그것은 나에게별로 도움이되지 않는다.

+0

어쩌면 연산자 아이디어에, 어쩌면 거기에 어떤 이점이 무효 반환 할 수 있을지 궁금 오전 –

2

이 패턴을 사용하는 데 사용 된 NeXTSTEP Objective-C 프레임 워크. 분산 객체 시스템이 반환 유형을보고 호출자가 필요하다고 가정하기 때문에 분산 객체 (원격 프로 시저 호출, 기본적으로)가 언어에 추가 된 후에는 해당 프레임 워크에서 중단되었습니다 (self이 동기 호출이어야 함). 함수의 결과를 알기 위해서.

+0

난 그게 문제가 될 수있는 방법을 볼 수 있지만 그것은 C# 또는 VB에서 제한되지 않습니다 암호. –

+0

글쎄, 그것은 이론적으로 인트로 스펙 션을 지원하는 언어에서 문제가 될 수 있습니다. –

12

일반 정책으로 생각하면 이해가되지 않습니다. 이 방식으로 메서드 체이닝은 적절히 정의 된 인터페이스로 작동하지만 의미 론적으로 이해한다면 적절합니다.

귀하의 예는 논리적으로 의미가 없으므로 부적절한 경우가 많습니다.

비슷하게 적절하게 설계된 유창한 인터페이스를 사용하면 신택스 설탕이 필요하지 않습니다.

유창한 인터페이스 또는 메소드 체인 이 매우 잘 작동하지만 신중하게 설계해야합니다.

+0

감사합니다. 정확히 요. – GEOCHET

+0

메서드 체이닝의 이점은 로컬 변수를 정의하는 것을 피할 수 있다는 것입니다. 너무 많이 푸시하지 않으면 좋은 방법입니다. –

2

유일한 단점은 API가 약간 혼란 스럽다는 것입니다. 일반적으로 void를 반환하는 remove() 메서드가있는 컬렉션 객체가 있다고 가정 해 보겠습니다. 이제 컬렉션 자체에 대한 참조를 반환하려고합니다. 새 서명은 다음과 같이 표시됩니다.

public MyCollection remove(Object someElement) 

서명을 보면 방금 동일한 인스턴스에 대한 참조가 반환되는 것은 확실하지 않습니다. 어쩌면 MyCollection이 변경되지 않고 새 인스턴스를 반환하는 것일 수 있습니다. 어떤 경우에는 여기 에서처럼이를 명확히하기 위해 외부 문서가 필요합니다.

저는 실제로이 아이디어가 마음에 들었습니다. 그리고 나는 '이'에 대한 참조를 되돌리기 위해 Java7에서 모든 void 메소드를 개조하는 데있어 몇 가지 이야기가 있었지만 궁극적으로 실패했다고 생각합니다.

+0

그게 사실이긴하지만 myCollection.remove (item1) .add (item2) .swap (item3, item4)와 같은 능률적 인 코드를 쓸 수있게합니다. –

3

JQuery가 사용하는 것과 같은 "유창한 인터페이스"가 어떻게 구성되어 있지 않습니까? 하나의 이점은 코드 가독성 (code readability)입니다. (http://en.wikipedia.org/wiki/Fluent_interface에있는 위키 피 디아 엔트리는 일부 사람들이 그것을 찾을 수 있다고 언급합니다. 은 읽을 수 없습니다. 가독성). 코드 간소화에 또 다른 이점이 있습니다. 7 행의 코드에서 속성을 설정 한 다음 8 행에서 해당 객체에 대한 메서드를 호출해야합니다.

마틴 파울러 (여기에서 용어 - http://martinfowler.com/bliki/FluentInterface.html)는 메소드 체인보다 유창한 인터페이스가 더 많다고 말하지만 메소드 체인은 유창한 인터페이스와 함께 사용하는 일반적인 기술입니다.

편집 : 난 사실 내 대답을 편집하고 나는 조지의 코멘트 내가 을 논의하는 것을 잊지 않았다고 지적봤을 때, 측정 가능한 방법으로 대신 무효의 반환에 아무런 불이익이 없다는 것을 추가 다시 여기오고 있었다 문제의가 가리킨다. 초기 "무의미한"소동에 대해 유감스럽게 생각합니다.

+0

예 내가 유창한 인터페이스 스타일이라고 언급 한 이유는, 메서드 연쇄 방식보다 유창한 인터페이스가 더 많다는 것입니다. 문제는 실제로 어떤 불리한 점이 있는지입니다. –

0

첫눈에 보일지 모르지만 일관된 인터페이스의 경우 모든 메소드가이 문제에 대한 참조를 반환해야합니다. .()

는 그런 다음 obj.GetA를 호출 할 수 있습니다 GetB을(),하지만 obj.GetB() :

하자가 다른 개체를 반환이와 GetB를 돌려 두 가지 방법 게타와 클래스가 말한다. 적어도 일관성이없는 GetA().

파스칼 (및 Visual Basic)을 사용하면 동일한 객체에 대해 여러 메소드를 호출 할 수 있습니다.

with obj 
    .GetA(); 
    .GetB(); 
end with; 

이 기능의 문제는 쉽게 그것이 있어야보다 이해하기 어렵 코드를 작성할 수 있다는 것입니다. 또한 새로운 연산자를 추가하면 아마 더 어려워 질 것입니다.

+0

처음에는 void를 반환하는 GetA() 메서드를 사용하는 것이 이상합니다. 더 합리적인 예제는 obj.UpdateA()입니다. GetA() 나에게 완벽하게 이해할 수 –

+0

질문 - 그것은 obj.GetA()에 대한 더 많은 sesnse을 만들 것입니다 이것보다는 A를 반환? 우리가 여기에 가독성을 타협하지 않을까요? – Subramanian

+0

예제를 너무 많이 읽고 있습니다. '이'가 'A * '유형 일 수 있기 때문에'게타 '가'* this '가 완벽한 의미를 반환하도록 할 수 있습니다. – Ismael

관련 문제