কেন একটি ক্লাস সিল?


96

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

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



উত্তর:


41
  • কখনও কখনও ক্লাসগুলি খুব মূল্যবান এবং উত্তরাধিকারসূত্রে ডিজাইন করা হয় না।
  • রানটাইম / প্রতিবিম্ব প্রকারের সন্ধানের সময় সিল করা ক্লাস সম্পর্কে উত্তরাধিকার অনুমানগুলি তৈরি করতে পারে। এর একটি দুর্দান্ত উদাহরণ হ'ল গুণমানগুলি রানটাইম গতির জন্য সিল করে দেওয়ার সুপারিশ করা হয়। টাইপ.গেটকাস্টমঅ্যাট্রিবিউটস (টাইপফ (মাইএট্রিবিউট)) মাইএট্রিবিউট সিল করা থাকলে উল্লেখযোগ্যভাবে দ্রুত সঞ্চালন করবে।

এই বিষয়টির জন্য এমএসডিএন নিবন্ধটি সিলিং ক্লাস দ্বারা সীমিত এক্সটেনসিবিলিটি


4
তারা এখন স্পষ্টভাবে "সাবধানতার সাথে ব্যবহার করুন" বলে দেখে খুশী হলেন ... তারা যদি প্রচার করেন তবে তারা অনুশীলন করবেন wish
mmiika

13
এটি আমার কাছে খারাপ পরামর্শের মতো দেখায় :(
জন স্কিটি

4
@ সিভেরটেক্স: দুঃখিত, আমি আপনাকে সমালোচনা করার চেষ্টা করিনি - কেবল নিবন্ধটি।
জন স্কিটি

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

4
@CVertex আপনি যদি NET ব্যবহার করেছেন তবে আপনি সম্ভবত সমস্যাটি চালিয়েছেন এবং লক্ষ্য করেছেন না, প্রায় সমস্ত নেট নেট ক্লাস সিল করা আছে।
CoryG

105

ক্লাস হয় হয় উত্তরাধিকার জন্য ডিজাইন করা উচিত বা এটি নিষিদ্ধ। উত্তরাধিকারের জন্য ডিজাইনিংয়ের জন্য ব্যয় হয়:

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

কার্যকর জাভার আইটেম 17 এ সম্পর্কে আরও বিশদে যায় - এটি জাভা প্রসঙ্গে লেখা হয়েছে তা নির্বিশেষে, পরামর্শটি নেট নেটও প্রযোজ্য।

ব্যক্তিগতভাবে আমি ইচ্ছুক ক্লাসগুলি .NET এ ডিফল্টরূপে সিল করা হয়েছিল।


26
হুম .. আপনি যদি কোনও ক্লাস বাড়ান, আপনি যদি এটি ভাঙেন তবে আপনার সমস্যা নয়?
mmiika

25
যদি কোনও বাস্তবায়ন পরিবর্তন হয় তবে বেস ক্লাসে আপনার কোনও নিয়ন্ত্রণ না থাকলে আপনি ভেঙে দেন? কার দোষ? উত্তরাধিকার সূক্ষ্মতার সাথে পরিচয় করিয়ে দেয় মূলত। উত্তরাধিকারের তুলনায় পছন্দসই রচনাটি দৃust়তা, আইএমওকে উত্সাহ দেয়।
জন স্কিটি

6
হ্যাঁ, ইন্টারফেসগুলি দুর্দান্ত - এবং হ্যাঁ, আপনি যে কোনও উপায়ে রচনা পছন্দ করতে পারেন। তবে আমি যদি খুব বেশি মনোযোগ দিয়ে চিন্তা না করে একটি সিসিলেড বেস ক্লাসটি প্রকাশ করি তবে আমার প্রত্যাশা করা উচিত যে পরিবর্তনগুলি সম্ভবত উত্পন্ন ক্লাসগুলি ভেঙে দিতে পারে। এটি আমার কাছে খারাপ জিনিস মনে হচ্ছে। ক্লাসটি সিল করা এবং ভাঙ্গন এড়ানো ভাল IM
জন স্কিটি

8
@ জোয়ান: রচনাটি "হ'ল-এর" পরিবর্তে "একটি" সম্পর্কযুক্ত। সুতরাং আপনি যদি এমন কোনও ক্লাস লিখতে চান যা কিছু উপায়ে তালিকার মতো কাজ করতে পারে তবে অন্যের মধ্যে নয়, আপনি তালিকা <T> সদস্য ভেরিয়েবলের পরিবর্তে তালিকার <T> সদস্য পরিবর্তনশীল সহ একটি শ্রেণি তৈরি করতে চাইতে পারেন। তারপরে আপনি বিভিন্ন পদ্ধতি প্রয়োগের জন্য তালিকাটি ব্যবহার করবেন।
জন স্কিটি 26'09

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

8

মনে হচ্ছে 9 বছর আগে since 9 বছর আগে এই প্রশ্নটি জিজ্ঞাসা করার পর থেকে সিলিং সম্পর্কিত সরকারী মাইক্রোসফ্ট নির্দেশিকা বিকশিত হয়েছে এবং তারা একটি অপ্ট-ইন দর্শন (ডিফল্টরূপে সিল) থেকে অপ্ট-আউট (ডিফল্টরূপে সীলমোহর করবেন না) থেকে সরানো হয়েছে:

এক্স না করার উপযুক্ত কারণ ছাড়া ক্লাসগুলি সিল করবেন না

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

ক্লাস সিল করার ভাল কারণগুলির মধ্যে নিম্নলিখিতগুলি অন্তর্ভুক্ত রয়েছে:

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

এক্স সিলড ধরণের সুরক্ষিত বা ভার্চুয়াল সদস্যদের ঘোষণা করবেন না

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

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

প্রকৃতপক্ষে, আপনি যদি এএসপি. নেট কোর কোডবেস অনুসন্ধান করেন তবে আপনি কেবল প্রায় 30 টি উপলক্ষ্য খুঁজে পাবেন sealed class, যার বেশিরভাগ বৈশিষ্ট্য এবং পরীক্ষার ক্লাস।

আমি মনে করি যে অপরিবর্তনীয়তা সংরক্ষণ সিলিংয়ের পক্ষে একটি ভাল যুক্তি।


4

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

আমি জানি না পারফরম্যান্সটি সিলড ক্লাসগুলির একমাত্র সুবিধা কিনা এবং ব্যক্তিগতভাবে আমি অন্য কোনও কারণও জানতে চাই ...


4
তারা কী ধরণের পারফরম্যান্স উপকারের কথা বলছেন তা দেখতে আকর্ষণীয় হবে ...
mmiika

3

পারফরম্যান্স উদাহরণস্বরূপ, জাভাতে স্ট্রিং ক্লাসটি চূড়ান্ত (<- সিল করা) এবং এর কারণ কেবল পারফরম্যান্স। আমি মনে করি আরেকটি গুরুত্বপূর্ণ বিষয় হ'ল এখানে বর্ণিত ভঙ্গুর বেস শ্রেণীর সমস্যাটি এড়াতে: http://blogs.msdn.com/ericlippert/archive/2004/01/07/virtual-methods- and- brittle-base-class । এসপেক্স

যদি আপনি কোনও কাঠামো সরবরাহ করেন তবে রক্ষণাবেক্ষণের উত্তরাধিকার প্রকল্পগুলির জন্য এবং ভঙ্গুর বেস শ্রেণীর সমস্যা এড়াতে আপনার কাঠামোটি আপগ্রেড করা গুরুত্বপূর্ণ


জাভাতে স্ট্রিংয়ের কারণ চূড়ান্ত হওয়ার কারণটি পারফরম্যান্স নয়, এটি সুরক্ষা।
সিসারবি

@ সিজারবি: হ্যাঁ, তবে, স্ট্রিং কোনও সাধারণ জাভা ক্লাস নয়। এটি জাভাতে একমাত্র (আমি বিশ্বাস করি) ক্লাস যা অপারেটর ওভারলোডিং সমর্থন করে (আরও তথ্যের জন্য এখানে দেখুন বিভাগটি: "এমনকি সি এবং জাভাতে (হার্ডকোডযুক্ত অপারেটর ওভারলোডিং") রয়েছে, যা সাধারণ শ্রেণিতে সম্ভব নয়। এ কারণে, Stringক্লাসটি চূড়ান্ত না হলেও, সাবক্লাস করাও সম্ভব ছিল না।
wchargin

1

সিলযুক্ত "বিরল বেস শ্রেণীর সমস্যা" রোধ করতে ব্যবহৃত হয়। আমি এমএসডিএন-তে একটি ভাল নিবন্ধ পেয়েছি যা এটি ব্যাখ্যা করে।


0

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

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


0

একটি শ্রেণি সীল ডিসপোজেবল সংস্থানগুলি পরিচালনা করা সহজ করে তোলে।


0

কোনও শ্রেণি, পদ্ধতি বা সম্পত্তি সিল করতে হবে কিনা তা নির্ধারণ করার জন্য, আপনাকে সাধারণত নিম্নলিখিত দুটি বিষয় বিবেচনা করতে হবে:

Classes সম্ভাব্য সুবিধাগুলি যা ক্লাসগুলি অর্জন করতে পারে তা আপনার ক্লাসটিকে অনুকূলিতকরণের দক্ষতার মাধ্যমে অর্জন করতে পারে।

• সম্ভাব্য যে ডেরিভিং ক্লাসগুলি আপনার ক্লাসগুলি এমনভাবে সংশোধন করতে পারে যে তারা আর সঠিকভাবে বা প্রত্যাশিতভাবে কাজ করবে না।


0

আরও বিবেচ্য বিষয় হ'ল সিল করা ক্লাসগুলি আপনার ইউনিট পরীক্ষায় স্ট্যাব করা যাবে না। থেকে Microsoft এর ডকুমেন্টেশন :

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

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