আমার মনে আছে বিশ্ববিদ্যালয়ে সি ++ শিখার সময় আমার প্রভাষকের সাথে একই রকম যুক্তি রয়েছে। আমি যখন ভেরিয়েবলটি সর্বজনীন করতে পারি তখন আমি গিটারগুলি এবং সেটটারগুলি ব্যবহার করার বিন্দুটি দেখতে পেতাম না। আমি বছরের অভিজ্ঞতা সহ এখন আরও ভাল বুঝতে পেরেছি এবং কেবল "এনক্যাপসুলেশন বজায় রাখতে" বলার চেয়ে আরও ভাল কারণ শিখেছি।
গেটার এবং সেটটারগুলি সংজ্ঞায়িত করে আপনি একটি সামঞ্জস্যপূর্ণ ইন্টারফেস সরবরাহ করবেন যাতে আপনি যদি নিজের প্রয়োগ পরিবর্তন করতে চান তবে আপনার নির্ভরশীল কোডটি ভাঙ্গার সম্ভাবনা কম। এটি বিশেষত গুরুত্বপূর্ণ যখন আপনার ক্লাসগুলি কোনও এপিআই এর মাধ্যমে প্রকাশিত হয় এবং অন্যান্য অ্যাপ্লিকেশন বা তৃতীয় পক্ষ দ্বারা ব্যবহৃত হয়। তাহলে গেটর বা সেটারে যে স্টাফগুলি যায় সেগুলি সম্পর্কে কী বলা যায়?
প্রাপ্তিরা একটি মান অ্যাক্সেসের জন্য সাধারণ ডাম্বড-ডাউন পাসথ্রো হিসাবে সাধারণত প্রয়োগ করা ভাল better কারণ এটি তাদের আচরণকে অনুমানযোগ্য করে তোলে। আমি সাধারণত বলি, কারণ আমি এমন কেসগুলি দেখেছি যেখানে গণক দ্বারা বা শর্তসাপেক্ষ কোড দ্বারা চালিত মানগুলিতে অ্যাক্সেস পাওয়ার জন্য গেটার্স ব্যবহার করা হয়েছে। সাধারণত আপনি যদি ডিজাইনের সময় ভিজ্যুয়াল উপাদানগুলি ব্যবহারের জন্য তৈরি করেন তবে সাধারণত রান চালানোর সময় খুব সহজ নয়। এটির সাথে এবং একটি সহজ পদ্ধতি ব্যবহারের মধ্যে সত্যিকারের কোনও পার্থক্য নেই, আপনি যখন কোনও পদ্ধতি ব্যবহার করেন তখন সাধারণত আপনার কোনও পদ্ধতির নামকরণের যথাযথ সম্ভাবনা থাকে যাতে কোডটি পড়ার সময় "গেটর" এর কার্যকারিতা আরও স্পষ্ট হয়।
নিম্নলিখিত তুলনা করুন:
int aValue = MyClass.Value;
এবং
int aValue = MyClass.CalculateValue();
দ্বিতীয় বিকল্পটি এটি পরিষ্কার করে দেয় যে মানটি গণনা করা হচ্ছে, যদিও প্রথম উদাহরণটি আপনাকে বলে যে আপনি কেবল নিজেরাই মূল্য সম্পর্কে কিছু না জেনে কোনও মান ফিরিয়ে দিচ্ছেন।
আপনি সম্ভবত তর্ক করতে পারেন যে নিম্নলিখিতগুলি আরও পরিষ্কার হবে:
int aValue = MyClass.CalculatedValue;
তবে সমস্যাটি হ'ল আপনি ধরে নিচ্ছেন যে মানটি ইতিমধ্যে অন্য কোথাও হেরফের হয়েছে। সুতরাং একজন প্রাপকের ক্ষেত্রে, আপনি যখন ধরে নিতে পারেন যে আপনি যখন কোনও মূল্য ফিরিয়ে দিচ্ছেন তখন অন্য কোনও কিছু ঘটতে পারে তবে কোনও সম্পত্তির প্রসঙ্গে এই বিষয়গুলি পরিষ্কার করা কঠিন, এবং সম্পত্তির নামগুলিতে কখনই ক্রিয়াকলাপ থাকা উচিত নয় অন্যথায় এটি ব্যবহার করা নামটি অ্যাক্সেস করার সময় বন্ধনীর সাথে সজ্জিত করা উচিত কিনা তা এক নজরে বুঝতে অসুবিধা হয়।
সেটারগুলি তবে কিছুটা আলাদা কেস। এটি সম্পূর্ণরূপে উপযুক্ত যে কোনও সম্পত্তিতে জমা দেওয়া ডেটা বৈধ করার জন্য কোনও সেটার কিছু অতিরিক্ত প্রক্রিয়াজাতকরণ সরবরাহ করে, কোনও মান নির্ধারণের সাথে ব্যতিক্রম ছুঁড়লে সম্পত্তির নির্ধারিত সীমা লঙ্ঘন হবে। কিছু বিকাশকারীদের সেটারগুলিতে প্রসেসিং যুক্ত করার ক্ষেত্রে যে সমস্যাটি রয়েছে তা হ'ল সেটটারকে আরও কিছু করার জন্য সবসময় প্রলোভন থাকে যেমন কোনও গণনা বা কোনও উপায়ে ডেটা ম্যানিপুলেশন করা। এটিই এমন পার্শ্ব প্রতিক্রিয়াগুলি পেতে পারেন যা কিছু ক্ষেত্রে অপ্রত্যাশিত বা অনাকাঙ্ক্ষিত হতে পারে।
সেটার ক্ষেত্রে আমি সর্বদা থাম্বের একটি সহজ নিয়ম প্রয়োগ করি যা ডেটাতে যতটা সম্ভব কম করা। উদাহরণস্বরূপ, আমি সাধারণত সীমানা পরীক্ষা এবং রাউন্ডিংয়ের অনুমতি দেব যাতে উপযুক্ত হলে ব্যতিক্রমগুলি তুলতে পারি বা অপ্রয়োজনীয় ব্যতিক্রমগুলি এড়ানো যায় যেখানে সেগুলি বোধশক্তি এড়ানো যায়। ভাসমান পয়েন্টের বৈশিষ্ট্যগুলি একটি ভাল উদাহরণ যেখানে আপনি ব্যতিক্রম বাড়ানো এড়াতে অতিরিক্ত দশমিক জায়গাগুলির চারপাশে আকাঙ্ক্ষা করতে পারেন, তবুও সীমার মানগুলিকে কয়েকটি অতিরিক্ত দশমিক স্থানের সাথে প্রবেশের অনুমতি দেয়।
যদি আপনি সেটার ইনপুটটি কোনও ধরণের হেরফের প্রয়োগ করেন তবে আপনি যেমনটি পান ঠিক তেমন নামকরণের মাধ্যমে সেটার কী করছে তা অন্যকে জানানো মুশকিল that উদাহরণ স্বরূপ:
MyClass.Value = 12345;
এটি যখন সেটটারকে দেওয়া হয় তখন মানটির কী হতে চলেছে সে সম্পর্কে এটি আপনাকে কিছু বলবে?
কেমন:
MyClass.RoundValueToNearestThousand(12345);
দ্বিতীয় উদাহরণটি আপনাকে জানায় যে আপনার ডেটাতে ঠিক কী ঘটবে, যখন প্রথমটি আপনাকে জানাতে দেয় না যে আপনি মূল্য নির্বিচারে সংশোধন করতে চলেছেন কিনা। কোড পড়ার সময়, দ্বিতীয় উদাহরণটি এর উদ্দেশ্য এবং কার্যকারিতা থেকে অনেক বেশি পরিষ্কার হবে।
আমি কি ঠিক বলেছি যে এটির সাথে প্রথম স্থানে গেটার এবং সেটটার স্থাপনের উদ্দেশ্যটি সম্পূর্ণরূপে পরাজিত হবে এবং বৈধতা এবং অন্যান্য যুক্তি (অবশ্যই কোনও অদ্ভুত পার্শ্ব প্রতিক্রিয়া ছাড়াই) অনুমতি দেওয়া উচিত?
গিটারস এবং সেটটারগুলি থাকা "শুদ্ধি" এর জন্য এনক্যাপসুলেশন সম্পর্কে নয়, তবে ক্লাসের ইন্টারফেসে পরিবর্তনের ঝুঁকি না নিয়ে কোডটি সহজেই পুনরুদ্ধার করার অনুমতি দেওয়ার জন্য এনক্যাপসুলেটিং সম্পর্কে যা অন্যথায় কলিং কোডের সাথে শ্রেণীর সামঞ্জস্যতা ভেঙে দেয়। বৈধকরণ একটি সেটারে সম্পূর্ণরূপে উপযুক্ত, তবে একটি ছোট ঝুঁকির মধ্যে রয়েছে যে বৈধতার কোনও পরিবর্তন কলিং কোডের সাথে সামঞ্জস্যতা ভঙ্গ করতে পারে যদি কলিং কোডটি কোনও নির্দিষ্টভাবে সংঘটিত বৈধতার উপর নির্ভর করে। এটি একটি সাধারণ বিরল এবং অপেক্ষাকৃত কম ঝুঁকিপূর্ণ পরিস্থিতি, তবে এটি সম্পূর্ণতার জন্য খেয়াল করা উচিত।
বৈধতা কখন হওয়া উচিত?
সত্যতা মান নির্ধারণের পূর্বে সেটারের প্রসঙ্গে বৈধকরণ হওয়া উচিত। এটি নিশ্চিত করে যে যদি কোনও ব্যতিক্রম ছুঁড়ে ফেলা হয় তবে আপনার অবজেক্টের অবস্থা পরিবর্তন হবে না এবং সম্ভাব্যভাবে এর ডেটা অকার্যকর করবে। সেটার কোডটি তুলনামূলকভাবে নিরবচ্ছিন্ন রাখার জন্য আমি সাধারণত একটি পৃথক পদ্ধতিতে যাচাইকরণকে সেটারের মধ্যে ডেকে আনা প্রথমে ভাল বলে মনে করি।
কোনও সেটারকে মান পরিবর্তন করার অনুমতি দেওয়া হয়েছে (সম্ভবত কোনও বৈধ মানকে কিছু অভ্যন্তরীণ উপস্থাপনায় রূপান্তর করতে পারে)?
খুব বিরল ক্ষেত্রে, সম্ভবত। সাধারণভাবে, এটি না করাই সম্ভবত ভাল। এটি অন্য পদ্ধতিতে ভালভাবে সাজানো জিনিস।