메소드 체인을 사용하여 오브젝트를 빌드하는 관용구의 이름은 무엇입니까?


21

필자는 메소드 체인 을 사용하여 Builder또는 Prototype패턴 과 유사한 객체를 설정 하지만 각 메소드 호출마다 새 객체를 만들지 않고 대신 원래 객체를 수정하는 패턴을 사용합니다.

예:

new Menu().withItem("Eggs").withItem("Hash Browns").withStyle("Diner");

이 패턴의 이름이 있는지, 안티 패턴으로 간주되는지 궁금합니다. 더 유창하게 읽을 수 있지만 긴 메소드 체인으로 이어질 수 있기 때문입니다.


3
유창한 인터페이스는 스타일의 문제입니다. API를 작성하는 경우 대체 양식을 제공하십시오.
Oded


@Oded 각 호출을 별도의 명령문으로 작성하여 체인없이 이러한 API를 사용할 수 있습니까? 아니면 대안에 대한 다른 아이디어가 있습니까?
개렛 홀

@GarrettHall-물론 가능하지만 menu.withStyle("")문맥이없는 것과 같은 것을 호출하게 됩니다. 이 경우 두 개의 API 가 필요합니다 .
Oded

2
@GarrettHall '유창한 인터페이스'라는 점 이다 문장과 같이 판독 될 의미있어서 체인. 이런 의미에서, 긴 메소드 체인은 나쁜 것으로 간주되지 않습니다. 그러나 Oded에 동의합니다.보다 일반적인 구문으로 동일한 기능을 제공하는 것이 가장 좋습니다. 그렇게하면 개발자는 사용할 방법을 선택할 수 있습니다.
Eric King

답변:


37

유창한 인터페이스

나는 항상이 방법이 ' 유창한 인터페이스 ' 라고 들었습니다. 에릭 에반스 ( 도메인 주도 디자인 명성)와 마틴 파울러 ( 애자일 선언문 명성) 의 공동 창조 입니다.

주요 단점은 가독성 (일부 사람들이 좋아하고 싫어하는 것)이며, 전체 조치 체인이 단계별로 설명 할 때 단일 조치로 간주 될 수 있기 때문에 경우에 따라 디버그하기가 더 어렵다는 사실입니다.

필자는이 기술을 몇 번만 사용했지만 반 패턴으로 간주하지는 않는다.


4
제안자들은 유창한 인터페이스가 단순히 메소드 연쇄 이상의 것을 포함한다고 주장하지만, 그 용어가 무엇을 의미하는지는 불분명합니다.
Kilian Foth

전체 체인이 단일 진술로 간주되는 것이 일반적입니까? 그것은 저에게 잘못 설계된 디버거 문제처럼 들립니다.
blueberryfields

체인을 단일 문으로 취급하는 디버거를 보지 못했지만 체인의 끝을 향한 방법 중 하나, 하나의 특정 체인에만 관심이 있다면 여전히 고통 스럽습니다.
vaughandroid

1
나는 C #에서 일하고 .NET 디버거를 사용하면 개별 메소드를 잘 시작할 수 있습니다. 다른 언어는 확실하지 않습니다.
Eric King

1
@KilianFoth 질문의 의견에서 언급했듯이, 유창한 인터페이스의 체인 메소드는 거의 문장으로 읽을 수 있어야합니다. 때때로 이것은 개별 방법이 다른 방법으로 다른 모범 사례로 간주되어야 함을 의미합니다
Izkata

5

이와 같은 메서드 체인은 일반적으로 체인에 일종의 흐름이나 검색 가능성이있는 경우 Fluent Interface라고합니다. 또는 검색 가능성에 중점을 두지 않기 때문에 메소드 체인에 크게 의존하는 jQuery와 같은 API를 '유창하지 않은'것으로 생각할 수 있습니다. 편의성에 더 좋습니다.

예를 들어 (withx, withy를 사용하여) 일부 상태 (메소드 호출)에서 올바르게 구성된 객체를 반환하는 방법을 알고있는 특수 클래스가 있으므로이 패턴을 Builder 패턴의 변형으로 간주 할 수 있습니다.

적절하게 사용하면 안티 패턴이 아닙니다.


발견 능력이란 무엇입니까? API의 자동 완성을 통해 필요한 메소드를 찾을 수 있습니까?
Josiah Yoder

jQuery에 익숙하지 않습니다. 그들의 방법 체인은 검색 가능성이 아닌 편의를 위해서만 어떻게됩니까? 연결하는 방법이 너무 많기 때문에 자동 완성 기능을 사용하더라도 압도적입니까?
Josiah Yoder

3

반 패턴으로 간주되는지 여부

반 패턴이 아닙니다. jQuery는 아마도 가장 잘 사용되는 구현 일 것입니다.

더 유창하게 읽을 수 있지만 긴 메소드 체인으로 이어질 수 있기 때문에

그렇습니다, 그러나 대안은 무엇입니까? 거의 평범한 영어 문장으로 끝날 수 있으며, API는 사용 가능하고 적합한 것을 안내합니다.


.. 그리고 8-10 대신 1 줄로 원하는 것을 얻을 수 있습니다. 터미널에 하나의 라이너 만 쓰는 경우에 좋습니다. 10보다 하나의 명령을 기억하는 것이 더 쉽습니다. 유창하고 분석법에 이름이 있으므로 읽기도 쉽습니다. 안타깝게도 Python2에서는 Python3 / Python4에서 더 이상이 작업을 수행 할 수 없습니다.
mckenzm

-3

이것을 "열차 사고"패턴이라고합니다.

(반 패턴이며 Clean Code에 위배됩니다)

"기차 사고"패턴 은 데메테르법칙을 위반합니다 .


3
이 예제는 링크 된 아티클의 메소드 체인과 동일하지 않습니다 a.getB().getC().doSomething(). "당신의 메소드는 자신의 필드에서 메소드를 직접 호출 할 수 있지만 필드의 필드에서는 호출 할 수 없습니다." 여기에는 하나의 개체 만 생성되며 "자신이 만든 장난감으로 놀 수 있습니다".
Nic
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.