উত্তরাধিকার কখন ব্যবহার করবেন, কখন 'মাত্র একটি বুলিয়ান ক্ষেত্র' ব্যবহার করবেন?


18

আমাদের রেল অ্যাপ্লিকেশনগুলিতে আমরা বিজ্ঞপ্তি যুক্ত করছি। এর মধ্যে কয়েকটি blockingহ'ল: তারা যে যে সংস্থানটিতে যুক্ত হয় তার অগ্রগতি বন্ধ করে দেয়, কারণ সেই সংস্থানটির কিছু তথ্য অনুপস্থিত।

অন্যান্য বিজ্ঞপ্তিগুলি সাধারণ বিজ্ঞপ্তিগুলি এবং কেবল তথ্য সরবরাহ করে।

আজ আমি আমাদের দলের আরেক প্রোগ্রামার সাথে আলোচনা করেছি। আমি উত্তরাধিকার কাঠামোটি এইভাবে তৈরি করেছি:

এখানে চিত্র বর্ণনা লিখুন

তিনি তবে আমাকে বরং যুক্ত করতে চান blocking প্রতিটি বিজ্ঞপ্তিতে বুলিয়ান-রিটার্নিং পদ্ধতি হিসাবে করতে এবং বিজ্ঞপ্তি পিতাম শ্রেণীর ভিতরে অবরুদ্ধ সাবক্লাসগুলির একটি তালিকা নির্দিষ্ট করতে চান।

এই পদ্ধতির মধ্যে পার্থক্য খুব বড় নয়; আমার পদ্ধতির ক্ষেত্রে রুট ক্লাস ক্লিনার রেখে একটিকে এই তালিকাটি নির্দিষ্ট করতে হবে না keeping অন্যদিকে, বিশেষ লজিক যেটি Notification::Blockingএখনই ঘটে তা খুব বড় নয়।

কোন ধরণের বিমূর্ততা এই সমস্যার জন্য বেশি উপযুক্ত?


11
কোনও অভিভাবক শ্রেণীর কখনই এটি শিশুদের সম্পর্কে জানা উচিত নয়। কেন আপনার সাব ক্লাসের একটি তালিকা রাখা দরকার?
কোটায়ার

কীভাবে তারা কোনও সংস্থায় যুক্ত হয় এবং কীভাবে তারা এর অগ্রগতি থামায়?
নাল

3
আপনার এত নোটিফিকেশন ক্লাস কেন লাগবে? আমার কাছে মনে হচ্ছে আপনি একটি বিজ্ঞপ্তি ক্লাস তৈরি করতে পারেন, তারপরে ডেটাগুলির ধরণের পরিবর্তে ক্রিয়াকলাপটি চালিয়ে দিন।

1
@ ট্রাইপড: ঠিক আছে, যদি আপনি আচরণের একটি দিকটি কেসগুলির একটি বিস্তৃত তালিকা সহ বেস ক্লাসে স্থানান্তরিত করতে দেখেন তবে আপনার দৃtions়প্রত্যয়ীদের সাহস করুন, স্বীকার করুন যে আপনি প্রসারণ দ্বারা কাস্টমাইজেশনের জন্য সত্যই ব্যবহারযোগ্য বেস ক্লাস ডিজাইন করছেন না , এবং সমস্ত আচরণ বেস শ্রেণিতে সরান !
স্টিভ জেসোপ

উত্তর:


35

আপনি প্রাপ্ত ক্লাস সম্পর্কে জেনে বেস ক্লাসগুলি এড়াতে চান। এটি টাইট কাপলিংয়ের পরিচয় দেয় এবং এটি একটি রক্ষণাবেক্ষণের মাথা ব্যথা কারণ প্রতিবার আপনি একটি নতুন উত্পন্ন ক্লাস তৈরি করার সময় আপনাকে তালিকায় যুক্ত করতে হবে।

আপনি একাধিক প্রকল্পে এই শ্রেণিটি ব্যবহার করতে চাইলে এটি আপনাকে বিজ্ঞপ্তি শ্রেণিকে পুনরায় ব্যবহারযোগ্য প্যাকেজ / সমাবেশে রাখতে সক্ষম হতে বাধা দেয়।

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


3
এই. এক জায়গায় সিদ্ধান্ত নিন। ক্লাস এবং তালিকার মধ্যে কোন ক্লাসগুলি ব্লক করে তা জ্ঞান ছড়িয়ে দেবেন না।
candied_orange

এটি আমিই করি, খুব ভাল কাজ করে এবং খুব পুনরায় ব্যবহারযোগ্য।
কোটায়ার

13

এবং বিজ্ঞপ্তি পিতাম শ্রেণীর ভিতরে ব্লক করা সাবক্লাসগুলির একটি তালিকা নির্দিষ্ট করুন।

এটি খুব অদ্ভুত দেখাচ্ছে এবং এটি একটি নির্দিষ্ট কোডের গন্ধ।

ক্লাসগুলির মধ্যে আপনার আচরণের মধ্যে পার্থক্য থাকলে আমি সাবক্লাস সরবরাহ করব এবং আপনি এই বিজ্ঞপ্তিগুলির সমস্ত একই ধরণের (যেমন পলিমারফিজম ব্যবহার করে ) চিকিত্সা করতে চান ।


1
আমি মনে করি "আচরণ" এখানে মূল বিষয়: যখন এটি কেবলমাত্র ডেটা হয়, ক্ষেত্রটি পর্যাপ্ত বৈষম্যমূলক হওয়া উচিত। আচরণ পলিমারফিজম ব্যবহার করার সর্বোত্তম কারণ তবে উত্তরাধিকারের শ্রেণিবদ্ধতা তৈরি করার সময় অবশ্যই সর্বদা রক্ষণাবেক্ষণের জটিলতা বিবেচনা করা উচিত। পড়ুন en.wikipedia.org/wiki/Composition_over_inheritance
cottsak

7

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

এটি বলেছিল, এমনকি এই পরিস্থিতিতে আরও ভাল ডিজাইনটি হতে পারে কোনও ডেকোরেটর অবজেক্ট ব্যবহার করা।


1

আমি বলব এটি একটি ব্লকিং নোটিফিকেশন সম্পর্কে আরও কতটা বিশেষ তার উপর নির্ভর করে, যদিও আমার প্রথম চিন্তা "উভয়" সাথেই চলেছে:

class Notification
 virtual Boolean Blocking{get return false;}

class BlockingNotification inherits Notification
 virtual overrides Boolean Blocking{get return true;}

এইভাবে, আপনি ব্যবহার করতে পারেন n.Blockingবা n is BlockingNotification(সমস্ত ছদ্ম-কোডে), যদিও, আপনি যদি কোনও ক্লাসকে প্রসঙ্গ-সংবেদনশীল Blockingমান প্রয়োগ করার অনুমতি প্রদান করতে চলেছেন তবে আপনাকে প্রতিবার সেই মানটি পরীক্ষা করে দেখতে হবে,BlockingNotification শ্রেণিটি হয়ে যায় কম দরকারী

যাই হোক না কেন, আমি অন্যান্য উত্তরের সাথে একমত যে আপনি বেস ক্লাসের প্রয়োগটি Blockingউদ্ভূত শ্রেণীর সম্পর্কে জানতে হবে না to


0

প্রতিটি দুটি বেস ক্লাস এবং একাধিক উদাহরণ তৈরির পরিবর্তে, বিজ্ঞপ্তিটি ব্লক করা হচ্ছে কিনা এবং ব্যবহারকারীকে বিজ্ঞপ্তিটি যোগাযোগ করার জন্য প্রয়োজনীয় অন্য কোনও তথ্য রয়েছে কিনা তা বোঝাতে একটি বুল সহ একটি বিজ্ঞপ্তি শ্রেণি করুন।

এটি আপনাকে বিজ্ঞপ্তি প্রসেসিং এবং উপস্থাপনের জন্য কোডের একটি সেট ব্যবহার করতে দেয় এবং আপনার কোডের জটিলতা হ্রাস করে।

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