আপনি কখন এবং কেন একটি ক্লাস সিল করবেন?


89

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

উত্তর:


100
  1. সুরক্ষা বৈশিষ্ট্যগুলি প্রয়োগ করে এমন একটি শ্রেণিতে, যাতে মূল বিষয়টিকে "ছদ্মবেশী" করা যায় না।

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

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


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

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

4
এটি ব্যয়বহুল পারফরম্যান্স- ভিত্তিতে পরিণত হয় যদি চিকিত্সা না করা ছেড়ে দেওয়া হয় তবে এটি কি কম ক্ষুদ্র পরীক্ষার পাগল পরীক্ষার চেয়ে কম পরিমাপযোগ্য?
t3chb0t

4
সিল চোষে। এটি পরীক্ষা আরও শক্ত করে তোলে - আমি ফেকআইটেসির সাথে দু'টি এএসপি.এনইটি ক্লাসের উপহাস করতে চাই, তবে সেগুলি সিল করে দেওয়ার কারণে আমি পারছি না।
যুদ্ধের মতো শিম্পাঞ্জি

4
@RayLuo এর সাথে আরও একমত হতে পারবেন না। আমি এটি বেশ কয়েকবার আঘাত করেছি যে লোকেরা তাদের ক্লাসগুলি সিল করেছিল যেখানে সুরক্ষা এবং কর্মক্ষমতা আসলেই সমস্যা নয়। তাদের "সিলড" কেবল ক্লাসগুলিকে ওভাররাইড করার আমার যুক্তিসঙ্গত প্রয়োজনকে বাধা দিয়েছে, জিনিসগুলিকে আরও জটিল করে তুলেছিল। যুদ্ধের মতো শিম্পাঞ্জি বলেছিলেন, ক্লাসকে ঠাট্টা করা টেস্টে এতটা সাধারণ।
ZZY

15

বাবুনের দুর্দান্ত উত্তরের একটি সংযোজন :

  1. যদি কোনও শ্রেণি উত্তরাধিকারের জন্য ডিজাইন না করা হয় তবে সাবক্লাসগুলি শ্রেণীর আক্রমণকারীদের ভাঙতে পারে । এটি অবশ্যই কেবল তখনই প্রযোজ্য যদি আপনি অবশ্যই একটি পাবলিক এপিআই তৈরি করেন তবে আমি থাম্বের বিধি হিসাবে আমি কোনও শ্রেণিকে স্পষ্টভাবে উপশ্রেণীর জন্য নকশাকৃত না করে সিল করি।

সম্পর্কিত নোটে, কেবল সিসিল না করা ক্লাসগুলির জন্য প্রযোজ্য: তৈরি virtualকরা কোনও পদ্ধতিই একটি এক্সটেনশন পয়েন্ট, বা কমপক্ষে দেখে মনে হয় এটি একটি এক্সটেনশন পয়েন্ট হওয়া উচিত। ঘোষণা করার পদ্ধতিগুলিও virtualএকটি সচেতন সিদ্ধান্ত হওয়া উচিত। (সি # এ এটি একটি সচেতন সিদ্ধান্ত; জাভাতে এটি হয় না))


সম্পাদনা : কিছু প্রাসঙ্গিক লিঙ্ক:

এছাড়াও লক্ষ করুন যে কোটলিন ডিফল্টরূপে ক্লাসগুলি সিল করে; এর openকীওয়ার্ডটি জাভা finalবা sealedসি # এর বিপরীত । (নিশ্চিতভাবেই, এটি একটি ভাল জিনিস যে কোনও সর্বজনীন চুক্তি নেই ))


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

9
@ গ্যান্টম্যানের মন্তব্যটিকে আসলে ওপি-র প্রশ্নের উত্তরের একটি হিসাবে বিবেচনা করা উচিত, কারণ এটি মূলত "কখন? শক্তভাবেই? কেন? কেন আপনি এটি করেন না?" কারণ হিসাবে একটি উত্তর দেয়। মঞ্জুর করুন আপনার পৃথক উত্তর হিসাবে আপনার মন্তব্যটি পুনরায় পোস্ট করা উচিত এবং তার জন্য ভোট সংগ্রহ করা উচিত। :-)
রায়লুও

4
এই উত্তর refferrng হয়েছিল: stackoverflow.com/a/7777674/3195477 ? এর সাথে লিঙ্ক করা ভাল (কেবলমাত্র) ব্যক্তির নাম দেওয়ার চেয়ে
ইউইডিডিএলআরএলআরএসএস

2

শ্রেণি হিসাবে চিহ্নিত করা Sealedগুরুত্বপূর্ণ ক্লাসগুলিতে যেহেতু নিরাপত্তার সাথে আপস করতে পারে বা পারফরম্যান্সকে প্রভাবিত করতে পারে তা ছড়িয়ে দেওয়া বাধা দেয়।

অনেক সময়, কোনও শ্রেণি সিল করে ফেলার বিষয়টিও বোঝা যায় যখন কেউ স্থির আচরণের সাথে কোনও ইউটিলিটি ক্লাস ডিজাইন করেন, যা আমরা পরিবর্তন করতে চাই না।

উদাহরণস্বরূপ, Systemনেমস্পেসে C#অনেকগুলি ক্লাস সরবরাহ করা হয় যা সিল করা হয়, যেমন String। যদি সিল না করা হয় তবে এটির কার্যকারিতাটি প্রসারিত করা সম্ভব হবে যা অনাকাঙ্ক্ষিত হতে পারে, কারণ এটি প্রদত্ত কার্যকারিতা সহ একটি মৌলিক প্রকার।

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

কখনও কখনও, যখন আপনি শ্রেণিবৃত্তি বানাচ্ছেন, আপনি নিজের ডোমেন মডেল বা ব্যবসায়িক নিয়মের উপর ভিত্তি করে উত্তরাধিকার শৃঙ্খলে একটি নির্দিষ্ট শাখা ছাঁটাই করতে পারেন।

উদাহরণস্বরূপ, এ Managerএবং PartTimeEmployeeউভয়ই একই Employee, তবে আপনার সংস্থায় খণ্ডকালীন কর্মচারীদের পরে আপনার কোনও ভূমিকা নেই। এই ক্ষেত্রে, আপনি PartTimeEmployeeআরও শাখা রোধ করতে সিল করতে চাইতে পারেন । অন্যদিকে, যদি আপনার প্রতি ঘন্টা বা সাপ্তাহিক খণ্ডকালীন কর্মচারী থাকে তবে তাদের কাছ থেকে উত্তরাধিকারী হওয়া বুদ্ধিমান হতে পারে PartTimeEmployee


স্ট্রিং ক্লাসটি বাড়ানো কীভাবে অনাকাঙ্ক্ষিত হবে? স্ট্রিংটি বর্তমানে এটি ঠিক কীভাবে কাজ করবে এবং আপনার পছন্দসই যখন অতিরিক্ত কার্যকারিতা সহ একটি উত্পন্ন ক্লাস থাকতে পারে, তবে আপনি কোন ইস্যু নিয়ে কথা বলছেন?
কেভিন ওয়েলস

এছাড়াও আপনার উত্তরাধিকারের শ্রেণিবিন্যাসকে "ক্যাপিং" দেওয়ার বিন্দুটি কী হবে? এর অর্থ হ'ল যদি আপনার যদি এই শ্রেণিবদ্ধতা বাড়ানোর দরকার হয় তবে আপনাকে প্রথমে অভিভাবক শ্রেণিটি অপসারণ করতে হবে, যা কেবল অদক্ষ
কেভিন ওয়েলস

এরিক লিপার্ট এবং এই এসও প্রশ্ন থেকে এই দুর্দান্ত পোস্টটি দেখুন
অক্ষয় খোত

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

দ্বিতীয় প্রশ্নের জন্য, লক্ষ্যটি হবে অনাকাঙ্ক্ষিত আচরণ (ব্যবসার যুক্তির উপর নির্ভর করে) প্রতিরোধ করা। unsealশ্রেণীর পক্ষে এটি পরে সিল করা এবং তার উপর নির্ভরশীল সমস্ত শ্রেণি ভাঙার পরিবর্তে প্রয়োজনে আরও সহজ ।
অক্ষয় খোত

0

আমি মনে করি এই পোস্টটির কিছু ভাল পয়েন্ট রয়েছে, নির্দিষ্ট ক্ষেত্রে ছিল যখন কোনও সিলড ক্লাস কোনও র্যান্ডম ইন্টারফেসে কাস্ট করার চেষ্টা করা হয়েছিল, সংকলক ত্রুটি ছুঁড়ে না; কিন্তু যখন সীলমোহর ব্যবহৃত হয় তখন সংকলক ত্রুটি ছুঁড়ে দেয় যে এটি রূপান্তর করতে পারে না। সিলযুক্ত ক্লাস অতিরিক্ত কোড অ্যাক্সেস সুরক্ষা নিয়ে আসে।
https://www.codeproject.com/Articles/239939/Csharp-Tweaks-Why-to-use-the-sealed-keyword-on-cla


4
একটি সমাধানের একটি লিঙ্ক স্বাগত, তবে দয়া করে আপনার উত্তরটি কার্যকর না হওয়া নিশ্চিত করুন: লিঙ্কটির চারপাশে প্রসঙ্গ যুক্ত করুন যাতে আপনার সহ ব্যবহারকারীদের কিছু ধারণা থাকতে পারে এটি কী এবং কেন এটি রয়েছে, তারপরে আপনি পৃষ্ঠার সর্বাধিক প্রাসঙ্গিক অংশটি উদ্ধৃত করুন লক্ষ্য পৃষ্ঠাটি অনুপলব্ধ ক্ষেত্রে লিঙ্কটি পুনরায় সংযুক্ত করুন। লিঙ্কের চেয়ে সামান্য বেশি উত্তর মুছতে পারে।
বাউম মিট অউজেন

দুঃখিত, আমি এটি উত্তর হিসাবে পোস্ট করার ইচ্ছা করি নি, তবে এটি অন্যান্য উত্তরের সাথে সম্পর্কিত বলে মনে হচ্ছে না এবং এটি কোথায় রাখব তা আমি জানি না
strisunshine

4
পরামর্শ অনুযায়ী পোস্টটি সম্পাদনা করেছি। মূলত আমি কেবল একটি ভিন্ন কোণে অবদান রাখতে চাই (সম্ভবত), তবে আমি কেবল একটি ডাউনভোট পেয়েছি এবং আমরা এখনও সামগ্রীটি নিয়ে কথা বলিনি, -1 দয়া করে কারণটি জানতে দিতে পারেন?
strisunshine
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.