সমান্তরাল শ্রেণিবিন্যাস - আংশিকভাবে একই, আংশিকভাবে পৃথক


12

সেখানে বেশ কয়েকটি অনুরূপ প্রশ্ন রয়েছে 1 ,2 ,3 ,4 , কিন্তু অ এই প্রশ্নে ঠিক তেমনটি মনে হচ্ছে না, সমাধানগুলিও সর্বোত্তম বলে মনে হচ্ছে না।

বহুমুখীতা, জেনেরিকস এবং মিক্সিনগুলি উপলব্ধ বলে ধরে নিলে এটি একটি সাধারণ ওওপি প্রশ্ন। ব্যবহারের জন্য আসল ভাষা হ'ল ওওপি জাভাস্ক্রিপ্ট (টাইপসক্রিপ্ট), তবে এটি জাভা বা সি ++ তে একই সমস্যা।

আমার সমান্তরাল শ্রেণীর শ্রেণিবিন্যাস রয়েছে, যা কখনও কখনও একই আচরণ (ইন্টারফেস এবং বাস্তবায়ন) ভাগ করে দেয় তবে কখনও কখনও প্রত্যেকের নিজস্ব 'সুরক্ষিত' আচরণ থাকে। এর মতো সচিত্র:

3 সমান্তরাল শ্রেণীর শ্রেণিবিন্যাস, কেন্দ্রের কলামটি সাধারণ অংশগুলি দেখায়, বাম কলামটি ক্যানভাস শ্রেণিবদ্ধ এবং ডান কলামে এসভিজি শ্রেণিবিন্যাস দেখায়

এটি কেবল উদাহরণের উদ্দেশ্যে ; এটি আসল শ্রেণীর চিত্র নয়। এটি পড়তে:

  • সাধারণ শ্রেণিবিন্যাসের (কেন্দ্র) যে কোনও কিছুই ক্যানভাস (বাম) এবং এসভিজি (ডান) শ্রেণিবদ্ধ উভয়ের মধ্যে ভাগ করা হয়। ভাগ করে নেওয়ার অর্থ আমি ইন্টারফেস এবং বাস্তবায়ন উভয়ই।
  • কেবলমাত্র বাম বা ডান কলামগুলিতে যে কোনও কিছু অর্থ হায়ারার্কির সাথে নির্দিষ্ট একটি আচরণ (পদ্ধতি এবং সদস্য)। উদাহরণ স্বরূপ:
    • বাম এবং ডান উভয় শ্রেণিবিন্যাসই Viewee.validate()সাধারণ শ্রেণিবিন্যাসে একক পদ্ধতি ( ) হিসাবে দেখানো ঠিক একই বৈধকরণ প্রক্রিয়া ব্যবহার করে isms
    • কেবল ক্যানভাসের শ্রেণিবিন্যাসের একটি পদ্ধতি রয়েছে paint()। এই পদ্ধতিটি সমস্ত বাচ্চাদের রঙের পদ্ধতিটিকে কল করে।
    • এসভিজি হায়ারার্কির addChild()পদ্ধতিটি ওভাররাইড করা দরকার Composite, তবে ক্যানভাস শ্রেণিবিন্যাসের ক্ষেত্রে এটি নয়।
  • উভয় পক্ষের হায়ারারচিগুলি থেকে তৈরি করা মিশ্রণগুলি করা যায় না। একটি কারখানা এটি নিশ্চিত করে।

সমাধান I - উত্তরাধিকার সূত্রপাত

ফওলারের টিজ অ্যাটার হেরিরিটেন্স এখানে কাজটি করে বলে মনে হচ্ছে না, কারণ দুটি সমান্তরালের মধ্যে কিছুটা তফাত আছে।

সমাধান II - মিক্সিনস

আমি বর্তমানে এটিই ভাবতে পারি। দুটি শ্রেণিবিন্যাস পৃথকভাবে বিকশিত হয় তবে প্রতিটি স্তরে ক্লাসগুলি সাধারণ শ্রেণীর সাথে মিশে যায়, যা কোনও শ্রেণিবদ্ধের অংশ নয়। structuralকাঁটাচামচ ছাড়ানো , এরকম দেখতে পাবেন:

আবার তিনটি কলাম, বাম এবং ডান কলামগুলি সমান্তরাল স্তরক্রম, যেখানে প্রতিটি শ্রেণি একটি সাধারণ শ্রেণীর অন্তর্নিহিত।  সাধারণ ক্লাসগুলি শ্রেণিবদ্ধের অংশ নয়

মনে রাখবেন যে প্রতিটি কলামটি তার নিজস্ব নামস্থানে থাকবে, সুতরাং শ্রেণীর নামগুলি বিরোধ করবে না।

প্রশ্নটি

এই পদ্ধতির মাধ্যমে কেউ কি দোষ দেখতে পাবে? এর চেয়ে ভাল সমাধানের কথা কি কেউ ভাবতে পারেন?


অভিযোজ্য বস্তু

এটি কীভাবে ব্যবহার করা হবে তা এখানে কয়েকটি নমুনা কোড is নাম svgস্থানটি এর সাথে প্রতিস্থাপন করা যেতে পারে canvas:

var iView        = document.getElementById( 'view' ),
    iKandinsky   = new svg.Kandinsky(),
    iEpigone     = new svg.Epigone(),
    iTonyBlair   = new svg.TonyBlair( iView, iKandinsky ),
    iLayer       = new svg.Layer(),
    iZoomer      = new svg.Zoomer(),
    iFace        = new svg.Rectangle( new Rect( 20, 20, 100, 60) ),
    iEyeL        = new svg.Rectangle( new Rect( 20, 20, 20, 20) ),
    iEyeR        = new svg.Rectangle( new Rect( 60, 20, 20, 20) );

iKandinsky.setContext( iTonyBlair.canvas.getContext( '2d' ) );
iEpigone.setContext( iTonyBlair.canvas.getContext( '2d' ) );

iFace.addChildren( iEyeL, iEyeR );
iZoomer.setZoom( new Point( 2, 2 ) );
iZoomer.addChild( iFace );
iLayer.addChild( iZoomer );
iTonyBlair.setContent( iLayer );

মূলত, রান-টাইম ক্লায়েন্টগুলিতে ভিউই সাবক্লাসগুলির হায়ারার্কি রচনা করে; তাই ভালো:

স্তর, রেকট, স্ক্রোলার ইত্যাদির মতো বস্তুর শ্রেণিবিন্যাস দেখানো একটি চিত্র

বলুন যে এই সমস্ত ভাইভিজ ক্যানভাস শ্রেণিবদ্ধ, তারা হায়ারার্কি paint()ট্র্যাভ করে প্রতিটি প্রতিবেদককে কল করতে পারে । যদি তারা এসভিজি হায়ারার্কি থেকে থাকে, ভাইয়েরা কীভাবে নিজেকে ডিওমে যুক্ত করতে পারে তা জানেন তবে paint()ট্র্যাভারসাল নেই।



হতে পারে পুরো বৈশিষ্ট্যযুক্ত ডেকোরেটর ডিজাইনের প্যাটার্ন চেষ্টা করুন (এরিক গামা এট এলস, ডিজাইনের প্যাটার্নস)?
জোন

একটি ভাইভিয়া কি? বিশেষ্য (বিশেষণের বিপরীতে) হিসাবে "সমান্তরাল" অর্থ কী?
তুলসিন কর্ডোভা

আপনার একাধিক উত্তরাধিকার আছে?
তুলিনাস কর্ডোভা

ক্যানভাস বা এসভিজি ক্লাসে কি অতিরিক্ত নয় এমন অতিরিক্ত রাজ্য বা ডেটা রয়েছে? আপনি ক্লাস কিভাবে ব্যবহার করবেন? এই হাইয়ারকিগুলি কীভাবে ব্যবহার করা যেতে পারে তা দেখানোর জন্য আপনি কী উদাহরণ উদাহরণ দেখিয়ে যেতে পারেন?
ইউফোরিক

উত্তর:


5

দ্বিতীয় পদ্ধতির ইন্টারফেস পৃথককরণ নীতির অনুসরণ করে ইন্টারফেসগুলি আরও ভালভাবে পৃথক করে।

তবে, আমি একটি পেইন্টেবল ইন্টারফেস যুক্ত করব would

আমি কিছু নাম পরিবর্তন করতে হবে। বিভ্রান্তি তৈরি করার দরকার নেই:

// common

public interface IComposite {
    public void addChild(Composite e);
}

public interface IViewee extends IComposite{
    public void validate();
    public List<IBound> getAbsoluteBouns();
}

public interface IVisual {
    public List<IBound> getBounds();
}

public interface IRec {
}

public interface IPaintable {
    public void paint();
}

// canvas

public interface ICanvasViewee extends IViewee, IPaintable {
}

public interface ICanvasVisual extends IViewee, IVisual {
}

public interface ICanvasRect extends ICanvasVisual, IRec {
}


// SVG

public interface ISVGViewee extends IViewee {
    public void element();
}

public interface ISVGVisual extends IVisual, ISVGViewee {
}

public interface ISVGRect extends ISVGVisual, IRect {
}

আমি মনে করি ইন্টারফেসগুলি এই ক্ষেত্রে সাহায্য করতে পারে। আপনার উত্তরটি কেন হ্রাস পেয়েছে তার কারণগুলি জানতে চাই।
ইউএমএলকেট

ডাউনভোটার নয়, তবে আইএমএইচও
এক্সফোনেনশিয়াল

@ আরনাড "এক্সফোনেনশিয়াল ইন্টারফেস" বলতে কী বোঝ?
তুলিনস কর্ডোভা

@ user61852 ... ঠিক আছে, আসুন আমরা এটির অনেক ইন্টারফেস বলি। "সূচকীয়" আসলে একটি ভুল শব্দ, এটি আরও বেশি "গুণক" এর মতো like এই অর্থে যে আপনার যদি আরও "দিক" (সংমিশ্রিত, চাক্ষুষ, রঙিন ...) এবং আরও বেশি "উপাদান" (ক্যানভাস, এসভিজি ...) থাকে তবে আপনি প্রচুর ইন্টারফেস দিয়ে শেষ করতে পারেন।
ডাগলিনি

@ আরনাউদ আপনার একটি বক্তব্য আছে তবে কমপক্ষে আগে থেকেই একটি নমনীয় নকশা রয়েছে এবং যখন আপনি প্রসারিত করতে বাধ্য হন না তখন ওপি'র উত্তরাধিকারের দুঃস্বপ্নটি সমাধান হয়ে যায়। যদি আপনি চান এবং কোনও চুক্তিযুক্ত শ্রেণিবিন্যাস দ্বারা বাধ্য না হন তবে আপনি কিছু শ্রেণি বাড়িয়ে দিন।
Tulains Cordordova

3

বহুমুখীতা, জেনেরিকস এবং মিক্সিনগুলি উপলব্ধ বলে ধরে নিলে এটি একটি সাধারণ ওওপি প্রশ্ন। ব্যবহারের জন্য আসল ভাষা হ'ল ওওপি জাভাস্ক্রিপ্ট (টাইপসক্রিপ্ট), তবে এটি জাভা বা সি ++ তে একই সমস্যা।

এটি আসলে মোটেও সত্য নয়। টাইপস্ক্রিপ্ট জাভা-এর চেয়ে স্ট্রাকচারাল টাইপিংয়ের তুলনায় যথেষ্ট সুবিধা রয়েছে। আপনি হাঁসের টাইপযুক্ত টেম্পলেটগুলির সাথে সি ++ তে অনুরূপ কিছু করতে পারেন তবে এটি অনেক বেশি প্রচেষ্টা।

মূলত, আপনার ক্লাসগুলি সংজ্ঞায়িত করুন, তবে কোনও ইন্টারফেসগুলি প্রসারিত বা সংজ্ঞায়িত করবেন না। তারপরে আপনার প্রয়োজনীয় ইন্টারফেসটি কেবল সংজ্ঞায়িত করুন এবং এটি প্যারামিটার হিসাবে গ্রহণ করুন। তারপরে, বস্তুগুলি সেই ইন্টারফেসটির সাথে মেলে- এটি আগে থেকে প্রসারিত করার জন্য তাদের জানতে হবে না। প্রতিটি ফাংশন হুবহু এবং কেবল বিটগুলি প্রকাশ করতে পারে যেগুলি তারা বিষ্ঠা দেয় এবং কম্পাইলার আপনাকে চূড়ান্ত প্রকারটি পূরণ করে তবে আপনাকে একটি পাস দেয়, যদিও ক্লাসগুলি প্রকৃতপক্ষে স্পষ্টভাবে ইন্টারফেসগুলি প্রসারিত করে না।

এটি আপনাকে একটি ইন্টারফেস শ্রেণিবিন্যাসকে সংজ্ঞায়িত করার প্রয়োজন থেকে মুক্ত করে এবং কোন ইন্টারফেসগুলি কোন শ্রেণীর প্রসারিত করা উচিত তা নির্ধারণ করে।

প্রতিটি ক্লাসটি কেবল সংজ্ঞায়িত করুন এবং ইন্টারফেসগুলি সম্পর্কে ভুলে যান- কাঠামোগত টাইপিং এটির যত্ন নেবে।

উদাহরণ স্বরূপ:

class SVGViewee {
    validate() { /* stuff */ }
    addChild(svg: SVG) { /* stuff */ }
}
class CanvasViewee {
    validate() { /* stuff */ }
    paint() { /* stuff */ }
}
interface SVG {
    addChild: { (svg: SVG): void };
}
f(viewee: { validate: { (): boolean }; }) {
    viewee.validate();
}
g(svg: SVG) {
    svg.addChild(svg);
}
h(canvas: { paint: { (): void }; }) {
    canvas.paint();
}
f(SVGViewee());
f(CanvasViewee());
g(SVGViewee());
h(CanvasViewee());

এটি সম্পূর্ণ বৈধ টাইপসক্রিপ্ট। লক্ষ্য করুন যে গ্রাহক কার্যগুলি ক্লাসগুলির সংজ্ঞায় ব্যবহৃত বেস ক্লাস বা ইন্টারফেসগুলি সম্পর্কে একক ছিটে বা জানে না।

উত্তরাধিকার অনুসারে ক্লাসগুলি সম্পর্কিত কিনা তা বিবেচনা করে না। তারা আপনার ইন্টারফেসটি বাড়িয়েছে কিনা তাতে কিছু আসে যায় না। কেবলমাত্র ইন্টারফেসটিকে প্যারামিটার হিসাবে সংজ্ঞায়িত করুন, এবং আপনি শেষ করেছেন - এটির সাথে মিলিত সমস্ত ক্লাস গ্রহণ করা হয় are


এটি আশাব্যঞ্জক বলে মনে হচ্ছে তবে আমি প্রস্তাবটি সত্যই বুঝতে পারি না (দুঃখিত, সম্ভবত খুব বেশি ওওপিওর পক্ষপাতিত্ব)। সম্ভবত আপনি কিছু কোড উদাহরণ শেয়ার করতে পারেন? উদাহরণ হিসেবে বলা যায়, উভয় svg.Viewee এবং canvas.Viewee প্রয়োজন validate()পদ্ধতি (যা বাস্তবায়নের উভয়ের জন্য অভিন্ন); তারপর শুধুমাত্র svg.Viewee ওভাররাইড করার প্রয়োজন addChild () , যখন শুধুমাত্র canvas.Viewee প্রয়োজন পেইন্ট () (যা কল রং () সব শিশুদের উপর - যা বেস এর একজন সদস্য কম্পোজিট বর্গ)। সুতরাং আমি স্ট্রাকচারাল টাইপিং দিয়ে সত্যিই এটি কল্পনা করতে পারি না।
ইজাকি

আপনি পুরো বিষয়টি নিয়ে বিবেচনা করছেন যা পুরোপুরি এই ক্ষেত্রে গুরুত্বপূর্ণ নয় matter
ডেড এমজি

সুতরাং সম্ভবত উত্তরটি মোটেও পেলাম না। বিস্তারিত বললে ভাল লাগবে nice
ইজাকি

আমি একটি সম্পাদনা করেছি। তল লাইনটি হ'ল বেস ক্লাসগুলি একেবারেই অপ্রাসঙ্গিক এবং কেউ তাদের যত্ন করে না। এগুলি কেবল একটি বাস্তবায়নের বিশদ।
ডেডএমজি

1
ঠিক আছে. এটি জ্ঞান করা শুরু হয়। ক) হাঁসের টাইপিং কী তা আমি জানি। খ) আমি নিশ্চিত নই কেন এই উত্তরটিতে ইন্টারফেসগুলি কেন এত কেন্দ্রীয় - শ্রেণীর ভাঙ্গন সাধারণ আচরণ ভাগ করে নেওয়ার পক্ষে, আপনি আপাতত নিরাপদে ইন্টারফেস উপেক্ষা করতে পারবেন। গ) আপনার উদাহরণটিতে বলুন SVGViewee.addChild(), তবে CanvasVieweeএকই বৈশিষ্ট্যটিও প্রয়োজন। সুতরাং আমার কাছে বোঝা যাচ্ছে যে উভয়ই সংমিশ্রিত থেকে অন্তর্নিহিত?
ইজাকি

3

সংক্ষিপ্ত বিবরণ

সমাধান 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 কে কখনও কখনও "প্যারালাল হায়ারার্কি" ডিজাইন প্যাটার্ন বা "ডুয়াল হায়ারার্কি" ডিজাইন প্যাটার্ন বলা হয়।

অনেক বিকাশকারী / ডিজাইনার এটির সাথে একমত হবে না এবং বিশ্বাস করে এটির অস্তিত্ব থাকা উচিত নয়। তবে, আমি আপনার প্রশ্নের একটির মতো, সমস্যাগুলির সাধারণ সমাধান হিসাবে ভুল এবং অন্য বিকাশকারীদের দ্বারা ব্যবহার করেছি।

আর একটি গায়েবি জিনিস। আপনার পূর্ববর্তী সমাধানগুলিতে মূল সমস্যাটি "মিক্সিনস" বা "ইন্টারফেস" ব্যবহার করা নয়, প্রথমে আপনার ক্লাসগুলির মডেলটি পরিমার্জন করার জন্য এবং পরে বিদ্যমান প্রোগ্রামিং ভাষার বৈশিষ্ট্যটি ব্যবহার করতে হয়েছিল।


খুব পূর্ণ উত্তরের জন্য ধন্যবাদ। আমি মনে করি আমি এটি ঠিকঠাক বুঝতে পেরেছি, সুতরাং আমাকে এটি জিজ্ঞাসা করুন: canvas.vieweeএবং এর সমস্ত বংশধরদের একটি পদ্ধতি বলা দরকার paint()। আমরাও commonনা svgশ্রেণীর এটি প্রয়োজন। তবে আপনার সমাধানে, শ্রেণিবিন্যাসটি আমার সলিউশনে commonনয়, canvasবা এর svgমতোই রয়েছে So সুতরাং সেখানে কোনও উত্তরাধিকার না থাকলে paint()সমস্ত মহকুমায় ঠিক কীভাবে শেষ canvas.vieweeহয়?
ইজ্জাকি

@ ইজাকি দুঃখিত, আমার উত্তরে কয়েকটি বাগ থাকলে। তারপরে paint()"ক্যানভাস :: ভিউইউই" তে সরানো বা ঘোষণা করা উচিত। সাধারণ প্যাটার্নের ধারণাটি স্থির থাকে, তবে কিছু সদস্যের স্থানান্তরিত বা পরিবর্তিত হতে পারে।
umlcat

ঠিক আছে, সুতরাং সাবক্ল্যাসগুলি কীভাবে এটি পায়, যদি না থেকে নেওয়া হয় canvas::viewee?
ইজাকি

আপনার আসকি শিল্প তৈরি করতে আপনি কি কোনও সরঞ্জাম ব্যবহার করেছেন? (আমি নিশ্চিত না যে বিন্দুগুলি আসলে এটির পক্ষে সহায়তা করে it's)
অ্যারন হল

1

সি ++ তে দ্বৈত উত্তরাধিকার হায়ারারচিজ নিয়ে কাজ করার জন্য ডিজাইন প্যাটার্নস শিরোনামের একটি নিবন্ধে , আঙ্কেল বব স্টেইরওয়ে টু হেভেন নামে একটি সমাধান উপস্থাপন করেছেন । এটি উদ্দেশ্য অভিহিত:

এই নিদর্শনটি উত্তরাধিকারের সম্পর্কের নেটওয়ার্কের বর্ণনা দেয় যা একটি প্রদত্ত শ্রেণিবদ্ধতা পুরোপুরি, অন্য শ্রেণীর সাথে মানিয়ে নিতে হবে।

এবং চিত্রটি সরবরাহ করা হয়েছে:

দুটি সমান্তরাল উত্তরাধিকার কাঠামো সহ একটি বর্গ ডায়াগ্রাম, যেখানে ডানদিকে প্রতিটি বর্গটিও তার বামদিকে যমজ শ্রেণী থেকে কার্যত অন্তর্নিহিত।  বাম শ্রেণিবদ্ধ এছাড়াও পুরোপুরি ভার্চুয়াল উত্তরাধিকারের উপর ভিত্তি করে

যদিও সমাধান 2 তে ভার্চুয়াল উত্তরাধিকার নেই, এটি স্টেইরওয়ে থেকে স্বর্গের প্যাটার্নের সাথে সামঞ্জস্যপূর্ণ । সুতরাং সমাধান 2 এই সমস্যার পক্ষে যুক্তিসঙ্গত বলে মনে হচ্ছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.