나는 당신이 적절한 추상화를 사용하고 있는지의 여부는 문제라고 생각합니다.
첫 번째 경우에는
interface IHasGetA {
IHasGetB getA();
}
interface IHasGetB {
IHasGetC getB();
}
interface IHasGetC {
ITransmogrifyable getC();
}
interface ITransmogrifyable {
void transmogrify(x,y);
}
main은 유형 IHasGetA
입니다. 문제는 : 추상화가 적합한가? 답은 사소한 것이 아닙니다. 그리고이 경우에는 약간 떨어져 보이지만 어쨌든 이론적 인 예입니다. 그러나 다른 예를 구성하려면 다음을 수행하십시오.
main.getA(v).getB(w).getC(x).transmogrify(y, z);
종종보다 낫다
main.superTransmogrify(v, w, x, y, z);
후자의 예에서 두 때문에 this
와 main
유형에 의존한다 v
, w
, x
, y
및 z
. 또한 모든 메소드 선언에 6 개의 인수가있는 경우 코드가 실제로 더 좋아 보이지 않습니다.
서비스 로케이터에는 실제로 첫 번째 접근 방식이 필요합니다. 서비스 로케이터를 통해 생성 된 인스턴스에 액세스하고 싶지 않습니다.
따라서 개체를 통해 "연결"하면 많은 종속성이 생길 수 있으며 실제 클래스의 속성을 기반으로하는 경우 더 많은 종속성을 만들 수 있습니다.
그러나 추상화를 만드는 것, 즉 객체를 제공하는 것은 완전히 다른 것입니다.
예를 들어, 다음을 가질 수 있습니다.
class Main implements IHasGetA, IHasGetA, IHasGetA, ITransmogrifyable {
IHasGetB getA() { return this; }
IHasGetC getB() { return this; }
ITransmogrifyable getC() { return this; }
void transmogrify(x,y) {
return x + y;//yeah!
}
}
main
의 인스턴스는 어디에 있습니까 Main
? 클래스를 아는 main
것이 IHasGetA
대신에 종속성을 줄이면 Main
실제로 커플 링이 매우 낮습니다. 호출 코드는 실제로 원래 객체의 마지막 메서드를 호출하고 있다는 사실조차 알지 못합니다. 실제로 분리의 정도를 보여줍니다.
구현의 내부에 깊숙이 아니라 간결하고 직교적인 추상화의 경로를 따라갑니다.