타사 라이브러리를 사용합니다. 그들은 우리의 의도와 목적을 위해 아마도 다음과 같이 구현 되는 POJO 를 전달 합니다.
public class OurData {
private String foo;
private String bar;
private String baz;
private String quux;
// A lot more than this
// IMPORTANT: NOTE THAT THIS IS A PACKAGE PRIVATE CONSTRUCTOR
OurData(/* I don't know what they do */) {
// some stuff
}
public String getFoo() {
return foo;
}
// etc.
}
API 캡슐화 및 단위 테스트 촉진을 포함한 여러 가지 이유로 인해 데이터를 래핑하고 싶습니다. 그러나 핵심 클래스가 데이터에 의존하기를 원하지 않습니다 (다시 테스트 목적으로)! 그래서 지금 나는 이와 같은 것을 가지고 있습니다 :
public class DataTypeOne implements DataInterface {
private String foo;
private int bar;
private double baz;
public DataTypeOne(String foo, int bar, double baz) {
this.foo = foo;
this.bar = bar;
this.baz = baz;
}
}
public class DataTypeTwo implements DataInterface {
private String foo;
private int bar;
private double baz;
public DataTypeOne(String foo, int bar, double baz, String quux) {
this.foo = foo;
this.bar = bar;
this.baz = baz;
this.quux = quux;
}
}
그리고 이것은 :
public class ThirdPartyAdapter {
public static makeMyData(OurData data) {
if(data.getQuux() == null) {
return new DataTypeOne(
data.getFoo(),
Integer.parseInt(data.getBar()),
Double.parseDouble(data.getBaz()),
);
} else {
return new DataTypeTwo(
data.getFoo(),
Integer.parseInt(data.getBar()),
Double.parseDouble(data.getBaz()),
data.getQuux();
);
}
}
이 어댑터 클래스는 타사 API에 대해 알아야하는 다른 몇 가지 클래스와 결합되어 내 시스템의 나머지 부분을 통해 퍼짐성을 제한합니다. 그러나 ...이 솔루션은 GROSS입니다! 클린 코드에서, 페이지 40 :
3 개 이상의 주장 (다항식)은 매우 특별한 타당성을 요구하므로 어쨌든 사용해서는 안됩니다.
내가 고려한 것들 :
- 정적 헬퍼 메소드가 아닌 팩토리 오브젝트 작성
- bajillion 인수를 갖는 문제를 해결하지 못함
- 종속 생성자가있는 DataTypeOne 및 DataTypeTwo의 서브 클래스 작성
- 여전히 polyadic protected 생성자가 있습니다
- 동일한 인터페이스를 따르는 완전히 별도의 구현을 만듭니다.
- 위의 여러 아이디어를 동시에
이 상황을 어떻게 처리해야합니까?
이것은 부패 방지 계층 상황 이 아닙니다 . API에는 아무런 문제가 없습니다. 문제는 다음과 같습니다.
- 내 데이터 구조를 원하지 않습니다
import com.third.party.library.SomeDataStructure;
- 테스트 사례에서 데이터 구조를 구성 할 수 없습니다
- 내 현재 솔루션은 매우 높은 인수 수를 초래합니다. 데이터 구조를 전달하지 않고 인수 수를 낮추고 싶습니다.
- 그 질문은 " 어떤 안티 손상 층인가?". 제 질문은 " 이 시나리오를 해결하기 위해 패턴, 패턴을 어떻게 사용할 수 있습니까?"입니다.
나는 코드를 요구하지 않고 (그렇지 않으면이 질문은 SO에있을 것입니다), 효과적으로 코드를 작성할 수 있도록 충분한 답변을 요구합니다 (그 질문은 제공하지 않습니다).
The ideal number of arguments for a function is zero (niladic). Next comes one (monadic), followed closely by two (dyadic). Three arguments (triadic) should be avoided where possible. More than three (polyadic) requires very special justification — and then shouldn’t be used anyway.