এনক্যাপসুলেশন বলতে বোঝায় যে কোনও সামগ্রীর অবস্থা কেবলমাত্র একটি সংজ্ঞায়িত ইন্টারফেসের মাধ্যমে ঘটে এবং এর ফলে শ্রেণি নিশ্চিত করতে পারে যে এই রাজ্যটি সর্বদা বৈধ এবং শ্রেণীর উদ্দেশ্যকে মেনে চলা যায়।
কিছু ক্ষেত্রে, কেবলমাত্র প্রকাশ্যভাবে কোনও ক্ষেত্র উন্মোচন করার জন্য এটি এনক্যাপসুলেশনের মূলনীতিটি যথাযথভাবে পালন করা - ক্ষেত্রের জন্য সমস্ত সম্ভাব্য মানগুলি অন্যান্য ক্ষেত্রের সমস্ত সম্ভাব্য মানগুলির সাথে বৈধ এবং তাই প্রোগ্রামার সক্রিয়ভাবে ক্ষেত্রটিকে অনুমতি দেওয়ার সিদ্ধান্ত নিতে পারে বাইরের কোড দ্বারা অবাধে কারসাজি করা।
এই কেসগুলি যদিও বেশিরভাগ ক্লাসে সীমাবদ্ধ যা বেশিরভাগ "সাদামাটা পুরাতন ডেটা"। তারা এই বিষয়ে খুব আকর্ষণীয় নয়, তাদের সম্পর্কে যথেষ্ট।
অন্যান্য ক্ষেত্রে, অন্য ভাষাগুলিতে, একজনের গেটর এবং সেটার পদ্ধতি থাকবে, যা কিছু int getId()মূল্য পেতে এবং void setId(int val)এটি আপডেট করার মতো।
বৈশিষ্ট্যগুলি পড়তে এবং লেখার জন্য একই পদ্ধতির মাধ্যমে আমরা একই ক্ষেত্রটি পড়তে এবং লিখতে যেভাবে ব্যবহার করব সেগুলির জন্য একই বিন্যাসটি ব্যবহার করি। এটি জরুরী না হলেও এটি একটি ভাল সিনট্যাকটিক চিনি।
(প্রকৃতপক্ষে, প্রতিবিম্বটি যেভাবে কাজ করে এবং DataBinder.Evalক্ষেত্রটি ঠিকঠাক কাজ করার পরেও কোনও সম্পত্তি রাখতে সুবিধাজনক হতে পারে তার কারণেই, তবে এটি অন্য বিষয়))।
প্রাইভেট সেটার চালু না হওয়া পর্যন্ত (আসলে, ব্লকটিতে প্রাইভেট সেটার এবং পাবলিক বা সুরক্ষিত গেটার থাকার সিঙ্ক 2 এর সাথে পরিবর্তিত হওয়াটি), প্রাইভেট সেটারের কাজ করার জন্য আমাদের একটি ব্যক্তিগত পদ্ধতি থাকতে পারে, তাই প্রাইভেট সেটারগুলি সত্যই প্রয়োজনীয় নয়। তারা যদিও সুবিধাজনক, তাই কেবল সিনট্যাকটিক চিনির সময়, তারা বেশ কার্যকর।
এনক্যাপসুলেশন আপনার সেটারগুলি (বা গেটার্স) পাবলিক, প্রাইভেট, সুরক্ষিত বা অভ্যন্তরীণ কিনা তা নয়, তবে সেগুলি উপযুক্ত কিনা সে বিষয়টি । প্রতিটি ক্ষেত্রের বেসরকারী (এবং সেই বিষয়টি জন্য readonly) এর একটি ডিফল্ট দিয়ে শুরু করুন এবং তারপরে প্রয়োজনীয় হিসাবে সদস্যদের যোগ করুন (বৈশিষ্ট্য বা পদ্ধতি যাই হোক না কেন ) যেগুলি ক্ষেত্রগুলিকে পরিবর্তিত করে এবং নিশ্চিত করুন যে বস্তুটি তারা পরিবর্তিত হওয়ার সাথে সাথে বৈধ থাকবে । এটি নিশ্চিত করে যে কোনও শ্রেণীর ' আক্রমণকারীকে রাখা হয়েছে, যার অর্থ এটি যে বৈধ রাষ্ট্র হতে পারে তার বর্ণনামূলক বিধিগুলি কখনও ভেঙে যায় না (নির্ধারকরা এটির বৈধ অবস্থায় এটি শুরু হয়ে যায় তা নিশ্চিত করে সহায়তা করে)।
আপনার শেষ প্রশ্নের হিসাবে, অপরিবর্তনীয় হওয়ার অর্থ একটি শ্রেণীর কোনও পাবলিক, সুরক্ষিত বা অভ্যন্তরীণ সেটার নেই এবং কোনও পাবলিক, সুরক্ষিত বা অভ্যন্তরীণ পদ্ধতি নেই যা কোনও ক্ষেত্র পরিবর্তন করে। এর ডিগ্রি রয়েছে, সি # তে তিন ডিগ্রি সম্ভব রয়েছে:
একটি ক্লাসের সমস্ত উদাহরণ ক্ষেত্রের readonly, তাই ব্যক্তিগত কোড এমনকি এটি পরিবর্তন করতে পারে না। এটি স্থাবর হওয়ার গ্যারান্টিযুক্ত (যে কোনও কিছু এটির পরিবর্তনের চেষ্টা করে তা সংকলন করবে না) এবং সম্ভবত এর পিছনে অপ্টিমাইজেশন করা যেতে পারে।
কোনও শ্রেণি বাইরে থেকে অপরিবর্তনীয় কারণ কোনও জনসাধারণের সদস্য কিছু পরিবর্তন করে না, তবে readonlyঅভ্যন্তরীণ দিক থেকে পরিবর্তন না করা ব্যবহারের মাধ্যমে গ্যারান্টিযুক্ত নয়।
বাইরে থেকে দেখা যায় এমন একটি শ্রেণি অপরিবর্তনীয়, যদিও কিছু রাজ্য বাস্তবায়নের বিশদ হিসাবে পরিবর্তিত হয়। উদাহরণস্বরূপ ক্ষেত্রটি স্মরণীয় হতে পারে এবং তাই বাইরে থেকে কেবল এটি একই মান পুনরুদ্ধার করার চেষ্টা করা হয়, এই জাতীয় প্রয়াসটি প্রথমে এটি গণনা করে এবং পরবর্তী পর্যায়ে পুনরুদ্ধারের জন্য সংরক্ষণ করে।
private File settingsFile = null;কনস্ট্রাকটর এবং তারপর এক:if (settingsFile == null) { settingsFile = GetSettingsFile() };। এরকম রিফ্যাক্টরিং কোড আমাকে মাঝে মাঝে কাঁদিয়ে তোলে :)। আপনি কেবল কনস্ট্রাক্টরের আগে কোনও সদস্য নির্ধারণ করতে পারেন, তার অর্থ এই নয় যে আপনার একাধিক কনস্ট্রাক্টরের সাথে হওয়া উচিত, এটি যুক্তিকে অনুসরণ করা খুব কঠিন করে তোলে। প্রাইভেট সেটার্স আপনাকে কনস্ট্রাক্টরের ভিতরে বা তার পরে মান নির্ধারণ করতে বাধ্য করে।