যদি কোনও ভেরিয়েবলের গেটর এবং সেটার থাকে তবে এটি সর্বজনীন হওয়া উচিত?


23

আমার একটি ভেরিয়েবল সহ একটি ক্লাস রয়েছে যা ব্যক্তিগত এবং ক্লাসটির সেই ভেরিয়েবলের জন্য একটি গেটর এবং একটি সেটার রয়েছে। কেন এই পরিবর্তনশীল পাবলিক না?

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

void my_class::set_variable(int x){
   /* Some operation like updating a log */
   this->variable = x;
}

10
গেটার্স এবং সেটটাররা shাল দেওয়ার জন্য রয়েছে। this->variable = x + 5কোনও দিন আপনি যা করতে চাইতে পারেন বা UpdateStatisticsসেটারে কোনও ফাংশন কল করতে পারেন এবং এই ক্ষেত্রে classinstancea->variable = 5সমস্যা দেখা দিতে পারে।
কোডার

1
আরেকটি উদাহরণ হল: set_inch, set_centimeter, get_inch, get_centimeter, কিছু ভুতুড়ে কর্মের।
rwong

হ্যাঁ, গিটারস এবং সেটটাররা আপনার ইভেন্টের ভেরিয়েবলগুলি যেভাবে আপনি নিয়ন্ত্রণ করতে চান তাতে নিয়ন্ত্রণ করতে সহায়তা করে।
বিকাশকারী

7
@ কোডার: যখন প্রয়োজন দেখা দেয় আপনি সর্বদা আপনার গেটার / সেটার যুক্ত করতে পারেন? অথবা এটি এমন কি যা আপনি সহজেই সি ++ এ করতে পারবেন না (আমার অভিজ্ঞতা বেশিরভাগই ডেলফি)?
মার্জন ভেনেমা

এই প্রশ্ন: প্রোগ্রামার্স.স্ট্যাকেক্সচেঞ্জ / প্রশ্ন / 21802 /… আগ্রহী হতে পারে।
উইনস্টন ইওয়ার্ট

উত্তর:


21

আপনি কি কখনও একটি সম্পত্তি সম্পর্কে শুনেছেন?

একটি সম্পত্তি হ'ল ক্ষেত্র যা "বিল্ট-ইন" অ্যাকসেসর (গেটার্স এবং সেটটার) রয়েছে। জাভা, উদাহরণস্বরূপ, বৈশিষ্ট্য নেই, তবে এটি একটি বেসরকারী ক্ষেত্রে getters এবং সেটটার লিখতে প্রস্তাবিত recommended সি # এর বৈশিষ্ট্য রয়েছে।

সুতরাং, কেন আমাদের গেটার এবং সেটটারগুলি দরকার? মূলত ক্ষেত্রটি রক্ষা / to াল দেওয়ার জন্য আমাদের এটি প্রয়োজন । উদাহরণস্বরূপ, আপনি মেমরি রেফারেন্সে ক্ষেত্রটি অ্যাক্সেস করছেন না, আপনি এমন একটি পদ্ধতিতে অ্যাক্সেস করছেন যা ক্ষেত্রটি (রেফারেন্স) পরিবর্তন করবে। এই পদ্ধতিটি এমন কিছু ক্রিয়াকলাপ সম্পাদন করতে সক্ষম যা কোনও ব্যবহারকারী আপনার উদাহরণের মতো জানতে ( অ্যাঙ্কপুলেটিং আচরণ ) জানতে ইচ্ছুক নয় । উদাহরণস্বরূপ, কল্পনা করুন যে এক ডজন ক্লাস আপনার সার্বজনীন ক্ষেত্র ব্যবহার করে এবং আপনার ব্যবহারের পদ্ধতিটি বদলাতে হবে ... ক্ষেত্রটি ব্যবহার করার পদ্ধতিটি পরিবর্তনের জন্য আপনাকে সেই ক্লাসগুলির প্রত্যেকের দিকে নজর দিতে হবে ... না সুতরাং "অলিশ"।

তবে, উদাহরণস্বরূপ, আপনার যদি বুলিয়ান ক্ষেত্র মৃত বলে থাকে। সেটডিড এবং আইসডিড ঘোষণার আগে আপনার দুবার চিন্তা করা উচিত। আপনার এমন অ্যাক্সেসরগুলি লিখতে হবে যা মানব পাঠযোগ্য , উদাহরণস্বরূপ, সেটডিয়েডের পরিবর্তে কিল () মেরুন।

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


2
এখন "মানব পাঠযোগ্য" অবশেষে একটি যুক্তি যা আমি করতে পারি "কুঁকড়ে"। অন্য সমস্ত যুক্তি যা আমি সাধারণত শুনে থাকি তা
হ'ল

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

2
আপনি আসলে একটি দুর্দান্ত পয়েন্ট উত্থাপন। কিল সেট / গেট নয়, এটি একটি ক্রিয়া। এটি সম্পূর্ণরূপে বাস্তবায়নটি গোপন করে - এটি আপনার কোডকে কীভাবে করা হয়। অন্যদিকে প্রোপার্টি, সেটার / গেটার্সের মতো নির্বোধ - বোকা এমনকি এমনকি সহজ বাক্যবিন্যাস লোকেদের যখন তাদের প্রয়োজন হয় না তখন কেবল তাদেরকে ভেরিয়েবলগুলিতে যুক্ত করতে উত্সাহ দেয় (ওও-ফুরবার ঘটনার অপেক্ষায়)। কারা কারা ব্যবহার করবেন তা ভাববেন () যখন তারা কেবল তাদের মৃত পতাকায় "সম্পত্তি" ট্যাগ যুক্ত করতে পারে?
বিল কে

1
প্রশ্নটি একটি সি ++ প্রশ্ন ট্যাগ করা হয়। সি ++ বৈশিষ্ট্যগুলি সমর্থন করে না, তবে আপনি কেন এটি পোস্ট করবেন?
থমাস এডিং

1
@ থমাসডিং: অতিমাত্রায় অ্যাসাইনমেন্ট অপারেটর থাকার ক্ষেত্রে সি ++ কিছুটা অনন্য। যদিও সি ++ "সম্পত্তি" শব্দটি সি # বা ভিবি.এনইটের মতো ভাষার মতো ব্যবহার করে না, ধারণাটি এখনও আছে। অপারেটর ওভারলোডিং ব্যবহার করা সি ++ তে সম্ভব এটি যাতে মূল্যায়ন foo.bar = biz.baz+5করার bizজন্য কোনও ফাংশন কল করবে baz, তারপরে এটিতে পাঁচটি যুক্ত করুন এবং ফলাফলটিকে মান হিসাবে fooসেট barকরতে একটি ফাংশন কল করুন call এই ধরনের ওভারলোডগুলিকে "বৈশিষ্ট্য" বলা হয় না, তবে তারা একই উদ্দেশ্যে কাজ করতে পারে।
সুপারক্যাট

25

এটি সর্বাধিক জনপ্রিয় মতামত নয় তবে আমি খুব বেশি পার্থক্য দেখছি না।

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

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

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

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

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

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

যাইহোক, আমি কোনওভাবেই পাবলিক ভেরিয়েবলের পক্ষে পরামর্শ দিচ্ছি না - আমি বলছি সেটার এবং গেটার্স (এবং এমনকি বৈশিষ্ট্যগুলি) ইতিমধ্যে পাবলিক ভেরিয়েবল হওয়ার খুব কাছে।

বড় সমস্যাটি হ'ল ওও প্রোগ্রামার নয় এমন লোকেরা সম্পত্তি বা বল (স্ট্রাকচার )গুলিতে বস্তু তৈরি করার জন্য সেটার এবং গেটার্স ব্যবহার করতে খুব প্রলুব্ধ হয় যা অবজেক্ট ওরিয়েন্টেড কোড কীভাবে কাজ করে তার বিপরীতে।


গেটর সেটার সম্পর্কে এখানে অন্যান্য উত্তরগুলি বাদ দিয়ে একটি ভাল জিনিস হ'ল প্রকৃত বেসরকারী ভেরিয়েবলের মান হওয়ায় আমি এর ভিতরে কিছু বৈধতা / রূপান্তর যুক্ত করতে পারি।
উইনডাব্লু

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

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

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

1
পরিবর্তনীয় অবস্থা গ্রহণযোগ্য, তবে আবার আপনার নিজের অবজেক্টকে আপনার জন্য কিছু করতে বলা উচিত, আপনার বস্তুর সাথে কিছু করা উচিত না - তাই আপনি যখন নিজের রাজ্যকে পরিবর্তন করেন তখন কোনও সেটার এটি করার কোনও দুর্দান্ত উপায় নয়, যুক্তি দিয়ে একটি ব্যবসায়িক পদ্ধতি লেখার চেষ্টা করুন পরিবর্তে এটি। উদাহরণস্বরূপ, "সেটজেড লোকেশন (getZLocation () + 5) এর চেয়ে" সরান (আপ 5) "।
বিল কে

8

গেটার্স এবং সেটটারগুলির ব্যবহারকারী এনক্যাপসুলেশন নীতিতে যায় । এটি আপনাকে শ্রেণীর অভ্যন্তরে কীভাবে জিনিসগুলি কাজ করে এবং সবকিছুকে কার্যকর রাখে তা পরিবর্তন করতে দেয়।

উদাহরণস্বরূপ, যদি অন্য 3 টি অবজেক্ট foo.barবারের মান পেতে কল করে এবং আপনি বারটির নাম পরিবর্তন করার সিদ্ধান্ত নেন তবে আপনার নিজের হাতে সমস্যা আছে। যদি foo.barআপনাকে বলা বস্তুগুলি এই থাকে তবে সমস্ত ক্লাস পরিবর্তন করতে হবে। যদি কোনও সেটার / গেটর ব্যবহার করা হয় তবে আপনার পরিবর্তন করার কিছুই নেই। আর একটি সম্ভাবনা ভেরিয়েবলের ধরণের পরিবর্তন করছে যাতে সেক্ষেত্রে গেটর / সেটারে কিছু রূপান্তর কোড যুক্ত করুন এবং আপনি ভাল আছেন।


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

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

@ মার্জান শিওর, আপনি পরে যেকোন সময় গেটটার / সেটারটি পরিচয় করিয়ে দিতে পারেন। তারপরে সমস্যাটি হ'ল আপনাকে ফিরে যেতে হবে এবং গিটার / সেটারের পরিবর্তে সমস্ত কোড যা পাবলিক ফিল্ড ব্যবহার করছিল তা পরিবর্তন করতে হবে। আমি নিশ্চিত না যে আমিই যে বিভ্রান্ত সে আপনি বা আপনি or 0.o
পিট

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

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

5

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

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


অনেক ধন্যবাদ! আমি আপনি উল্লেখ একই ক্ষেত্রে চিন্তা ছিল। যদি আমি কোনও পরিবর্তনশীল সামগ্রী হতে চান তবে [0,1] আমার তার সেটারে আগত মানটি পরীক্ষা করা উচিত :)
ওনি

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

আপনি যদি সি # ব্যবহার করছেন তবে বৈশিষ্ট্যগুলি ব্যবহার করুন, আপনি যদি সম্পত্তিটির সেটার অংশে কিছু যুক্তির ভিত্তিতে প্রয়োজন হয় তবে প্রাইভেট উদাহরণ সেট করতে আপনি কোনও সম্পত্তি ব্যবহার করতে পারেন।
বিকাশকারীরা

2

আপনি বলছেন "কেবলমাত্র আমি মনে করি আপনাকে গেটর এবং সেটারগুলি ব্যবহার করতে হবে যদি সেট বা গেটের পাশাপাশি কিছু অপারেশন করতে হয় তবে"।

ভবিষ্যতে কিছু সময়ে যদি আপনি getters এবং setters ব্যবহার করা উচিত পারে সেট ব্যতীত কিছু অপারেশন এবং পেতে প্রয়োজন এবং আপনি সোর্স কোড লাইনের হাজার হাজার পরিবর্তন করতে যখন যে ঘটবে না।

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


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

1

প্রথমে দৃষ্টান্তটি পরিষ্কার করা যাক।

  • ডেটা স্ট্রাকচারস -> মেমরির একটি লেআউট যা উপযুক্ত জ্ঞানীয় ফাংশন দ্বারা ট্র্যাভারসড এবং হেরফের করা যায় can
  • অবজেক্টস -> একটি স্ব অন্তর্ভুক্ত মডিউল যা এর বাস্তবায়নটি গোপন করে এবং একটি ইন্টারফেস সরবরাহ করে যা মাধ্যমে যোগাযোগ করা যেতে পারে।

একজন গেটর / সেটার কোথায় দরকারী?

প্রাপ্তি / সেটটাররা ডেটা স্ট্রাকচারগুলিতে কি কার্যকর? না।

ডেটা স্ট্রাকচার হ'ল মেমোরি লেআউট স্পেসিফিকেশন যা সাধারণ এবং ফাংশনগুলির একটি পরিবার দ্বারা ম্যানিপুলেট।

সাধারণত কোনও পুরানো নতুন ফাংশনটি উপাত্ত-কাঠামোটি নিয়ে আসে এবং তা হস্তান্তর করতে পারে, যদি এটি এমনভাবে করে যাতে অন্যান্য ফাংশনগুলি এখনও এটি বুঝতে পারে, তবে ফাংশনটি পরিবারে যোগ দেয়। অন্যথায় এটি একটি দুর্বৃত্ত ফাংশন এবং বাগগুলির উত্স।

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

জঞ্জাল ক্রমবর্ধমান ফাংশনগুলি পরিবারগুলি অর্জন করতে পারে, এমন কি ডেটা স্ট্রাকচারটি এনকোড করার কোনও উপায় আছে যাতে দুর্বৃত্ত ফাংশনগুলি সমস্ত গোলমাল না করে? হ্যাঁ, তাদের বলা হয় অবজেক্টস।

গেটার / সেটাররা কি অবজেক্টে দরকারী? না।

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

গেটর এবং সেটারের পয়েন্ট / উদ্দেশ্য হ'ল অবজেক্টের বাইরের ফাংশনগুলিকে সরাসরি বস্তুর মেমরি লেআউটটিকে পরিবর্তন করতে দেওয়া। দুর্বৃত্তদের অনুমতি দেওয়ার জন্য এটি একটি মুক্ত দরজার মতো শোনাচ্ছে ...

এজ কেস

দুটি পরিস্থিতি একটি পাবলিক গেটার / সেটার বোধগম্য ছিল।

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

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

দুর্ভাগ্যক্রমে অনেক বাস্তবায়ন এটিকে ভুল করে এবং প্রকৃত বস্তুর সরাসরি অ্যাক্সেস দিতে এই ধরণের বস্তুর ইন্টারফেসটিকে সংজ্ঞায়িত করে। কিছুটা এইরকম:

interface Container<T>
{
    typedef ...T... TRef; //<somehow make TRef to be a reference or pointer to the memory location of T
    TRef item(int index); 
}

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

আপনি কেবল অনুলিপি-শব্দার্থক শব্দ ব্যবহার করে বা প্রক্সি ব্যবহার করে গেটার / সেটারকে উন্নত / সংশোধন করতে পারেন:

interface Proxy<T>
{
     operator T(); //<returns a copy
     ... operator ->(); //<permits a function call to be forwarded to an element
     Proxy<T> operator=(T); //< permits the specific element to be replaced/assigned by another T.
}

interface Container<T>
{
     Proxy<T> item(int index);
     T item(int index); //<When T is a copy of the original value.
     void item(int index, T new_value); //<where new_value is used to replace the old value
}

যুক্তিযুক্তভাবে একটি দুর্বৃত্ত ফাংশন এখানে এখনও মারামারি খেলতে পারে (পর্যাপ্ত প্রচেষ্টার সাথে বেশিরভাগ জিনিস সম্ভব) তবে কপি-শব্দার্থবিজ্ঞান এবং / বা প্রক্সি বেশ কয়েকটি ত্রুটির সম্ভাবনা হ্রাস করে।

  • টলমলানি
  • underflow
  • উপ-উপাদানটির সাথে মিথস্ক্রিয়াগুলি হ'ল টাইপ-চেকড / টাইপ-চেকযোগ্য (টাইপ হেরে যাওয়া ভাষাগুলিতে এটি একটি উত্সাহ))
  • আসল উপাদান মেমরির বাসিন্দা হতে পারে বা নাও হতে পারে।

প্রাইভেট গেটার / সেটার্স

এটি হ'ল গ্রাহক ও সেটটারদের শেষ ঘাঁটি যা সরাসরি টাইপটিতে কাজ করে। আসলে আমি এই গেটর এবং সেটটারগুলিকেও কল করতে পারি না তবে অ্যাকসেসর এবং ম্যানিপুলেটরগুলি।

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

ব্যক্তিগত প্রসঙ্গে, পরিবারের অন্যান্য ক্রিয়াকলাপগুলির পক্ষে এই 'গেটারস এবং সিটারস'-এর পক্ষ-পদক্ষেপ নেওয়া এবং ডেটা স্ট্রাকচারটি সামাল দেওয়া সম্ভব। তাই আমি কেন তাদের আরও সহায়ক এবং কারচুপি হিসাবে বিবেচনা করি। আপনি সরাসরি ডেটা অ্যাক্সেস করতে পারেন, বা অংশটি সঠিকভাবে পেতে অন্য পরিবারের সদস্যের উপর নির্ভর করতে পারেন।

সুরক্ষিত গেটার / সেটার্স

সুরক্ষিত প্রসঙ্গে, এটি জনসাধারণের প্রেক্ষাপটে মারাত্মকভাবে পৃথক নয়। বিদেশী সম্ভবত দুর্বৃত্ত ফাংশনগুলি ডেটা-কাঠামোটিতে অ্যাক্সেস চায়। সুতরাং না, যদি তাদের উপস্থিতি থাকে তবে তারা পাবলিক গেটার / সেটটারগুলির মতো কাজ করে।


0

সি ++ অভিজ্ঞতা থেকে, সেটটার / গিটার 2 টি পরিস্থিতিতে জন্য সহায়ক:

  1. স্ট্রিং বা অ্যারের মতো সদস্যকে মান নির্ধারণের আগে যদি আপনাকে স্যানিটি চেক করতে হয়।
  2. এটি কার্যকর হতে পারে যখন ফাংশন ওভারলোডিং-এর যখন -1 (বা নেতিবাচক মান) মিথ্যা থাকে তার জন্য বুল এসাইনমেন্টের মতো int মানের মতো প্রয়োজন হয়। এবং প্রাপ্তির জন্য বিপরীত।

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

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