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


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.