C # 프로젝트의 클래스 계층을 디자인해야합니다. 기본적으로 클래스 기능은 WinForms 클래스와 유사하므로 WinForms 툴킷을 예로 들어 보겠습니다. (그러나 WinForms 또는 WPF를 사용할 수 없습니다.)
모든 클래스가 제공해야하는 몇 가지 핵심 속성과 기능이 있습니다. 치수, 위치, 색상, 가시성 (true / false), 그리기 방법 등
디자인 조언이 필요합니다. 추상적 인 기본 클래스와 인터페이스는 실제로 유형이 아니지만 동작과 유사한 인터페이스를 사용한 디자인을 사용했습니다. 이것이 좋은 디자인입니까? 그렇지 않은 경우 더 나은 디자인은 무엇입니까?
코드는 다음과 같습니다.
abstract class Control
{
public int Width { get; set; }
public int Height { get; set; }
public int BackColor { get; set; }
public int X { get; set; }
public int Y { get; set; }
public int BorderWidth { get; set; }
public int BorderColor { get; set; }
public bool Visible { get; set; }
public Rectangle ClipRectange { get; protected set; }
abstract public void Draw();
}
일부 컨트롤에는 다른 컨트롤이 포함될 수 있으며 일부는 (자식으로) 포함될 수 있으므로 이러한 기능에 대해 두 개의 인터페이스를 만들려고합니다.
interface IChild
{
IContainer Parent { get; set; }
}
internal interface IContainer
{
void AddChild<T>(T child) where T : IChild;
void RemoveChild<T>(T child) where T : IChild;
IChild GetChild(int index);
}
WinForms는 디스플레이 텍스트를 제어하므로 인터페이스에도 적용됩니다.
interface ITextHolder
{
string Text { get; set; }
int TextPositionX { get; set; }
int TextPositionY { get; set; }
int TextWidth { get; }
int TextHeight { get; }
void DrawText();
}
일부 컨트롤은 부모 컨트롤 안에 도킹 할 수 있습니다.
enum Docking
{
None, Left, Right, Top, Bottom, Fill
}
interface IDockable
{
Docking Dock { get; set; }
}
... 이제 구체적인 클래스를 만들어 봅시다 :
class Panel : Control, IDockable, IContainer, IChild {}
class Label : Control, IDockable, IChild, ITextHolder {}
class Button : Control, IChild, ITextHolder, IDockable {}
class Window : Control, IContainer, IDockable {}
내가 여기서 생각할 수있는 첫 번째 "문제"는 인터페이스가 일단 게시되면 기본적으로 설정되어 있다는 것입니다. 그러나 앞으로 인터페이스를 변경할 필요가 없을 정도로 인터페이스를 양호하게 만들 수 있다고 가정 해 봅시다.
이 디자인에서 또 다른 문제는 이러한 모든 클래스가 인터페이스를 구현해야하며 코드 복제가 빠르게 발생한다는 것입니다. 예를 들어 Label 및 Button에서 DrawText () 메서드는 ITextHolder 인터페이스 또는 자식의 IContainer 관리에서 파생 된 모든 클래스에서 파생됩니다.
이 문제에 대한 나의 해결책은 전용 어댑터에서이 "중복 된"기능을 구현하고 이들에게 호출을 전달하는 것입니다. 따라서 Label과 Button에는 ITextHolder 인터페이스에서 상속 된 메서드 내에서 호출되는 TextHolderAdapter 멤버가 있습니다.
이 디자인은 가상 클래스와 불필요한 "노이즈 코드"로 빠르게 부 풀릴 수있는 기본 클래스의 많은 공통 기능을 갖지 못하게해야한다고 생각합니다. 제어 파생 클래스가 아닌 어댑터를 확장하여 동작 변경을 수행 할 수 있습니다.
나는 이것이 "전략"패턴이라고 생각하며, 그 주제에 대해 수백만 개의 질문과 답변이 있지만,이 디자인에 대해 고려할 사항과 생각할 수있는 결함에 대한 의견을 묻고 자합니다. 내 접근 방식.
향후 요구 사항이 새로운 클래스와 새로운 기능을 요구할 가능성은 거의 100 %라고 덧붙여 야합니다.
IChild
끔찍한 이름처럼 보입니다.
System.ComponentModel.Component
나System.Windows.Forms.Control
또는 기존의 다른 기본 클래스의? 왜 자신 만의 제어 계층을 생성하고이 모든 기능을 처음부터 다시 정의해야합니까?