명명 된 및 선택적 인수를 지원하는 언어를 사용할 때 빌더 패턴이 더 이상 실용적이지 않습니까?
빌더 :
new Builder(requiredA, requiredB).setOptionalA("optional").Build();
선택적 / 명명 된 인수 :
new Object(requiredA, requiredB, optionalA: "optional");
명명 된 및 선택적 인수를 지원하는 언어를 사용할 때 빌더 패턴이 더 이상 실용적이지 않습니까?
빌더 :
new Builder(requiredA, requiredB).setOptionalA("optional").Build();
선택적 / 명명 된 인수 :
new Object(requiredA, requiredB, optionalA: "optional");
답변:
빌더는 오브젝트에 유용한 많은 인수 / 종속성이 필요하거나 오브젝트를 구성하는 여러 가지 방법을 허용하려는 경우 가장 유용 합니다.
머릿속에서 누군가가 다음과 같이 3D 게임에서 오브젝트를 "빌드"하고 싶어한다고 상상할 수 있습니다.
// Just ignore the fact that this hypothetical god class is coupled to everything ever
new ObjectBuilder(x, y, z).importBlenderMesh("./meshes/foo")
.syncWithOtherPlayers(serverIP)
.compileShaders("./shaders/foo.vert", "./shaders/foo.frag")
.makeDestructibleRigidBody(health, weight)
...
나는이 예제가 선택적 매개 변수를 사용하는 것보다 지금 작성한 빌더 메소드로 더 읽기 쉽다고 주장합니다.
new Object(x, y, z, meshType: MESH.BLENDER,
meshPath: "./meshes/foo",
serverToSyncWith: serverIP,
vertexShader: "./shaders/foo.vert",
physicsType: PHYSICS_ENGINE.RIGID_DESTRUCTIBLE,
health: health,
weight: weight)
...
특히 빌더 메소드 이름으로 암시 된 정보는 더 많은 매개 변수로 대체되어야하며 밀접하게 연관된 매개 변수 그룹에서 하나의 매개 변수를 잊어 버리기가 훨씬 쉽습니다. 실제로 프래그먼트 셰이더가 누락되었지만 찾을 필요가 없으면 알 수 없습니다.
물론 객체가 생성하는 데 1 ~ 5 개의 인수 만 사용하는 경우 명명 된 / 선택적 매개 변수의 유무에 관계없이 빌더 패턴을 포함시킬 필요가 없습니다.
Ixrec가 말한 것 외에도 매개 변수라는 생성자 또는 메서드를 사용하면 객체를 빌드하기 전에 여전히 수정할 수있는 구성 가능한 상태로 만들 수 없습니다. 이것은 빌더의 아름다움이며, 구성의 일부를 다른 방법이나 클래스에 모두 위임 할 수 있습니다.
var myThingBuilder = new ThingBuilder("table");
myThingBuilder.setAttribute(Attributes.Legs, 4);
inventoryManager.setPrices(myThingBuilder);
// inventory manager
var availableCheapestMaterial = getMaterial();
myThingBuilder.setMaterial(availableCheapestMaterial);
기본적으로 최종 객체를 빌드 할 준비가 될 때까지 빌더를 시스템 주위에 던질 수 있으므로 빌더 소비자에게 필요한 지식의 양을 줄일 수 있습니다.
빌더로 수행중인 작업에 따라 다릅니다.
빌더를 사용하여 오브젝트 특성을 설정 (및 변경)하고 오브젝트 작성을 연기하는 경우 이름 지정된 매개 변수로 바꿀 수 있습니다.
빌더를 교체하면 @Ixrec이 언급 한 가독성 / 사용 상충 관계가있을 수 있습니다 (또는 작성하지 않은 경우 빌더로 수행중인 작업에 따라 다름).
그러나 빌더가 특성을 보유하는 것 이상을 수행하고 각 구성 단계에 논리가 포함 된 경우이를 대체 할 수 없습니다.
MockBuilder 는 명명 된 params로 대체 할 수없는 예입니다. 페이지에서 :
변경 불가능한 오브젝트로 작업 할 때 빌더 패턴이 필수적입니다. 변경 불가능한 객체로 작업하면 많은 이점이 있습니다. 특히 동시 환경 (예 : 스레드)에서 프로그램을보다 강력하게 실행하는 경우
new Integer(42)
, new BigDecimal("42.000")
그리고 new String("foobar")
... 음, 빌더는 이러한 경우에 불필요하게 복잡 할 것 immutables 모든 생성자입니다. 따라서 생성자가 마찬가지로 작동 할 수있는 경우 불변으로 작업하는 데 빌더가 필수적 이지 않습니다 .