আমার সি # প্রকল্পের জন্য আমার একটি শ্রেণি শ্রেণিবিন্যাসের নকশা করা দরকার। মূলত, ক্লাসের ক্রিয়াকলাপগুলি উইনফর্মস ক্লাসগুলির সাথে সমান তাই তাই উদাহরণস্বরূপ উইনফর্মস টুলকিটটি নেওয়া যাক। (তবে আমি উইনফর্মস বা ডাব্লুপিএফ ব্যবহার করতে পারি না))
কিছু প্রাথমিক বৈশিষ্ট্য এবং কার্যকারিতা রয়েছে যা প্রতিটি শ্রেণীর সরবরাহ করা প্রয়োজন। মাত্রা, অবস্থান, রঙ, দৃশ্যমানতা (সত্য / মিথ্যা), অঙ্কন পদ্ধতি ইত্যাদি
আমার ডিজাইনের পরামর্শ প্রয়োজন আমি একটি বিমূর্ত বেস ক্লাস এবং ইন্টারফেসগুলির সাথে এমন একটি নকশা ব্যবহার করেছি যা আসলে ধরণের নয় তবে আচরণের মতো। এটি কি ভাল নকশা? যদি না হয় তবে এর চেয়ে আরও ভাল ডিজাইন কী হবে।
কোডটি এর মতো দেখাচ্ছে:
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);
}
উইনফোর্ডস প্রদর্শন পাঠ্য নিয়ন্ত্রণ করে যাতে এটি ইন্টারফেসেও যায়:
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 {}
আমি এখানে প্রথম যে সমস্যাটি ভাবতে পারি তা হ'ল ইন্টারফেসগুলি প্রকাশিত হওয়ার পরে এটি মূলত প্রস্তর স্থাপন করে। তবে আসুন ধরে নেওয়া যাক আমি ভবিষ্যতে তাদের পরিবর্তনগুলির প্রয়োজনীয়তা এড়াতে আমার ইন্টারফেসগুলি যথেষ্ট ভাল করতে সক্ষম হব।
আমি এই ডিজাইনে আরও একটি সমস্যা দেখতে পাচ্ছি যে এই শ্রেণীর প্রত্যেকটিরই তার ইন্টারফেস প্রয়োগ করতে হবে এবং কোডটির নকল দ্রুত ঘটবে। উদাহরণস্বরূপ লেবেল এবং বোতামে ড্র টেক্সট () পদ্ধতিটি আইটেক্সটহোল্ডার ইন্টারফেস থেকে বা শিশুদের আইকনটেনার পরিচালনা থেকে প্রাপ্ত প্রতিটি শ্রেণিতে আসে।
এই ইস্যুটির জন্য আমার সমাধান হ'ল ডেডিকেটেড অ্যাডাপ্টারে এই "নকল" কার্যকারিতা বাস্তবায়ন করা এবং তাদের কাছে কল ফরোয়ার্ড করা। সুতরাং লেবেল এবং বাটন উভয়েরই একটি পাঠ্যহোল্ডার অ্যাডাপ্টার সদস্য থাকবে যা আইটেক্সহোল্ডার ইন্টারফেস থেকে উত্তরাধিকার সূত্রে প্রাপ্ত অভ্যন্তরীণ পদ্ধতিগুলি বলে।
আমি মনে করি এই নকশাটি আমাকে বেস শ্রেণীর অনেকগুলি সাধারণ কার্যকারিতা থেকে রক্ষা করা উচিত যা ভার্চুয়াল পদ্ধতি এবং অপ্রয়োজনীয় "শোর কোড" দিয়ে দ্রুত ফুলে উঠতে পারে। আচরণের পরিবর্তনগুলি অ্যাডাপ্টারগুলি বাড়ানো দ্বারা নিয়ন্ত্রণ করা হবে না কন্ট্রোল-উত্পন্ন ক্লাসগুলি।
আমার মনে হয় এটিকে "কৌশল" প্যাটার্ন বলা হয় এবং যদিও এই বিষয়টিতে লক্ষ লক্ষ প্রশ্ন ও উত্তর রয়েছে, আমি আপনাকে এই নকশার জন্য আমি কী বিবেচনা করছি এবং আপনি কী ত্রুটিগুলি নিয়ে ভাবতে পারেন সে সম্পর্কে আপনার মতামত জানতে চাই আমার পদ্ধতির
আমার যোগ করা উচিত যে প্রায় 100% সম্ভাবনা রয়েছে যা ভবিষ্যতের প্রয়োজনীয়তাগুলি নতুন ক্লাস এবং নতুন কার্যকারিতার জন্য কল করবে।
IChild
একটি ভয়ঙ্কর নাম মত মনে হচ্ছে।
System.ComponentModel.Component
বাSystem.Windows.Forms.Control
অন্য বিদ্যমান বেস ক্লাসগুলির মধ্যে থেকে উত্তরাধিকারী হয় ? আপনার নিজের নিয়ন্ত্রণ স্তরক্রম তৈরি করতে এবং স্ক্র্যাচ থেকে এই সমস্ত ফাংশনগুলি আবার সংজ্ঞায়িত করার প্রয়োজন কেন?