ডিজাইন: পিতামাতার ক্লাসে ফিরে ফোন করা


13

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

  1. প্যারেন্ট ক্লাসকে বিশ্বব্যাপী করুন তাই শিশু অবজেক্টগুলি প্যারেন্ট অবজেক্টের সদস্য ফাংশনগুলিতে কল করতে সক্ষম হবে।

  2. প্রতিটি শিশু অবজেক্টে প্যারেন্ট অবজেক্টটিকে একটি, পয়েন্টার বা রেফারেন্স হিসাবে ইনজেক্ট করুন। তারপরে বাচ্চাকে যখন পিতামাতাকে কিছু বলতে হবে, এটি সর্বদা এটি করতে পারে কারণ এটির একটি সদস্য পরিবর্তনশীল রয়েছে যা এটি ব্যবহার করতে পারে।

এটি করার অন্যান্য পদ্ধতিগুলি কী কী? এই ধরণের জিনিসটির জন্য কি সাধারণ নকশার প্যাটার্ন বা নাম রয়েছে?

নোট করুন যে আমি সি ++ তে আইডিয়া এবং সমাধানগুলিতে আগ্রহী কারণ অন্যান্য অবজেক্ট-ওরিয়েন্টেড ভাষাগুলিতে বিবরণগুলি আলাদা হতে চলেছে। উদাহরণস্বরূপ পয়েন্ট 2 উদাহরণস্বরূপ 'পয়েন্টার বা রেফারেন্স' উল্লেখ করেছে এবং উভয়ই কেবল সি ++ এ সম্ভব। সি ++ এর এমন ভাষা বৈশিষ্ট্য রয়েছে যা অন্যান্য ভাষায় উপস্থিত নেই সুতরাং সমস্যার সমাধানের বাস্তবায়নগুলি এই ভাষার বৈশিষ্ট্যগুলি সংযুক্ত করে সমাধানটিকে অন্য ভাষায় যে বিষয়টি আসতে পারে তার থেকে পৃথক করে তোলে।


আপনি একটি উদাহরণ যোগ করতে পারেন? এটা কি আপনার প্রশ্নের বৈধ উদাহরণ? অর্ডারটাইমস (শিশুদের) সাথে আপনার একটি অর্ডারবজেক্ট (= পিতামাতার) রয়েছে এবং যখন অর্ডারটাইম-পরিমাণ পরিবর্তন করা হয় তখন অর্ডার মোট আপডেট করতে চান? নাকি পুরোপুরি আলাদা কিছু ভাবছেন?
k3b

@ k3b হ্যাঁ এটি একটি কার্যকর উদাহরণ। সন্তানের কিছু তথ্য পিতামাতার কিছু করার জন্য পরিবর্তিত হয়েছে।
শাশং

প্রতিটি শিশু শ্রেণিতে কেবল কিছু নির্মাণকারী পরামিতি এবং রেফারেন্স ডেটা সদস্য যুক্ত করুন।
tp1

সন্তানের কি পিতামাতার সম্পর্কে সমস্ত জানা দরকার, বা একটি সরল delegateযথেষ্ট হবে?
জুলিয়েন গের্তাউল্ট

উত্তর:


16

প্রথম জিনিসগুলি, এটি একটি কোড গন্ধ হতে পারে। পিতামাতাদের / শিশুদের জন্য রচনাটি ব্যবহারের বিষয়টি হ'ল পিতা-মাতা বাচ্চাদের সম্পর্কে জানেন তবে বিপরীত নয়। বিশেষত যদি সম্পর্কটি 'রচিত' এর চেয়ে 'অন্তর্ভুক্ত' বেশি থাকে।

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


আমার পরিস্থিতিতে এটি একটি কোড গন্ধ। দুর্দান্ত উত্তর।
মার্টিন ফেফার

3

অন্যরা যেমন উল্লেখ করেছে, মূল নীতিটি পয়েন্টার বা রেফারেন্স হিসাবে ইনজেকশনের মূল ধারণাটি নীতিগতভাবে।

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

আপনার সন্তানের যদি আপনার পিতামাতার অবজেক্টের কেবল একটি ফাংশন কল করতে হয় তবে একটি সম্পূর্ণ IParentশ্রেণি বড় করা যেতে পারে। এই ক্ষেত্রে, সন্তানের মধ্যে সদস্য ফাংশনটির জন্য একটি পয়েন্টার ইনজেকশন করা যথেষ্ট, বা কোনও সদস্যের ফাংশনটি encapsulating একটি ফান্টর অবজেক্টই যথেষ্ট হবে।


2

আপনি যা করতে পারেন তা হল রচনা দ্বারা শিশু শ্রেণিতে পিতামাতার একটি রেফারেন্স রাখা। এইভাবে, শিশু তার পিতামাতাকে জানে এবং এটিতে সর্বজনীন পদ্ধতিগুলি শুরু করতে পারে।

সুতরাং আমি বিকল্প 2 নিয়ে যাব You আপনার যত্নবান হওয়া উচিত যদিও কোনও সন্তানের পিতা-মাতার কাছ থেকে সরানো হয়, আপনার সন্তানের পিতামাতার উল্লেখটি মুছে ফেলা উচিত এবং এটি নাল (বা কোনও নতুন পিতামাতার, যদি তার কাছে থাকে তবে) এক). বা প্রসঙ্গের উপর নির্ভর করে আপনি কেবল শিশু অবজেক্টটি মুছতে পারেন।


1

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


1

2) প্রতিটি সন্তানের অবজেক্টে প্যারেন্ট অবজেক্টটি একটি, পয়েন্টার বা রেফারেন্স হিসাবে ইনজেক্ট করুন। তারপরে বাচ্চাকে যখন পিতামাতাকে কিছু বলতে হবে, এটি সর্বদা এটি করতে পারে কারণ এটির একটি সদস্য পরিবর্তনশীল রয়েছে যা এটি ব্যবহার করতে পারে।

একটি নিখুঁতভাবে টেকসই বিকল্প। সমস্ত আধুনিক ভাষায় একটি বৈশিষ্ট্য রয়েছে যা অন্য ভাষার উল্লেখ করতে ব্যবহার করা যেতে পারে।


1

সামান্য প্রকরণের সাথে একই রকম দৃষ্টিভঙ্গি রয়েছে তবে এটি সুবিধা দেয়:

বলুন প্যারেন্ট এ-তে কম্পোনেন্ট সি রয়েছে

উপাদান সি তে, ইন্টারফেস সি ঘোষণা করুন এবং এটিতে রেফারেন্স রাখুন। এটি বাইরের বিশ্বের সাথে উপাদানটির ইন্টারফেস।

প্যারেন্ট এ ইন্টারফেসসি প্রয়োগ করে এবং অংশ সিতে এর রেফারেন্স সেট করে Comp

ধারণাটি হ'ল: একটি উপাদান তার ইন্টারফেস ব্যবহার করে বাইরের সাথে কথা বলে।

পিতামাতাকে সরাসরি সেট করার মাধ্যমে এটি ব্যবহারের সুবিধাগুলি হ'ল:

বলুন উপাদানটি কিছু করে এবং এর জন্য পিতামাতাকে জানানো দরকার। এটি ইন্টারফেস কল। পরে, আপনি সিদ্ধান্ত নেবেন যে আপনি পিতামাতার পরিবর্তন করতে চান। উপাদানটি মোটেই পাত্তা দিচ্ছে না এবং আপনি এতে কোনও পরিবর্তন করবেন না।

পরে বলুন আপনি কোনও ইভেন্টের অনেকগুলি অবজেক্টকে অবহিত করতে চান। আপনি কেবল ইন্টারফেসসির একটি তালিকা তৈরি করুন এবং এতে উল্লেখ যুক্ত করুন।

অসুবিধাগুলি: একটি পিতামাতার ক্লাস অনেকগুলি ইন্টারফেস প্রয়োগ করে শেষ করে (আমি এটিকে একটি সুবিধা হিসাবে মনে করি যদিও ক্লাসের ঘোষণাপত্রটি দেখে, আমি তাত্ক্ষণিকভাবে জানি যে এটি কার সাথে কথা বলে)


0

নোট করুন এটি সি # নির্দিষ্ট। সি ++ এর মতো কিছু আছে কিনা তা আমি জানি না।

আপনার যদি পুশব্যাটনের সাথে গুই-ফর্ম থাকে তবে সাধারণত ইভেন্ট-সাবস্ক্রিবিশনটি অবজারভার_প্যাটার্ন বা প্রকাশ করুন – সাবস্ক্রাইব প্যাটার্ন নামে পরিচিত ব্যবহার করে আপনার একটি ভিন্ন পদ্ধতি থাকে ।

পুশবটন সাধারণত কোথায় থাকে সে নির্দিষ্ট রূপটি জানে না। পরিবর্তে বাটনটি কোনও ইভেন্ট ট্রিগার করে বা প্রকাশ করে এবং ফর্মটি একটি সাবস্ক্রাইব নোটিফিকেশন গ্রহণ করে এবং সে অনুযায়ী প্রতিক্রিয়া জানাতে পারে।

গুই-এসের পাশাপাশি এই প্যাকেজটি প্রতিটি প্যারেন-শিশু-সম্পর্কের ক্ষেত্রে ব্যবহার করা যেতে পারে

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