문제

void 메서드를 반환하는 대신 특별한 의미가 없더라도 클래스에 대한 참조를 반환했다고 가정해 보겠습니다.메소드 호출 방법에 대해 더 많은 옵션을 제공하여 유창한 인터페이스와 같은 스타일로 사용할 수 있게 해주는 것 같고 아무 것도 할 필요가 없기 때문에 어떤 단점도 실제로 생각할 수 없습니다. 반환 값으로 (심지어 저장도 가능)

따라서 객체를 업데이트하고 현재 값을 반환하려는 상황에 있다고 가정해 보겠습니다.말하는 대신

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

두 줄을 결합하여 말할 수 있습니다

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

편집하다: 나는 변덕스럽게 아래 질문을 했습니다. 돌이켜보면 그것이 불필요하고 복잡할 가능성이 있다는 데 동의합니다. 그러나 무효가 아닌 반환에 관한 내 질문은 의미가 있습니다.

관련 메모에서 언어에 새로운 구문 설탕이 포함되는 것에 대해 어떻게 생각하시나요?

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

이 연산자는 우선 순위가 낮으므로 myObj.Update()가 먼저 실행된 다음 Update의 void 반환 대신 myObj에서 GetCurrentValue()를 호출합니다.

본질적으로 저는 "왼쪽에 있는 첫 번째 유효한 개체에 대해 연산자의 오른쪽에 있는 메서드를 호출합니다"라고 말하는 연산자를 상상하고 있습니다.이견있는 사람?

도움이 되었습니까?

해결책

나는 Java에서 그들이 실제로 void 메소드에 대한 표준 동작을 만드는 것에 대해 생각하고 있다는 것을 알고 있습니다.그렇게 하면 추가 구문 설탕이 필요하지 않습니다.

제가 생각하는 유일한 단점은 성능입니다.그러나 그것은 쉽게 측정됩니다.몇 분 후에 결과를 알려드리겠습니다 :-)

편집하다:

참조를 반환하는 것은 void를 반환하는 것보다 약간 느립니다.놀랐는 걸.그래서 그것이 유일한 단점입니다.함수를 호출할 때 몇 번의 틱이 더 필요합니다.

다른 팁

제 생각엔 일반적인 정책으로는 말이 안 되는 것 같아요.이러한 방식의 메소드 체이닝은 적절하게 정의된 인터페이스에서 작동하지만 의미상 의미가 있는 경우에만 적합합니다.

귀하의 예는 의미론적으로 의미가 없기 때문에 적절하지 않은 주요 예입니다.

마찬가지로 적절하게 설계된 유창한 인터페이스에서는 구문 설탕이 필요하지 않습니다.

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

JQuery가 활용하는 것과 같은 "유창한 인터페이스"가 구축되는 방식이 아닌가요?한 가지 이점은 코드 가독성입니다(Wikipedia 항목은 http://en.wikipedia.org/wiki/Fluent_interface 일부 사람들이 그것을 발견했다고 언급 아니다 읽을 수 있음).또 다른 이점은 코드가 간결하다는 것입니다. 7줄의 코드에서 속성을 설정한 다음 8번째 줄에서 해당 개체에 대한 메서드를 호출할 필요가 없습니다.

마틴 파울러(여기서 이 용어를 만든 사람 - http://martinfowler.com/bliki/FluentInterface.html)는 Fluent 인터페이스에 메소드 체이닝보다 더 많은 것이 있다고 말합니다. 그러나 메소드 체이닝은 Fluent 인터페이스와 함께 사용하는 일반적인 기술입니다.

편집하다:나는 실제로 내 대답을 편집하고 측정 가능한 방식으로 무효화하는 대신 이것을 반환하는 데 아무런 불이익이 없다고 덧붙이기 위해 여기로 돌아 왔습니다. George의 의견에서 내가 논의하는 것을 잊었다는 것을 지적했습니다. 가리키다 질문의.처음에 "무의미한" 말장난을 해서 죄송합니다.

"self" 또는 "this"를 반환하는 것이 일반적인 패턴입니다. "메소드 체이닝".귀하가 제안한 구문 설탕에 관해서는 잘 모르겠습니다.나는 .NET 전문가는 아니지만 나에게는 별로 유용하지 않은 것 같습니다.

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

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

public MyCollection remove(Object someElement)

서명만 보면 동일한 인스턴스에 대한 참조를 반환하고 있는지 확실하지 않습니다.MyCollection은 변경할 수 없으며 새 인스턴스를 반환할 수도 있습니다.여기와 같은 경우에는 이를 명확히 하기 위해 외부 문서가 필요할 수도 있습니다.

나는 실제로 이 아이디어를 좋아하고 'this'에 대한 참조를 반환하기 위해 Java7의 모든 void 메소드를 개조하는 것에 대한 논의가 있었지만 결국 실패했다고 믿습니다.

첫눈에는 좋아 보일 수 있지만 일관된 인터페이스를 위해서는 모든 메서드가 이에 대한 참조를 반환해야 합니다(이에는 자체적인 문제가 있습니다).

이것을 반환하는 GetA 메서드와 다른 개체를 반환하는 GetB 메서드가 있는 클래스가 있다고 가정해 보겠습니다.

그런 다음 obj.GetA().GetB()를 호출할 수 있지만 적어도 일관성이 없어 보이는 obj.GetB().GetA()는 호출할 수 없습니다.

Pascal(및 Visual Basic)을 사용하면 동일한 개체의 여러 메서드를 호출할 수 있습니다.

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

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top