সংক্ষিপ্ত বিবরণ
সমাধান 3: "সমান্তরাল শ্রেণি স্তরক্রম" সফ্টওয়্যার ডিজাইন প্যাটার্নটি আপনার বন্ধু friend
দীর্ঘ প্রসারিত উত্তর
আপনার নকশা শুরু ডান। এটি অনুকূলিত করা যেতে পারে, কিছু শ্রেণি বা সদস্যকে সরিয়ে দেওয়া যেতে পারে, তবে, "সমান্তরাল শ্রেণিবিন্যাস" ধারণাটি আপনি কোনও সমস্যার সমাধানের জন্য প্রয়োগ করছেন এটি সঠিক IS
সাধারণত নিয়ন্ত্রণ স্তরক্রমের ক্ষেত্রে একই ধারণাটির সাথে একাধিকবার ডিল করেছেন।
কিছুক্ষণ পরে, আমি অন্যান্য বিকাশকারীদের চেয়ে একই সমাধান শেষ করেছি, যেটিকে কখনও কখনও "প্যারালাল হায়ারার্কি" ডিজাইন প্যাটার্ন বা "দ্বৈত শ্রেণিবদ্ধ" ডিজাইন প্যাটার্ন বলা হয় called
(1) আপনি কি কখনও একক শ্রেণিকে বিভাগের একক শ্রেণিবিন্যাসে বিভক্ত করেছেন?
(২) শ্রেণিবিন্যাস ছাড়া আপনি কি কখনও একক শ্রেণিকে বিভিন্ন শ্রেণিতে বিভক্ত করেছেন?
আপনি যদি পূর্ববর্তী সমাধানগুলি পৃথকভাবে প্রয়োগ করেন তবে সেগুলি কিছু সমস্যা সমাধানের একটি উপায়।
তবে, যদি আমরা এই দুটি সমাধান একসাথে একত্রিত করি?
তাদের একত্রিত করুন, এবং, আপনি এই "ডিজাইন প্যাটার্ন" পাবেন।
বাস্তবায়ন
এখন, আসুন আপনার ক্ষেত্রে "প্যারালাল ক্লাস হায়ারার্কি" সফ্টওয়্যার ডিজাইন প্যাটার্নটি প্রয়োগ করি।
আপনার কাছে বর্তমানে ক্লাসগুলির 2 বা ততোধিক স্বতন্ত্র শ্রেণিবিন্যাস রয়েছে, যা খুব মিল, একই রকম সমিতি বা বেগুনী ঘর রয়েছে, একই বৈশিষ্ট্য বা পদ্ধতি রয়েছে।
আপনি সদৃশ কোড বা সদস্য ("ধারাবাহিকতা") এড়াতে চান, তবুও আপনি এই ক্লাসগুলির মধ্যে পার্থক্যের কারণে সরাসরি একটিতে মার্জ করতে পারবেন না।
সুতরাং, আপনার শ্রেণিবিন্যাসগুলি এই চিত্রের সাথে খুব মিল, তবে, এখনও একের বেশি রয়েছে:
................................................
...............+----------------+...............
...............| Common:: |...............
...............| Composite |...............
...............+----------------+...............
...............| ... |...............
...............+-------+--------+...............
.......................|........................
.......................^........................
....................../.\.......................
.....................+-+-+......................
.......................|........................
...............+-------+--------+...............
...............| Common:: |...............
...............| Viewee |...............
...............+----------------+...............
...............| ... |...............
...............+-------+--------+...............
.......................|........................
.......................^........................
....................../.\.......................
.....................+-+-+......................
.......................|........................
..........+------------+------------+...........
..........|.........................|...........
..+-------+--------+........+-------+--------+..
..| Common:: |........| Common:: |..
..| Visual |........| Structural |..
..+----------------+........+----------------+..
..| ... |........| ... |..
..+----------------+........+----------------+..
................................................
Figure 1
এটিতে এখনও শংসাপত্রিত নয়, ডিজাইন প্যাটার্ন, সভার সিলার হিরিচর্জি, মার্জ করা হয়, একটি একক হিরিচর্চার মধ্যে রয়েছে এবং প্রতিটি ভাগ বা সাধারণ শ্রেণি সাবক্লাসিং দ্বারা বাড়ানো হয়।
দ্রষ্টব্য, এই সমাধানটি জটিল, কারণ আপনি ইতিমধ্যে বেশ কয়েকটি শ্রেণিবিন্যাস নিয়ে কাজ করছেন, অতএব এটি একটি জটিল দৃশ্য।
1 রুট ক্লাস
প্রতিটি শ্রেণিবিন্যাসে একটি ভাগ করা "রুট" শ্রেণি রয়েছে।
আপনার ক্ষেত্রে, প্রতিটি শ্রেণিবিন্যাসের জন্য একটি স্বতন্ত্র "কম্পোজিট" শ্রেণি রয়েছে, যাতে কিছু অনুরূপ বৈশিষ্ট্য এবং কিছু অনুরূপ পদ্ধতি থাকতে পারে।
এই সদস্যদের মধ্যে কয়েকজনকে একীভূত করা যেতে পারে, তাদের মধ্যে কিছু সদস্য একীভূত করা যায় না।
সুতরাং, একজন বিকাশকারী কী করতে পারে তা হল একটি বেসের মূল শ্রেণি তৈরি করা এবং প্রতিটি শ্রেণিবিন্যাসের সমতুল্য কেস সাবক্লাস করা।
চিত্র 2-এ, আপনি কেবল এই শ্রেণীর জন্য একটি চিত্র দেখতে পাচ্ছেন, যেখানে প্রতিটি শ্রেণি এটি নাম রাখে।
সদস্য, এখনই বাদ দেওয়া হয়।
................................................
...............+-------+--------+...............
...............| Common:: |...............
...............| Composite |...............
...............+----------------+...............
...............| ... |...............
...............+-------+--------+...............
.......................|........................
.......................^........................
....................../.\.......................
.....................+-+-+......................
.......................|........................
..........+------------+------------+...........
..........|.........................|...........
..+-------+--------+........+-------+--------+..
..| Canvas:: |........| SVG:: |..
..| Composite |........| Composite |..
..+----------------+........+----------------+..
..| ... |........| ... |..
..+----------------+........+----------------+..
................................................
Figure 2
হিসাবে আপনি লক্ষ করতে পারেন, প্রতিটি "কমপোজাইট" সংঘর্ষ আর পৃথক শ্রেণিবিন্যাসে থাকে না, তবে একক ভাগ বা সাধারণ শ্রেণিবিন্যাসে একীভূত হয়।
তারপরে, আসুন সদস্যগুলি যোগ করুন, যা একই রকম, তাদের সুপারক্লাসে স্থানান্তরিত করা যেতে পারে এবং যা প্রতিটি পৃথক শ্রেণিতে আলাদা class
এবং যেমন আপনি ইতিমধ্যে জানেন, "ভার্চুয়াল" বা "ওভারলোডেড" পদ্ধতিগুলি বেস শ্রেণিতে সংজ্ঞায়িত করা হয়, তবে, সাবক্লাসে প্রতিস্থাপন করা হয়। চিত্র 3 এর মতো।
................................................
.............+--------------------+.............
.............| Common:: |.............
.............| Composite |.............
.............+--------------------+.............
.............| [+] void AddChild()|.............
.............+---------+----------+.............
.......................|........................
.......................^........................
....................../.\.......................
.....................+-+-+......................
.......................|........................
..........+------------+------------+...........
..........|.........................|...........
..+-------+--------+........+-------+--------+..
..| Canvas:: |........| SVG:: |..
..| Composite |........| Composite |..
..+----------------+........+----------------+..
..| ... |........| ... |..
..+----------------+........+----------------+..
................................................
Figure 3
মনে রাখবেন যে সদস্যবিহীন কিছু ক্লাস থাকতে পারে এবং আপনাকে এই ক্লাসগুলি সরিয়ে দেওয়ার প্রলোভন থাকতে পারে, ডান্ট করুন। এগুলিকে "খালি ক্লাস", "এনুমারেটিভ ক্লাস" এবং অন্যান্য নাম বলা হয়।
2 সাবক্ল্যাস
প্রথম চিত্রটিতে ফিরে যাওয়া যাক। প্রতিটি "সমন্বিত" শ্রেণীর প্রতিটি স্তরের একটি "ভিউই" সাবক্লাস ছিল।
প্রক্রিয়া প্রতিটি শ্রেণীর জন্য পুনরাবৃত্তি হয়। চিত্র 4 এর চেয়ে দ্রষ্টব্য, "প্রচলিত :: ভিউই" শ্রেণিটি "কমন :: কম্পোজিট" থেকে নেমেছে, তবে, সরলতার জন্য, "প্রচলিত :: যৌগিক" শ্রেণিটি চিত্র থেকে বাদ দেওয়া হয়েছে।
................................................
.............+--------------------+.............
.............| Common:: |.............
.............| Viewee |.............
.............+--------------------+.............
.............| ... |.............
.............+---------+----------+.............
.......................|........................
.......................^........................
....................../.\.......................
.....................+-+-+......................
.......................|........................
..........+------------+------------+...........
..........|.........................|...........
..+-------+--------+........+-------+--------+..
..| Canvas:: |........| SVG:: |..
..| Viewee |........| Viewee |..
..+----------------+........+----------------+..
..| ... |........| ... |..
..+----------------+........+----------------+..
................................................
Figure 4
আপনি খেয়াল করবেন, যে "ক্যানভাস :: ভিউই" এবং "এসভিজি :: ভিউই" এর তুলনায় তার "কমপোজিট" থেকে খুব বেশি সময় নেমে আসে না, বরং এর পরিবর্তে সাধারণ "সাধারণ :: ভিউই" থেকে আসে।
আপনি এখন সদস্যদের যোগ করতে পারেন।
......................................................
.........+------------------------------+.............
.........| Common:: |.............
.........| Viewee |.............
.........+------------------------------+.............
.........| [+] bool Validate() |.............
.........| [+] Rect GetAbsoluteBounds() |.............
.........+-------------+----------------+.............
.......................|..............................
.......................^..............................
....................../.\.............................
.....................+-+-+............................
.......................|..............................
..........+------------+----------------+.............
..........|.............................|.............
..+-------+---------+........+----------+----------+..
..| Canvas:: |........| SVG:: |..
..| Viewee |........| Viewee |..
..+-----------------+........+---------------------+..
..| |........| [+] Viewee Element |..
..+-----------------+........+---------------------+..
..| [+] void Paint()|........| [+] void addChild() |..
..+-----------------+........+---------------------+..
......................................................
Figure 5
3 প্রক্রিয়া পুনরাবৃত্তি
প্রক্রিয়াটি অব্যাহত থাকবে, প্রতিটি শ্রেণীর জন্য, "ক্যানভাস :: ভিজ্যুয়াল" "ক্যানভাস :: ভিউই" থেকে নেমে আসবে না, "কমন্স :: ভিজ্যুয়াল", "ক্যানভাস :: স্ট্রাকচারাল" থেকে "ক্যানভাস :: ভিউই" নামবে না ", কমন্স :: স্ট্রাকচারাল" থেকে বাইট এবং আরও কিছু।
4 ডি হায়ারার্কি ডায়াগ্রাম
আপনি উপরের স্তরটিতে কয়েকটি স্তর সহ একটি 3 ডি ডায়াগ্রাম সাজানোর কাজ শেষ করবেন, "সাধারণ" শ্রেণিবিন্যাস এবং নীচের স্তরগুলিতে রয়েছে প্রতিটি অতিরিক্ত স্তরক্রম রয়েছে।
আপনার আসল স্বতন্ত্র শ্রেণীর শ্রেণিবিন্যাস, যেখানে এটির মতো কিছু রয়েছে (চিত্র 6):
.................................................
..+-----------------+.......+-----------------+..
..| Common:: |.......| SVG:: |..
..| Composite |.......| Composite |..
..+-----------------+.......+-----------------+..
..| ... |.......| ... |..
..+--------+--------+.......+--------+--------+..
...........|.........................|...........
...........^.........................^...........
........../.\......................./.\..........
.........+-+-+.....................+-+-+.........
...........|.........................|...........
..+--------+--------+.......+--------+--------+..
..| Common:: |.......| SVG:: |..
..| Viewee |.......| Viewee |..
..+-----------------+.......+-----------------+..
..| ... |.......| ... |..
..+--------+--------+.......+--------+--------+..
...........|.........................|...........
...........^.........................^...........
........../.\......................./.\..........
.........+-+-+.....................+-+-+.........
...........|.........................|...........
..+--------+--------+.......+--------+--------+..
..| Common:: |.......| SVG:: |..
..| Visual |.......| Visual |..
..+-----------------+.......+-----------------+..
..| ... |.......| ... |..
..+--------+--------+.......+--------+--------+..
...........|.........................|...........
...........^.........................^...........
........../.\......................./.\..........
.........+-+-+.....................+-+-+.........
...........|.........................|...........
..+--------+--------+.......+--------+--------+..
..| Common:: |.......| SVG:: |..
..| Rect |.......| Rect |..
..+-----------------+.......+-----------------+..
..| ... |.......| ... |..
..+-----------------+.......+-----------------+..
.................................................
Figure 6
নোট করুন যে কিছু শ্রেণি বাদ দেওয়া হয়েছে, এবং পুরো "ক্যানভাস" হায়ারার্কি বাদ দেওয়া হয়েছে, সরলতার জন্য।
চূড়ান্ত ইন্টিগ্রেটেড শ্রেণীর শ্রেণিবিন্যাস এর সাথে কিছু মিল হতে পারে:
.................................................
..+-----------------+.../+..+-----------------+..
..| Common:: +--<.+--+ SVG:: |..
..| Composite |...\+..| Composite |..
..+-----------------+.......+-----------------+..
..| ... |.......| ... |..
..+--------+--------+.......+-----------------+..
...........|.....................................
...........^.....................................
........../.\....................................
.........+-+-+...................................
...........|.....................................
..+--------+--------+.../+..+-----------------+..
..| Common:: +--<.+--+ SVG:: |..
..| Viewee |...\+..| Viewee |..
..+-----------------+.......+-----------------+..
..| ... |.......| ... |..
..+--------+--------+.......+-----------------+..
...........|.....................................
...........^.....................................
........../.\....................................
.........+-+-+...................................
...........|.....................................
..+--------+--------+.../+..+-----------------+..
..| Common:: +--<.+--+ SVG:: |..
..| Visual |...\+..| Visual |..
..+-----------------+.......+-----------------+..
..| ... |.......| ... |..
..+--------+--------+.......+-----------------+..
...........|.....................................
...........^.....................................
........../.\....................................
.........+-+-+...................................
...........|.....................................
..+--------+--------+.../+..+-----------------+..
..| Common:: +--<.+--+ SVG:: |..
..| Rect |...\+..| Rect |..
..+-----------------+.......+-----------------+..
..| ... |.......| ... |..
..+-----------------+.......+-----------------+..
.................................................
Figure 7
নোট করুন যে কিছু শ্রেণি বাদ দেওয়া হয়েছে, এবং পুরো "ক্যানভাস" ক্লাস বাদ দেওয়া হয়েছে, সরলভাবে জন্য, তবে, "এসভিজি" শ্রেণীর অনুরূপ হবে।
"সাধারণ" শ্রেণিগুলি একটি 3 ডি চিত্রের একক স্তর, অন্য স্তরে "এসভিজি" শ্রেণি এবং তৃতীয় স্তরে "ক্যানভাস" শ্রেণি হিসাবে উপস্থাপিত হতে পারে।
পরীক্ষা করুন যে প্রতিটি স্তরটি প্রথম স্তরের সাথে সম্পর্কিত, যার মধ্যে প্রতিটি শ্রেণীর "সাধারণ" শ্রেণিবিন্যাসের পিতামাতার শ্রেণি রয়েছে।
কোড বাস্তবায়নের জন্য আপনার প্রোগ্রামিং ল্যাঙ্গুয়েজ কী সমর্থন করে তার উপর নির্ভর করে ইন্টারফেস উত্তরাধিকার, শ্রেণি উত্তরাধিকার বা "মিক্সিন" ব্যবহার করতে পারে require
সারসংক্ষেপ
যে কোনও প্রোগ্রামিং সলিউশন হিসাবে, অপ্টিমাইজেশানের দিকে তাড়াহুড়া করবেন না, অপ্টিমাইজেশন খুব গুরুত্বপূর্ণ, তবুও, একটি খারাপ অপ্টিমাইজেশন, মূল সমস্যার চেয়ে বড় সমস্যা হতে পারে।
আমি "সমাধান 1" বা "সমাধান 2" প্রয়োগ করার পরামর্শ দিই না।
"সমাধান 1" তে প্রয়োগ হয় না, কারণ, উত্তরাধিকার, প্রতিটি ক্ষেত্রেই প্রয়োজনীয়।
"সলিউশন 2", "মিক্সিনস" প্রয়োগ করা যেতে পারে তবে ক্লাস এবং হায়ারারচি ডিজাইনের পরে।
মিশিনস, ইন্টারফেস-ভিত্তিক উত্তরাধিকার, বা শ্রেণিভিত্তিক একাধিক উত্তরাধিকারের বিকল্প।
আমার প্রস্তাবিত সলিউশন 3 কে কখনও কখনও "প্যারালাল হায়ারার্কি" ডিজাইন প্যাটার্ন বা "ডুয়াল হায়ারার্কি" ডিজাইন প্যাটার্ন বলা হয়।
অনেক বিকাশকারী / ডিজাইনার এটির সাথে একমত হবে না এবং বিশ্বাস করে এটির অস্তিত্ব থাকা উচিত নয়। তবে, আমি আপনার প্রশ্নের একটির মতো, সমস্যাগুলির সাধারণ সমাধান হিসাবে ভুল এবং অন্য বিকাশকারীদের দ্বারা ব্যবহার করেছি।
আর একটি গায়েবি জিনিস। আপনার পূর্ববর্তী সমাধানগুলিতে মূল সমস্যাটি "মিক্সিনস" বা "ইন্টারফেস" ব্যবহার করা নয়, প্রথমে আপনার ক্লাসগুলির মডেলটি পরিমার্জন করার জন্য এবং পরে বিদ্যমান প্রোগ্রামিং ভাষার বৈশিষ্ট্যটি ব্যবহার করতে হয়েছিল।