사용자가 제공 한 마우스 데이터를 기반으로 기하학적 인 도형을 그리는 간단한 프로그램이 있습니다. 마우스 추적을 처리하는 클래스 (마우스 이동 기록으로 List를 가져옴)와 추상 클래스 인 Shape를 처리했습니다. 이 클래스에서 Circle, Rectangle 등과 같은 몇 가지 추가 도형을 파생시킵니다. 그리고 그 각각은 추상 Draw() 함수를 재정의합니다.과거의 폐가 원칙을 얻는 방법
모두 잘 작동하지만 원하는 모양을 수동으로 전환 할 수있게하려는 경우 문제가 발생합니다. 마우스 데이터를 얻었고 어떤 모양을 그려야하는지 알았습니다. 문제는 코드를 만들어야하는 객체를 "알"수있는 코드를 작성하고 적절한 매개 변수를 생성자에 전달하는 것입니다. 이 시점에서 새로운 Shape 파생물을 추가하는 것은 불가능합니다. 이는 맹렬히 잘못되었습니다. 내가 obiously 같은 코드로 나올 싶지 않아
:
List<Shape> Shapes = new List<Shape>();
// somwhere later
if(CurrentShape == "polyline"){
Shapes.Add(new Polyline(Points));
}
else if (CurrentShape == "rectangle"){
Shapes.Add(new Rectangle(BeginPoint, EndPoint));
}
// and so on.
명확하게 위의 코드는 오픈 폐쇄 원칙을 vilates. 문제는 그것을 극복하는 좋은 아이디어가 없다는 것입니다. 가장 큰 문제는 다른 모양의 에는 다른 매개 변수를 가진 생성자가 있기 때문에 훨씬 더 번거로운 점입니다.
저는 이것이 일반적인 문제라고 확신합니다. 그러나 나는 그것을 과거에 얻는 방법을 모르겠습니다. 아이디어가 있습니까?
"공개 된 원칙"이 아닙니다. 그것은 단지 다형성입니다. –
글쎄, 셰이프 클래스 코드를 에디션 용으로 닫고 확장을 위해 열어서 OCP 문제와 일치한다고 생각합니다. –
당신이 진실하길 바랄뿐 아니라, 그렇지 않습니다! –