Saya perlu merancang hierarki kelas untuk proyek C # saya. Pada dasarnya, fungsi kelas mirip dengan kelas WinForms jadi mari kita ambil toolkit WinForms sebagai contoh. (Namun, saya tidak bisa menggunakan WinForms atau WPF.)
Ada beberapa sifat dan fungsi inti yang perlu disediakan oleh setiap kelas. Dimensi, posisi, warna, visibilitas (benar / salah), metode Draw, dll.
Saya memerlukan saran desain. Saya telah menggunakan desain dengan kelas dasar abstrak dan antarmuka yang tidak benar-benar tipe tetapi lebih seperti perilaku. Apakah ini desain yang bagus? Jika tidak, apa yang akan menjadi desain yang lebih baik.
Kode ini terlihat seperti ini:
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();
}
Beberapa Kontrol dapat berisi Kontrol lainnya, beberapa hanya dapat berisi (sebagai anak-anak) jadi saya berpikir untuk membuat dua antarmuka untuk fungsi-fungsi ini:
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 mengontrol tampilan teks sehingga ini juga masuk ke antarmuka:
interface ITextHolder
{
string Text { get; set; }
int TextPositionX { get; set; }
int TextPositionY { get; set; }
int TextWidth { get; }
int TextHeight { get; }
void DrawText();
}
Beberapa Kontrol dapat dimasukkan ke dalam Kontrol induknya sehingga:
enum Docking
{
None, Left, Right, Top, Bottom, Fill
}
interface IDockable
{
Docking Dock { get; set; }
}
... dan sekarang mari kita buat beberapa kelas konkret:
class Panel : Control, IDockable, IContainer, IChild {}
class Label : Control, IDockable, IChild, ITextHolder {}
class Button : Control, IChild, ITextHolder, IDockable {}
class Window : Control, IContainer, IDockable {}
"Masalah" pertama yang bisa saya pikirkan di sini adalah bahwa antarmuka pada dasarnya diatur setelah mereka dipublikasikan. Tetapi mari kita asumsikan saya akan dapat membuat antarmuka saya cukup baik untuk menghindari kebutuhan membuat perubahan pada mereka di masa depan.
Masalah lain yang saya lihat dalam desain ini adalah bahwa setiap kelas ini perlu mengimplementasikan antarmuka itu dan duplikasi kode akan segera terjadi. Misalnya dalam Label dan Tombol metode DrawText () berasal dari antarmuka ITextHolder atau di setiap kelas yang berasal dari manajemen anak IContainer.
Solusi saya untuk masalah ini adalah mengimplementasikan fungsionalitas "duplikat" ini dalam adaptor khusus dan meneruskan panggilan kepada mereka. Jadi baik Label dan Tombol akan memiliki anggota TextHolderAdapter yang akan disebut metode di dalam yang diwarisi dari antarmuka ITextHolder.
Saya pikir desain ini harus melindungi saya dari keharusan memiliki banyak fungsi umum di kelas dasar yang dapat dengan cepat membengkak dengan metode virtual dan "kode noise" yang tidak perlu. Perubahan perilaku akan dilakukan dengan memperluas adaptor dan bukan kelas yang diturunkan dari Kontrol.
Saya pikir ini disebut pola "Strategi" dan meskipun ada jutaan pertanyaan dan jawaban tentang topik itu, saya ingin meminta pendapat Anda tentang apa yang saya pertimbangkan untuk desain ini dan kekurangan apa yang dapat Anda pikirkan di pendekatan saya.
Saya harus menambahkan bahwa ada kemungkinan hampir 100% bahwa persyaratan di masa depan akan membutuhkan kelas baru dan fungsi baru.
IChild
sepertinya nama yang mengerikan.
System.ComponentModel.Component
atauSystem.Windows.Forms.Control
dari kelas dasar yang ada? Mengapa Anda perlu membuat hierarki kontrol Anda sendiri dan mendefinisikan semua fungsi ini lagi dari awal?