গেটর এবং সেটটারের ভিতরে কী অনুমতি দেওয়া উচিত?


45

আমি গেটর এবং সেটারের পদ্ধতি এবং এনক্যাপসুলেশন সম্পর্কে একটি আকর্ষণীয় ইন্টারনেট যুক্তি লাভ করি। কেউ বলেছে যে তাদের "খাঁটি" রাখতে এবং এনক্যাপসুলেশন নিশ্চিত করার জন্য তাদের কেবল একটি অ্যাসাইনমেন্ট (সেটার) বা পরিবর্তনশীল অ্যাক্সেস (গেটার্স) করা উচিত।

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

18
গেটার্স এবং সেটারগুলির সম্পর্কে সর্বোত্তম জিনিস হ'ল সেগুলি না রাখার ক্ষমতা , অর্থাত্ সেটারের ছাড় এবং আপনার কাছে কেবল পঠনযোগ্য সম্পত্তি রয়েছে, গিটারের ছুটি রয়েছে এবং আপনার কনফিগারেশন বিকল্প রয়েছে যার বর্তমান মান কারও ব্যবসায় নয়।
মাইকেল বর্গওয়ার্ট

7
@ মিশেলবার্গওয়ার্ট উভয়কে একটি পরিষ্কার "বলুন, জিজ্ঞাসা করবেন না" ইন্টারফেস রাখার জন্য ছেড়ে দিন। বৈশিষ্ট্য = সম্ভাব্য কোড গন্ধ।
কনরাড রুডল্ফ


2
ইভেন্ট উত্থাপনের জন্য সেটটারগুলিও ব্যবহার করা যেতে পারে ।
জন যিশাইয় কারমোনা

@ কনরাড রুডল্ফ আমি আপনার বক্তব্যের সাথে একমত, যদিও আমি "সম্ভাবনা" শব্দটি সত্যই জোর দিতে চাই।
ফিল

উত্তর:


37

আমার মনে আছে বিশ্ববিদ্যালয়ে সি ++ শিখার সময় আমার প্রভাষকের সাথে একই রকম যুক্তি রয়েছে। আমি যখন ভেরিয়েবলটি সর্বজনীন করতে পারি তখন আমি গিটারগুলি এবং সেটটারগুলি ব্যবহার করার বিন্দুটি দেখতে পেতাম না। আমি বছরের অভিজ্ঞতা সহ এখন আরও ভাল বুঝতে পেরেছি এবং কেবল "এনক্যাপসুলেশন বজায় রাখতে" বলার চেয়ে আরও ভাল কারণ শিখেছি।

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

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

নিম্নলিখিত তুলনা করুন:

int aValue = MyClass.Value;

এবং

int aValue = MyClass.CalculateValue();

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

আপনি সম্ভবত তর্ক করতে পারেন যে নিম্নলিখিতগুলি আরও পরিষ্কার হবে:

int aValue = MyClass.CalculatedValue;

তবে সমস্যাটি হ'ল আপনি ধরে নিচ্ছেন যে মানটি ইতিমধ্যে অন্য কোথাও হেরফের হয়েছে। সুতরাং একজন প্রাপকের ক্ষেত্রে, আপনি যখন ধরে নিতে পারেন যে আপনি যখন কোনও মূল্য ফিরিয়ে দিচ্ছেন তখন অন্য কোনও কিছু ঘটতে পারে তবে কোনও সম্পত্তির প্রসঙ্গে এই বিষয়গুলি পরিষ্কার করা কঠিন, এবং সম্পত্তির নামগুলিতে কখনই ক্রিয়াকলাপ থাকা উচিত নয় অন্যথায় এটি ব্যবহার করা নামটি অ্যাক্সেস করার সময় বন্ধনীর সাথে সজ্জিত করা উচিত কিনা তা এক নজরে বুঝতে অসুবিধা হয়।

সেটারগুলি তবে কিছুটা আলাদা কেস। এটি সম্পূর্ণরূপে উপযুক্ত যে কোনও সম্পত্তিতে জমা দেওয়া ডেটা বৈধ করার জন্য কোনও সেটার কিছু অতিরিক্ত প্রক্রিয়াজাতকরণ সরবরাহ করে, কোনও মান নির্ধারণের সাথে ব্যতিক্রম ছুঁড়লে সম্পত্তির নির্ধারিত সীমা লঙ্ঘন হবে। কিছু বিকাশকারীদের সেটারগুলিতে প্রসেসিং যুক্ত করার ক্ষেত্রে যে সমস্যাটি রয়েছে তা হ'ল সেটটারকে আরও কিছু করার জন্য সবসময় প্রলোভন থাকে যেমন কোনও গণনা বা কোনও উপায়ে ডেটা ম্যানিপুলেশন করা। এটিই এমন পার্শ্ব প্রতিক্রিয়াগুলি পেতে পারেন যা কিছু ক্ষেত্রে অপ্রত্যাশিত বা অনাকাঙ্ক্ষিত হতে পারে।

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

যদি আপনি সেটার ইনপুটটি কোনও ধরণের হেরফের প্রয়োগ করেন তবে আপনি যেমনটি পান ঠিক তেমন নামকরণের মাধ্যমে সেটার কী করছে তা অন্যকে জানানো মুশকিল that উদাহরণ স্বরূপ:

MyClass.Value = 12345;

এটি যখন সেটটারকে দেওয়া হয় তখন মানটির কী হতে চলেছে সে সম্পর্কে এটি আপনাকে কিছু বলবে?

কেমন:

MyClass.RoundValueToNearestThousand(12345);

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

আমি কি ঠিক বলেছি যে এটির সাথে প্রথম স্থানে গেটার এবং সেটটার স্থাপনের উদ্দেশ্যটি সম্পূর্ণরূপে পরাজিত হবে এবং বৈধতা এবং অন্যান্য যুক্তি (অবশ্যই কোনও অদ্ভুত পার্শ্ব প্রতিক্রিয়া ছাড়াই) অনুমতি দেওয়া উচিত?

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

বৈধতা কখন হওয়া উচিত?

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

কোনও সেটারকে মান পরিবর্তন করার অনুমতি দেওয়া হয়েছে (সম্ভবত কোনও বৈধ মানকে কিছু অভ্যন্তরীণ উপস্থাপনায় রূপান্তর করতে পারে)?

খুব বিরল ক্ষেত্রে, সম্ভবত। সাধারণভাবে, এটি না করাই সম্ভবত ভাল। এটি অন্য পদ্ধতিতে ভালভাবে সাজানো জিনিস।


পুনরায়: মান পরিবর্তন করুন, সেটারটি কোনও অবৈধ মান পাস করা হলে এটি -1 বা কিছু NUL পতাকা টোকেন সেট করা যুক্তিসঙ্গত হতে পারে
মার্টিন Beckett

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

হ্যাঁ, একটি সেটারের একটি যৌক্তিকতা হল মানটি সেট করা যায় তবে এটি সত্য / মিথ্যা প্রত্যাবর্তন করা উচিত।
মার্টিন বেকেট

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

2
আমি মানকে বৈধতার একটি রূপ হিসাবে একটি প্রমিত উপস্থাপনায় দেখছি। অনুপস্থিত মানগুলি ডিফল্ট করা (উদাহরণস্বরূপ, যদি কোনও টাইমস্ট্যাম্পে কেবলমাত্র সময় থাকে তবে বর্তমান তারিখ) বা অভ্যন্তরীণ ধারাবাহিকতাটি ঠিক হওয়া উচিত কিনা তা নিশ্চিত করার জন্য একটি মান (.93275 -> 93.28%) স্কেলিং করা উচিত, তবে এ জাতীয় যে কোনও হেরফেরগুলি স্পষ্টভাবে API ডকুমেন্টেশনে ডেকে আনা উচিত বিশেষত যদি তারা এপিআই-এর মধ্যে অস্বাভাবিক পরিচয় হয়।
TMN

20

যদি প্রাপ্তকারী / সেটারটি কেবল মূল্যটি আয়না করে তবে সেগুলি রাখার, বা মানটি ব্যক্তিগত করার কোনও মানে হয় না। আপনার কাছে যদি কোনও ভাল কারণ থাকে তবে কিছু সদস্য ভেরিয়েবলগুলি সর্বজনীন করার ক্ষেত্রে কোনও ভুল নেই। আপনি যদি 3 ডি পয়েন্ট শ্রেণি লিখছেন তবে .x, .y, .z জনসাধারণের সঠিক ধারণা থাকা যায়।

যেমন র‌্যাল্ফ ওয়াল্ডো এমারসন বলেছিলেন, "একটি বোকামি ধারাবাহিকতা হ'ল সামান্য মনের হাবগোব্লিন, সামান্য রাজ্যবিদ এবং দার্শনিক এবং জাভার ডিজাইনারদের দ্বারা সজ্জিত।"

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

তাদের অভ্যন্তরীণ কাঠামোটি লুকিয়ে রাখার জন্য তাদের যথাযথ ন্যায়সঙ্গততা সাধারণত সবচেয়ে কার্যকর least যেমন। আমার এই পয়েন্টগুলি 3 টি ফ্লোট হিসাবে সঞ্চিত আছে, আমি এগুলি একটি দূরবর্তী ডাটাবেসে স্ট্রিং হিসাবে সংরক্ষণ করার সিদ্ধান্ত নিতে পারি তাই আমি তাদের আড়াল করার জন্য গেটস / সেটারগুলি তৈরি করব, যেন আপনি কলারের কোডের কোনও প্রভাব না ফেলেই এটি করতে পারেন।


1
বাহ, জাভার ডিজাইনাররা দিব্যি? </jk>

@ ডেলান - স্পষ্টতই নয় - বা তারা আরও ভাল ছড়াবে ;-)
মার্টিন বেকেট

এমন কোনও 3 ডি পয়েন্ট তৈরি করা বৈধ হবে যেটিতে x, y, z সমস্ত ফ্লোট রয়েছে? এনএন?
অ্যান্ড্রু টি ফিনেল

4
আমি আপনার এই মতামতের সাথে একমত নই যে "সাধারণ ন্যায়সঙ্গততা" (অভ্যন্তরীণ কাঠামো আড়াল করা) হ'ল গ্রাহক এবং সেটারের কমপক্ষে দরকারী সম্পত্তি। সি #, এটা স্পষ্টভাবে সম্পত্তি একটি ইন্টারফেস যার অন্তর্নিহিত কাঠামো পরিবর্তন করা যাবে করতে দরকারী - উদাহরণস্বরূপ, আপনি শুধুমাত্র শুমার জন্য একটি সম্পত্তি উপলভ্যতা চাইবেন, এটা অনেক ভালো বলতে এর IEnumerable<T>এটা ভালো কিছু করার জন্য বাধ্য চেয়ে List<T>। আপনার যে ডাটাবেস অ্যাক্সেসের উদাহরণটি আমি বলব তা একক দায়িত্ব লঙ্ঘন করছে - মডেলটির প্রতিনিধিত্বকে কীভাবে বজায় রাখা হয় তা মিশ্রিত করে।
ব্র্যান্ডন লিন্টন

@ অ্যান্ড্রুফিনেল - এটি অসম্ভব / বৈধ / মুছে ফেলা ইত্যাদি হিসাবে পতাকাঙ্কিত পয়েন্টগুলির একটি ভাল উপায় হতে পারে
মার্টিন বেকেট

8

মায়ারের ইউনিফর্ম অ্যাক্সেস নীতি: "মডিউল দ্বারা প্রদত্ত সমস্ত পরিষেবাগুলি অভিন্ন স্বরলিপি দ্বারা উপলব্ধ হওয়া উচিত, যা সেগুলি স্টোরেজ বা গণনার মাধ্যমে প্রয়োগ করা হয়েছে তা বিশ্বাসঘাতকতা করে না।" গেটার্স / সেটটার্স, ওরফে প্রোপার্টিগুলির পিছনে মূল কারণ।

আপনি যদি কোনও শ্রেণীর একটি ক্ষেত্রকে ক্যাশে বা অলসভাবে গণনা করার সিদ্ধান্ত নেন তবে আপনি যদি কেবলমাত্র সম্পত্তির অ্যাক্সেসরগুলি প্রকাশ করেছেন এবং কংক্রিটের ডেটা না রেখে আপনি যেকোন সময় এটি পরিবর্তন করতে পারেন।

মান অবজেক্টস, সাধারণ কাঠামোগুলিকে এই বিমূর্ততা প্রয়োজন হয় না তবে আমার মতে একটি সম্পূর্ণ বর্ধিত শ্রেণীর প্রয়োজন।


2

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

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

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

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

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


1

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


1

সম্পত্তি অ্যাক্সেসর এবং আইভারগুলিতে ডেটা সঞ্চয়কারীদের মধ্যে সর্বদা 1-1 ম্যাপিং থাকে না।

উদাহরণস্বরূপ, একটি ভিউ শ্রেণীর centerকোনও আইভার রয়েছে যা ভিউটির কেন্দ্রস্থলে রাখে এমন কোনও সম্পত্তি সরবরাহ করতে পারে; সেটিং centerঅন্যান্য আইভারগুলিতে পরিবর্তন আনতে পারে, যেমন originবা transformযাই হোক না কেন, তবে ক্লাসের ক্লায়েন্টরা কীভাবে center সংরক্ষণ করা হয় তা জানে না বা যত্ন করে না যে এটি সঠিকভাবে কাজ করে। যাইহোক, যা হওয়া উচিত নয় তা হ'ল সেটিংসের centerফলে নতুন মান সংরক্ষণের জন্য প্রয়োজনীয় সমস্ত কিছু ছাড়িয়ে যা ঘটেছিল তা হয়ে যায়।


0

সেটার এবং গেটার্স সম্পর্কে সর্বোত্তম অংশটি হ'ল তারা এপিআই পরিবর্তন না করে কোনও এপিআইয়ের নিয়মগুলি পরিবর্তন করা সহজ করে। আপনি যদি কোনও বাগ সনাক্ত করেন তবে এটি অনেক বেশি সম্ভাবনা রয়েছে যে আপনি লাইব্রেরিতে বাগটি ঠিক করতে পারবেন এবং প্রতিটি ভোক্তাকে তার কোড বেস আপডেট করতে পারবেন না।


-4

আমি বিশ্বাস করি যে সেটার এবং গিটারগুলি দুষ্ট এবং কেবল একটি ফ্রেমওয়ার্ক / ধারক দ্বারা পরিচালিত ক্লাসগুলিতে ব্যবহার করা উচিত। একটি যথাযথ শ্রেণীর নকশায় গ্রাহক এবং সেটর দেওয়া উচিত নয়।

সম্পাদনা করুন: এই বিষয়ে একটি ভাল লেখা

সম্পাদনা 2: সর্বজনীন ক্ষেত্রগুলি একটি ওওপি পদ্ধতির একটি বাজে কথা; এই বলে যে গেটার্স এবং সেটটাররা খারাপ, আমি এর অর্থ এই নয় যে তাদের পাবলিক ফিল্ডগুলি প্রতিস্থাপন করা উচিত।


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

@ এস রবিন্স আমার মতে পাবলিক গেটার্স এবং সিটারগুলি ভুল; সর্বজনীন ক্ষেত্রগুলি আরও ভুল (যদি এটি তুলনামূলক হয়)।
m3th0dman

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

@ এস রবিনস ওওপি এবং মডেলিংয়ের মূল বিষয়গুলি সম্পর্কে ভাবেন; অবজেক্টগুলি রিয়েল-লাইফ সত্ত্বাকে অনুলিপি করার কথা। সত্যিকারের জীবন সত্তা রয়েছে যাঁর এই ধরণের অপারেশন / বৈশিষ্ট্য যেমন গেটার্স / সেটারগুলি রয়েছে?
m3th0dman

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