আমি বিশ্বাস করি যে ক্লাসগুলি অনেক লোকের মনে হওয়ার আসল কারণটি হ'ল final
/ sealed
বেশিরভাগ নন-অ্যাবস্ট্রাক্ট এক্সটেন্ডেবল ক্লাসগুলি সঠিকভাবে নথিভুক্ত করা হয় নি ।
আমাকে বিস্তারিত জানাতে দিন। দূর থেকে শুরু করে কিছু প্রোগ্রামারদের মধ্যে এমন মতামত রয়েছে যে ওওপি-তে একটি সরঞ্জাম হিসাবে উত্তরাধিকার ব্যাপকভাবে অতিরিক্ত ব্যবহার এবং অপব্যবহার হয়। আমরা সকলেই লিসকভের প্রতিস্থাপনের নীতিটি পড়েছি, যদিও এটি আমাদের শত শত (এমনকি হাজার হাজার) বার লঙ্ঘন করা থেকে বিরত রাখেনি।
বিষয়টি প্রোগ্রামাররা কোডটি পুনরায় ব্যবহার করতে পছন্দ করে। এমনকি যখন এটি একটি ভাল ধারণা না। কোডের এই "পুনরায় ব্যবহার" এর উত্তরাধিকার হ'ল একটি মূল সরঞ্জাম। চূড়ান্ত / সিল প্রশ্নে ফিরে যান।
চূড়ান্ত / সিল করা শ্রেণীর জন্য যথাযথ ডকুমেন্টেশন তুলনামূলকভাবে ছোট: আপনি প্রতিটি পদ্ধতিটি কী করেন, আর্গুমেন্টগুলি কী কী, রিটার্নের মান ইত্যাদি বর্ণনা করে থাকেন সমস্ত সাধারণ জিনিস।
যাইহোক, আপনি যখন যথাযথভাবে একটি প্রসারণযোগ্য ক্লাসটি নথিভুক্ত করছেন তখন আপনাকে অন্তত নিম্নলিখিতটি অন্তর্ভুক্ত করতে হবে :
- পদ্ধতির মধ্যে নির্ভরতা (কোন পদ্ধতিটি কল করে ইত্যাদি)
- স্থানীয় ভেরিয়েবলের উপর নির্ভরশীলতা
- অভ্যন্তরীণ চুক্তিগুলি যা প্রসারিত শ্রেণীর সম্মান করা উচিত
- প্রতিটি পদ্ধতির জন্য কনভেনশন কল করুন (উদাহরণস্বরূপ আপনি যখন এটি ওভাররাইড করবেন, তখন আপনি কি
super
প্রয়োগটি কল করেন ? আপনি কি পদ্ধতির শুরুতে বা শেষ দিকে কল করেন? কনস্ট্রাক্টর বনাম ডেস্ট্রাক্টর ভাবুন)
- ...
এগুলি আমার মাথার উপরের অংশে। এবং এগুলির প্রতিটি কেন গুরুত্বপূর্ণ এবং এড়িয়ে যাওয়া একটি বর্ধিত শ্রেণি তৈরি করবে তার একটি উদাহরণ আমি আপনাকে সরবরাহ করতে পারি।
এখন, বিবেচনা করুন কতগুলি ডকুমেন্টেশন প্রচেষ্টা এই জিনিসগুলির যথাযথভাবে ডকুমেন্টিংয়ের মধ্যে যেতে হবে। আমি বিশ্বাস করি যে 7-8 পদ্ধতি (যা একটি আদর্শ বিশ্বের খুব বেশি হতে পারে তবে বাস্তবের তুলনায় খুব সামান্য) সহ একটি বর্গের পাশাপাশি কেবলমাত্র পাঠ্য-কেবল 5 পৃষ্ঠার ডকুমেন্টেশন থাকতে পারে। সুতরাং, পরিবর্তে, আমরা অর্ধেক পথ ছাড়িয়ে ক্লাসটি সিল করি না, যাতে অন্যান্য লোকেরা এটি ব্যবহার করতে পারে, তবে তা সঠিকভাবে নথিভুক্তও করে না, কারণ এটি একটি বিশাল পরিমাণ সময় নেবে (এবং, আপনি জানেন, এটি হতে পারে যাইহোক কখনই বাড়ানো হবে না, তবে কেন বিরক্ত করবেন?)।
আপনি যদি কোনও ক্লাস ডিজাইন করছেন, আপনি এটি সিল করার লোভ অনুভব করতে পারেন যাতে লোকেরা এটি এমনভাবে ব্যবহার করতে পারে না যেটা আপনি আগেই দেখেননি (এবং এর জন্য প্রস্তুত)। অন্যদিকে আপনি যখন অন্য কারও কোড ব্যবহার করছেন তখন কখনও কখনও পাবলিক এপিআই থেকে ক্লাসটি চূড়ান্ত হওয়ার কোনও দৃশ্যমান কারণ নেই এবং আপনি মনে করতে পারেন "জঘন্য, এই কাজের জন্য সন্ধান করতে আমার 30 মিনিটের জন্য ব্যয় হবে"।
আমি মনে করি যে কোনও সমাধানের উপাদানগুলি হ'ল:
- প্রথমে আপনি কোডের ক্লায়েন্ট থাকাকালীন বিস্তৃত হওয়া ভাল ধারণা এবং উত্তরাধিকারের চেয়ে সত্যিকারের সংমিশ্রনের পক্ষে হওয়া নিশ্চিত করা make
- দ্বিতীয়টি হ'ল ম্যানুয়ালটি সম্পূর্ণরূপে (আবার ক্লায়েন্ট হিসাবে) পড়তে হবে তা নিশ্চিত করার জন্য যে আপনি উল্লিখিত কিছুটিকে উপেক্ষা করছেন না।
- তৃতীয়ত, আপনি যখন ক্লায়েন্টটি কোনও কোডের টুকরো লিখবেন তখন কোডটির জন্য সঠিক ডকুমেন্টেশন লিখুন (হ্যাঁ, দীর্ঘ পথ)। ইতিবাচক উদাহরণ হিসাবে, আমি অ্যাপলের আইওএস ডক্স দিতে পারি। ব্যবহারকারীর পক্ষে সর্বদা তাদের ক্লাসগুলি যথাযথভাবে প্রসারিত করার পক্ষে এগুলি পর্যাপ্ত নয় তবে তারা অন্তত উত্তরাধিকার সম্পর্কে কিছু তথ্য অন্তর্ভুক্ত করে। বেশিরভাগ এপিআই-এর জন্য আমি যা বলতে পারি তার চেয়ে বেশি।
- চতুর্থত, আসলে আপনার নিজের শ্রেণি প্রসারিত করার চেষ্টা করুন, এটি কাজ করে তা নিশ্চিত করার জন্য। আমি এপিআই-তে অনেকগুলি নমুনা এবং পরীক্ষাগুলি অন্তর্ভুক্ত করার একটি বড় সমর্থক এবং আপনি যখন একটি পরীক্ষা করছেন তখন আপনি উত্তরাধিকার শৃঙ্খলাও পরীক্ষা করতে পারেন: এগুলি সর্বোপরি আপনার চুক্তির একটি অংশ!
- পঞ্চম, আপনি যখন সন্দেহ করছেন এমন পরিস্থিতিতে ইঙ্গিত দেয় যে ক্লাসটি বাড়ানো নয় এবং এটি করা একটি খারাপ ধারণা (টিএম)। ইঙ্গিত করুন যে এই জাতীয় অনিচ্ছাকৃত ব্যবহারের জন্য আপনাকে দায়বদ্ধ করা উচিত নয়, তবুও ক্লাসটি সিল করবেন না। স্পষ্টতই, ক্লাসটি 100% সিল করা উচিত যখন এটি কেসগুলি কভার করে না।
- অবশেষে, ক্লাসটি সিল করার সময় একটি ইন্টারমিডিয়েট হুক হিসাবে একটি ইন্টারফেস সরবরাহ করুন, যাতে ক্লায়েন্ট ক্লাসটির নিজস্ব পরিবর্তিত সংস্করণটি "পুনর্লিখন" করতে পারে এবং আপনার 'সিলড' শ্রেণীর আশেপাশে কাজ করতে পারে। এইভাবে, তিনি তার প্রয়োগের সাথে সিল করা শ্রেণিকে প্রতিস্থাপন করতে পারেন। এখন, এটি সুস্পষ্ট হওয়া উচিত, যেহেতু এটি এর সহজতম ফর্মের মধ্যে looseিলে .ালা মিশ্রণ, তবে এটি এখনও উল্লেখ করার মতো।
নিম্নলিখিত "দার্শনিক" প্রশ্নটি উল্লেখ করাও মূল্যবান: কোনও শ্রেণি sealed
/ শ্রেণীর জন্য final
চুক্তির অংশ, বা বাস্তবায়নের বিশদ কিনা ? এখন আমি সেখানে চলাফেরা করতে চাই না, তবে এর উত্তরের সাথে একটি শ্রেণি সিল করা উচিত কিনা তা আপনার সিদ্ধান্তকেও প্রভাবিত করবে।
Open/Closed principle
নাClosed Principle.