현재 상황 ..유형에 더 이상 유효하지 않은 구현이 있으면 어떻게해야합니까?
은 내가 Car
인터페이스를 가지고 :
interface Car {
void startWith(Key key);
void switchGearTo(GearMode mode);
//..
static Car newCar() { // factory
return new CarImpl();
}
}
는
이 인터페이스를 (공장이 예제를 단축 중첩, 별도의 클래스에 존재) 구현이 있습니다
를class CarImpl implements Car {
private Ignition ignition;
private GearShift gearShift;
public void startWith(Key key) {
// use ignition
}
public void switchGearTo(GearMode mode) {
// use gear shift
}
}
이 시점에서 Car
은 응용 프로그램의 요구에 충분히 구체적이므로이 구조가 좋습니다. 더 많은 추상화가 필요 없으며 요구 사항이 충족되었으므로 YAGNI 원칙에 따라 생성되었습니다.
문제 ..
응용 프로그램의 요구 사항이 변경했으며, Car
충분히 더 이상에만 적용됩니다. SportsCar
과 같은 다른 유형의 자동차가 필요합니다. 또 다른 수준의 추상화가 필요합니다.
문제는 Car
은 구현이없는 추상화 수준에 불과할 때 이미 직접 구현되어 있습니다.
정적 팩토리를 제거 할 수 없거나 코드가 중단됩니다. 그러나 개발자는 더 이상 내 응용 프로그램의 필요성을 충족하지 못하기 때문에 더 이상 Car
의 인스턴스를 만들 수 없어야합니다.
나의 시도 솔루션 ..
그것은 이러한 문제를 해결할 수있는 유일한 방법을 보인다는 주요 재배치를하는 것입니다. 응용 프로그램의 철학이 바뀌 었습니다. 즉 "신선한 시작"이 필요하다는 의미이며이 문제를 해결할 다른 방법은 없습니다. (나는 이것이 사실이 아니라고 희망하고있다)
나는 디폴트 차를 지정할 수 있었다. 나는 기본 차를위한 새로운 (기술적 인) 메소드를 만들어야 할 것이고, 같은 클래스에서 2 개의 메소드가 생길 것이다. 똑같은 일을 (변경없이 텔레 스코프)합니다. 이로 인해 혼란이 생기고 혼란이 생길 수 있습니다. 이는 스케일링에 도움이되지 않습니다.
내 질문 ..
이 주요 재배치없이 해결 될 수있는 문제인가? 그렇지 않다면이 문제를 피하기 위해 어떻게 코드를 구성 할 수 있습니까? YAGNI가 여전히 준수하면서 요구 사항에 대한 그러한 변화를 설명 할 수 있습니까?
라이브러리의 의미가 근본적으로 변경되었습니다. 생성 할 수있는 기본 자동차에 대한 개념이 없으면 (정적 메서드로 인코딩 할 수 있음) 의미 론적 변경을 반영하도록 클라이언트 코드를 업데이트 할 수 밖에 없습니다. –
사용자 측에서 가능한 모든 작업이 가능하지만 사실은 그대로입니다. 일부 고객이 "Car car = Factory.newCar()"; 공장은 지금 SportCar를 돌려 줄 수 있었다. 그러나 고객은 그것을 아직도 "차"라고 부를 것이다. 어쨌든, 클라이언트의 전에는 자동차의 종류에 대해 몰랐다, 그래서 분명히 지금 코드를 업데이 트해야합니다 ... 나는 틀렸어. 아마, 당신은 깨질 클라이언트 코드의 샘플을 포함시킬 수 있습니다. – alexbt
@OliverCharlseworth 앞으로 변경 될 수있는 요구 사항을 가진 애플리케이션에서 피할 수없는 문제라고 말하고 있습니까? –