আপনি কি কখনও সুরক্ষিত সদস্য ভেরিয়েবলগুলি ব্যবহার করবেন? সুবিধাগুলি কী এবং কী কী সমস্যাগুলি এর কারণ হতে পারে?
আপনি কি কখনও সুরক্ষিত সদস্য ভেরিয়েবলগুলি ব্যবহার করবেন? সুবিধাগুলি কী এবং কী কী সমস্যাগুলি এর কারণ হতে পারে?
উত্তর:
আপনি কি কখনও সুরক্ষিত সদস্য ভেরিয়েবলগুলি ব্যবহার করবেন?
আপনি কীভাবে পিকিংয়ের অবস্থা লুকিয়ে রাখছেন তার উপর নির্ভর করে।
যদি কোনও বিকাশকারী এসে আপনার ক্লাসটি সাবক্লাস করে তবে তারা এটিকে জড়িয়ে ফেলতে পারে কারণ তারা এটি পুরোপুরি বুঝতে পারে না। পাবলিক ইন্টারফেস ব্যতীত ব্যক্তিগত সদস্যদের সাথে, তারা কীভাবে কীভাবে কাজ করা হচ্ছে তার বাস্তবায়নের সুনির্দিষ্ট বিবরণ দেখতে পাবে না যা আপনাকে পরে এটি পরিবর্তন করার নমনীয়তা দেয়।
সাধারণত, কিছু যদি ইচ্ছাকৃতভাবে জনসাধারণ হিসাবে ধারণা না করা হয়, তবে আমি এটিকে ব্যক্তিগত করি।
যদি কোনও পরিস্থিতি উদ্ভূত হয় যেখানে ডাইরেক্ট ক্লাস থেকে আমার সেই প্রাইভেট ভেরিয়েবল বা পদ্ধতিতে অ্যাক্সেসের প্রয়োজন হয়, তবে আমি এটিকে প্রাইভেট থেকে সুরক্ষিততে পরিবর্তন করি।
এটি খুব কমই ঘটে - আমি উত্তরাধিকারের সমস্ত ক্ষেত্রেই সত্যই অনুরাগী নই, কারণ বেশিরভাগ পরিস্থিতিতে এটি মডেল করার কোনও বিশেষ ভাল উপায় নয়। যে কোনও হারে, চালিয়ে যান, কোনও উদ্বেগ নেই।
আমি বলব যে এটি বেশিরভাগ বিকাশকারীদের জন্য এটি ভাল (এবং সম্ভবত এটির সর্বোত্তম উপায়)।
বিষয়টির সরল সত্যটি হ'ল , যদি অন্য কোনও বিকাশকারী এক বছর পরে আসে এবং সিদ্ধান্ত নেন যে তাদের আপনার ব্যক্তিগত সদস্যের পরিবর্তনশীল অ্যাক্সেসের প্রয়োজন আছে, তারা কেবল কোডটি সম্পাদনা করতে পারবেন, এটি সুরক্ষিতভাবে পরিবর্তন করতে পারবেন এবং তাদের ব্যবসা চালিয়ে যাবেন।
এর মধ্যে কেবল আসল ব্যতিক্রমগুলি হ'ল যদি আপনি বাইনারি ডেল এর কালো বাক্স আকারে তৃতীয় পক্ষগুলিতে প্রেরণ করার ব্যবসায় থাকেন। এটি মাইক্রোসফ্ট, সেই 'কাস্টম ডেটাগ্রিড কন্ট্রোল' বিক্রেতাদের এবং এক্সটেনসিবিলিটি লাইব্রেরি সহ আরও কয়েকটি বড় অ্যাপ্লিকেশনকে অন্তর্ভুক্ত করে। আপনি যদি সেই বিভাগে না থাকেন তবে এই ধরণের জিনিস সম্পর্কে চিন্তা করার জন্য সময় / প্রচেষ্টা ব্যয় করা উপযুক্ত নয় worth
আজকাল সাধারণ অনুভূতি হ'ল তারা উদ্ভূত শ্রেণি এবং তাদের ঘাঁটির মধ্যে অনুপযুক্ত মিলন ঘটায়।
সুরক্ষিত পদ্ধতি / বৈশিষ্ট্যগুলির সাথে তাদের কোনও বিশেষ সুবিধা নেই (একসময় তাদের সামান্য পারফরম্যান্সের সুবিধাও হতে পারে), এবং এমন একটি যুগে আরও ব্যবহৃত হত যখন খুব গভীর উত্তরাধিকার ফ্যাশনে ছিল, যা এই মুহূর্তে নয়।
no particular advantage over protected methods/properties
হবে no particular advantage over *private* methods/properties
?
super
কনস্ট্রাক্টটি প্যারেন্ট কন্সট্রাক্টরকে কল করতে পারেন ; এরপরে এটি প্যারেন্ট ক্লাসে প্রাইভেট স্টেট ভেরিয়েবলগুলি শুরু করার যত্ন নেবে।
আমার কাছে মুখ্য বিষয় হ'ল একবার আপনি যখন পরিবর্তনশীল সুরক্ষিত হয়ে যান, আপনি তারপরে আপনার শ্রেণীর কোনও পদ্ধতিই তার মানটির উপর নির্ভর করতে পারবেন না কারণ একটি সাবক্লাস সর্বদা এটিকে সীমার বাইরে রাখতে পারে।
উদাহরণস্বরূপ, যদি আমার কাছে এমন কোনও শ্রেণি থাকে যা একটি উপস্থাপনযোগ্য বস্তুর প্রস্থ এবং উচ্চতা নির্ধারণ করে এবং আমি সেই পরিবর্তনগুলি সুরক্ষিত করে তুলি, তবে আমি অনুপাতের অনুপাত (উদাহরণস্বরূপ) ধরে কোনও অনুমান করতে পারি না।
সমালোচকভাবে, কোডটি গ্রন্থাগার হিসাবে প্রকাশিত হওয়া মুহুর্তের থেকে আমি কখনই সেগুলি অনুমান করতে পারি না , যেহেতু আমি অনুপাতটি বজায় রাখতে আমার সেটারগুলি আপডেট করি, তারপরেও আমার কোনও গ্যারান্টি নেই যে ভেরিয়েবলগুলি সেটারগুলির মাধ্যমে সেট করা হচ্ছে বা এর মাধ্যমে অ্যাক্সেস করা হবে বিদ্যমান কোডে getters।
আমার ক্লাসের কোনও সাবক্লাসও সেই গ্যারান্টিটি বেছে নিতে পারে না, কারণ তারা ভেরিয়েবলের মানগুলি প্রয়োগ করতে পারে না, এমনকি যদি এটি তাদের সাবক্লাসের পুরো পয়েন্ট হয় ।
উদাহরণ হিসাবে:
ভেরিয়েবলগুলি ব্যক্তিগত হিসাবে সীমাবদ্ধ করে, আমি তারপরে সেটার বা গেটারগুলির মাধ্যমে আমার যে আচরণটি চান তা প্রয়োগ করতে পারি।
সাধারণভাবে, আমি আপনার সুরক্ষিত সদস্য ভেরিয়েবলগুলিকে বিরল ক্ষেত্রে রাখব যেখানে কোডগুলিতেও তাদের সম্পূর্ণরূপে নিয়ন্ত্রণ রয়েছে them আপনি যদি সর্বজনীন এপিআই তৈরি করে থাকেন তবে আমি কখনও বলব না। নীচে, আমরা সদস্য ভেরিয়েবলটিকে অবজেক্টের "সম্পত্তি" হিসাবে উল্লেখ করব।
ব্যক্তিগত সুপার-অ্যাক্সেসরদের চেয়ে সদস্যকে পরিবর্তনশীল সুরক্ষিত করার পরে আপনার সুপারক্লাস যা করতে পারে তা এখানে নয় :
সম্পত্তি পড়ার সময় অলসভাবে ফ্লাইতে একটি মান তৈরি করুন। যদি আপনি কোনও সুরক্ষিত গেটর পদ্ধতি যুক্ত করেন তবে আপনি আলস্যভাবে মানটি তৈরি করতে এবং এটি আবার পাস করতে পারেন।
সম্পত্তি কখন পরিবর্তন বা মুছে ফেলা হয়েছে তা জানুন। যখন সুপারক্লাস সেই ভেরিয়েবলের অবস্থা সম্পর্কে অনুমান করে তখন এটি বাগগুলি প্রবর্তন করতে পারে। ভেরিয়েবলের জন্য সুরক্ষিত সেটার পদ্ধতি তৈরি করা সেই নিয়ন্ত্রণকে রাখে।
ভেরিয়েবলটি পড়তে বা লিখতে গেলে একটি ব্রেকপয়েন্ট নির্ধারণ করুন বা ডিবাগ আউটপুট যুক্ত করুন।
সমস্ত সদস্য যে এটি ব্যবহার করতে পারে তা অনুসন্ধান না করেই সেই সদস্যের পরিবর্তনশীলটির নাম পরিবর্তন করুন।
সাধারণভাবে, আমি মনে করি এটি এমন বিরল ঘটনা যে আমি কোনও সুরক্ষিত সদস্যকে পরিবর্তনশীল করার পরামর্শ দেব। সুরক্ষিত ভেরিয়েবল পরিবর্তন করে এমন অন্য কোনও কোডে একটি বাগ সন্ধানের চেয়ে কয়েক ঘন্টা পরে গেটরস / সেটারগুলির মাধ্যমে সম্পত্তি উন্মুক্ত করার কয়েক মিনিট ব্যয় করা আপনার পক্ষে ভাল। কেবল তা-ই নয়, নির্ভরযোগ্য কোডটি না ভেঙে ভবিষ্যতের কার্যকারিতা (যেমন অলস লোডিং) যুক্ত করার বিরুদ্ধে আপনি বীমা হয়ে থাকেন। এটি করা এখনকার চেয়ে বেশি পরে করা কঠিন।
নকশা স্তরে কোনও সুরক্ষিত সম্পত্তি ব্যবহার করা উপযুক্ত হতে পারে, তবে বাস্তবায়নের জন্য আমি অ্যাকসেসর / মিউটর পদ্ধতিগুলির পরিবর্তে সুরক্ষিত সদস্য ভেরিয়েবলের সাথে এই ম্যাপিংয়ের কোনও সুবিধা দেখতে পাচ্ছি না।
সুরক্ষিত সদস্য ভেরিয়েবলগুলির উল্লেখযোগ্য অসুবিধাগুলি রয়েছে কারণ তারা ক্লায়েন্ট কোডকে (উপ-শ্রেণি) বেস ক্লাস শ্রেণীর অভ্যন্তরীণ অবস্থানে কার্যকরভাবে মঞ্জুরি দেয়। এটি বেস শ্রেণিকে কার্যকরভাবে তার আক্রমণকারীগুলি বজায় রাখতে বাধা দেয়।
একই কারণে, সুরক্ষিত সদস্য ভেরিয়েবলগুলি সুরক্ষিত মাল্টি-থ্রেড কোড লেখাকে উল্লেখযোগ্যভাবে আরও কঠিন করে তোলে যদি না একক থ্রেডে গ্যারান্টিযুক্ত থাকে বা না থাকে তবে।
অ্যাকসেসর / মিউটর পদ্ধতিগুলি আরও বেশি এপিআই স্থিতিশীলতা এবং রক্ষণাবেক্ষণের অধীনে প্রয়োগের নমনীয়তা সরবরাহ করে।
এছাড়াও, আপনি যদি ওও পিউরিস্ট হন তবে বার্তাগুলি প্রেরণ করে / পড়া বা স্থিতি স্থিতি অবজেক্টের সাথে সহযোগিতা / যোগাযোগ করে communicate
বিনিময়ে তারা খুব কম সুবিধা দেয়। আমি অগত্যা তাদের অন্য কারও কোড থেকে সরিয়ে দেব না, তবে আমি সেগুলি নিজেই ব্যবহার করি না।
বেশিরভাগ সময়, সুরক্ষিত ব্যবহার করা বিপজ্জনক কারণ আপনি আপনার শ্রেণীর কিছুটা এনক্যাপুলেশন ভাঙেন, এটি একটি খারাপ নকশাকৃত উত্সযুক্ত শ্রেণীর দ্বারা ভালভাবে ভেঙে দেওয়া যেতে পারে।
তবে আমার একটি ভাল উদাহরণ রয়েছে: আসুন আমরা বলি যে আপনি কিছু ধরণের জেনেরিক ধারক করতে পারেন। এটির অভ্যন্তরীণ বাস্তবায়ন এবং অভ্যন্তরীণ প্রবেশকারী রয়েছে। তবে আপনাকে এর ডেটাতে কমপক্ষে 3 টি পাবলিক অ্যাক্সেস সরবরাহ করতে হবে: মানচিত্র, হ্যাশ_ম্যাপ, ভেক্টর-জাতীয়। তারপরে আপনার মতো কিছু রয়েছে:
template <typename T, typename TContainer>
class Base
{
// etc.
protected
TContainer container ;
}
template <typename Key, typename T>
class DerivedMap : public Base<T, std::map<Key, T> > { /* etc. */ }
template <typename Key, typename T>
class DerivedHashMap : public Base<T, std::hash_map<Key, T> > { /* etc. */ }
template <typename T>
class DerivedVector : public Base<T, std::vector<T> > { /* etc. */ }
আমি এক মাসেরও কম আগে এই ধরণের কোড ব্যবহার করেছি (সুতরাং কোডটি মেমরি থেকে)। কিছুটা চিন্তাভাবনা করার পরে, আমি বিশ্বাস করি যে জেনেরিক বেস ধারকটি একটি বিমূর্ত শ্রেণি হওয়া উচিত, যদিও এটি বেশ ভালভাবে বাঁচতে পারে, কারণ সরাসরি বেস ব্যবহার করা যেমন একটি ব্যথা হতে পারে তবে এটি নিষিদ্ধ হওয়া উচিত।
সংক্ষিপ্তসার এইভাবে, আপনি উদ্ভূত শ্রেণীর দ্বারা ব্যবহৃত ডেটা সুরক্ষিত করেছেন। তবুও, বেস ক্লাসটি বিমূর্ত হওয়া উচিত তার সত্যতা আমাদের অবশ্যই গ্রহণ করতে হবে।
protected
এর চেয়ে বেশি এনক্যাপসুলেটেড নয় public
। আমি ভুল প্রমাণ করতে ইচ্ছুক। আপনাকে যা করতে হবে তা হ'ল কোনও সুরক্ষিত সদস্য সহ একটি ক্লাস লিখতে হবে এবং আমাকে এটি পরিবর্তন করতে নিষেধ করেছে। স্পষ্টতই ক্লাসটি অ চূড়ান্ত হতে হবে, কারণ সুরক্ষিত ব্যবহারের পুরো বিষয়টি উত্তরাধিকারের জন্য। হয় কিছু encapsulated হয়, বা তা না। এর মধ্যে কোনও রাজ্য নেই।
সংক্ষেপে, হ্যাঁ
সুরক্ষিত সদস্য ভেরিয়েবলগুলি কোনও উপ-শ্রেণীর পাশাপাশি একই প্যাকেজের কোনও ক্লাসের ভেরিয়েবল অ্যাক্সেসের অনুমতি দেয়। এটি অত্যন্ত কার্যকর হতে পারে, বিশেষত কেবলমাত্র পঠনযোগ্য ডেটার জন্য। আমি বিশ্বাস করি না যে সেগুলি অবশ্য প্রয়োজনীয়, কারণ কোনও সুরক্ষিত সদস্য ভেরিয়েবলের কোনও ব্যবহারই কোনও প্রাইভেট সদস্য ভেরিয়েবল এবং দু'জন গেটর এবং সেটটার ব্যবহার করে প্রতিলিপি করা যেতে পারে।
। নেট অ্যাক্সেস মডিফায়ারগুলিতে বিশদ তথ্যের জন্য এখানে যান
সুরক্ষিত সদস্য ভেরিয়েবলগুলির কোনও আসল সুবিধা বা অসুবিধা নেই, এটি আপনার নির্দিষ্ট পরিস্থিতিতে আপনার কী প্রয়োজন তা একটি প্রশ্ন। সাধারণভাবে সদস্য ভেরিয়েবলগুলি ব্যক্তিগত হিসাবে ঘোষণা করা এবং সম্পত্তিগুলির মাধ্যমে বাইরের অ্যাক্সেস সক্ষম করার অভ্যাসটি গৃহীত হয়। এছাড়াও, কিছু সরঞ্জাম (যেমন কিছু ও / আর ম্যাপারস) প্রত্যাশিত ডেটা বৈশিষ্ট্য দ্বারা উপস্থাপিত হওয়ার প্রত্যাশা করে এবং সর্বজনীন বা সুরক্ষিত সদস্য ভেরিয়েবলগুলি সনাক্ত করে না। তবে যদি আপনি জানেন যে আপনি চান যে আপনার সাবক্লাসগুলি (এবং কেবলমাত্র আপনার সাবক্লাস) একটি নির্দিষ্ট ভেরিয়েবল অ্যাক্সেস করতে পারে তবে এটিকে সুরক্ষিত হিসাবে ঘোষণা করার কোনও কারণ নেই।