গ্রাহকদের অনুমতি দেওয়ার সাথে একটি সুনির্দিষ্ট সমস্যা কী?


15

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

আমি সমস্ত যুক্তি শুনেছি, আমি শুনেছি যে তারা খারাপ কারণ তারা আপনাকে তথ্য উত্স হিসাবে বস্তুর সাথে আচরণ করতে বাধ্য করে যে তারা কোনও বস্তুর "খাঁটি অবস্থা" লঙ্ঘন করে "খুব বেশি কিছু দেয় না তবে প্রস্তুত থাকে" অনেক গ্রহণ "।

তবে একে একে কেন getDataখারাপ জিনিস বলে বোঝার কোনও কারণ নেই , আসলে কিছু লোক যুক্তি দেখিয়েছিলেন যে এটি শব্দার্থবিজ্ঞান সম্পর্কে অনেক কিছুই, প্রতি-সে-হিসাবে জরিমানা, তবে কেবল তাদের নাম রাখবেন না getX, আমার কাছে এটি অন্তত মজার ।

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

অবশ্যই যে কোনও স্ট্রিংয়ের জন্য গেটরকে কিছু এনক্রিপ্ট করার জন্য ব্যবহার করার অনুমতি দেওয়া বোবা ছাড়িয়ে যাওয়া, কিন্তু আমি এমন ডেটা নিয়ে কথা বলছি যা আপনার সিস্টেমে কাজ করতে হবে। হতে পারে আপনার ডেটাটি Providerঅবজেক্ট থেকে কোনও মাধ্যমে টানা হয়েছে , তবে, এখনও, অবজেক্টটিকে এখনও এটি Providerকরার অনুমতি দেওয়া দরকার $provider[$object]->getData, এর আশেপাশে কোনও উপায় নেই।


আমি কেন জিজ্ঞাসা করছি: আমার কাছে, প্রাপ্তরা, যখন বোধগম্যভাবে এবং যখন "নিরাপদ" হিসাবে গণ্য করা হয় এমন ডেটা ব্যবহার করা হয় তখন godশ্বর-প্রেরিত হয়, আমার ters৯% গিটারটি কোডটির মাধ্যমে জিজ্ঞাসা করে, বস্তুটি সনাক্ত করতে ব্যবহৃত হয় Object, what is your name? Object, what is your identifier?, যে কোনও বস্তুর সাথে কাজ করা যেকোন বস্তুর সম্পর্কে এই জিনিসগুলি জানা উচিত, কারণ প্রোগ্রামিংয়ের প্রায় সমস্ত কিছুই পরিচয় এবং এটি বস্তুর চেয়ে অন্য কে ভাল জানেন? সুতরাং আপনি যদি পিউরিস্ট না হন তবে আমি কোনও বাস্তব সমস্যা দেখতে ব্যর্থ।

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

একটি সেটার আপনার অবজেক্টের সনাক্তকরণের সাথে আপস করবে এবং ডেটা পরিবর্তন করছে এমনটি ডিবাগ করা খুব কঠিন করে তুলবে, তবে প্রাপ্তি কিছুই করছে না।


2
আমার পরামর্শ ওও তত্ত্বের বেশিরভাগ ক্ষেত্রে ভুলে গেছে। অনুশীলন করা. প্রচুর কোড লিখুন এবং তারপরে এটি বজায় রাখুন। আপনি কোন কিছু ভাল কাজ করে এবং কোন কিছু আসলে কী করে না এবং এর কয়েক মাস পরে ফিরে যেতে পারে সে সম্পর্কে আপনি অনেকদূর, আরও অনেক কিছু শিখবেন।
jpmc26

1
@ jpmc26 মায়ের মধ্যে .... আমি আসলে কখনই বুঝতে পারি নি যে আমরা কেউই আসলে ওওপি সঠিকভাবে করি না, আমি সবসময়ই কোনও বস্তুর ক্ষেত্রের সাথে কঠোরভাবে আবদ্ধ হওয়ার এই ধারণাটি পেয়েছি তবে অবজেক্টটি নিজেই একটি রাষ্ট্র এবং এটি হচ্ছে অবাধে ভাগ করা। প্রকৃতপক্ষে প্রত্যেকেই ওওপি ভুল করছে, তারপরে বা বরং, প্যারাডাইমটি অবজেক্ট হলে ওওপি সম্ভব নয়। কোনও সিস্টেম কীভাবে কাজ করে এবং কখনই এটিকে পবিত্র গ্রেইল হিসাবে বিবেচনা করে না বা SOLID হিসাবে প্রকাশ করার জন্য আমি কঠোরভাবে ওওপি ব্যবহার করি। এগুলি কেবলমাত্র আমার ধারণাগুলির যুক্তিসঙ্গত সুপরিচিত (বাস্তবায়নের মাধ্যমে) সংজ্ঞায়িত করতে আমি বেশিরভাগ ব্যবহার করি। এই সঠিক যদি কোন পড়া?
শীতলপস্তার

2
- কনট, আমি যত বেশি লিখছি, যত বেশি আমি বুঝতে পারি যে প্রোগ্রামিং হ'ল ততটুকু বিমূর্ত করতে সক্ষম হওয়া যেমন যুক্তি অর্জনে সক্ষম হতে পারে, অন্যের কাছেও তেমনি আপনার কোডবেস সম্পর্কে। অবশ্যই, এর প্রযুক্তিগত দিকটি নিশ্চিত করা হচ্ছে যে আপনি সঠিক চেকগুলি করেছেন / সঠিক নিয়মগুলি সেট করেছেন। সত্যিকার অর্থে, যে কেউ অন্যকে তাদের কোড বোঝার জন্য আরও ভাল জিতায়। এটি যে কারও কাছে পড়ার পক্ষে তা বোধগম্য হয়েছে তা নিশ্চিত করুন, তারপরে নিশ্চিত হয়ে নিন যে ইন্টারফেস, চেকগুলি সহ সঠিকভাবে বস্তুগুলিকে ভাগ করে যখন এটির সাথে যুক্তি করা সহজ হয় তখন নমনীয় হন:
কুলপস্তার 6'19

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

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

উত্তর:


22

আপনি গেটার্স ছাড়া ভাল কোড লিখতে পারবেন না।

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

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

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

সত্যই ওওপি এমন কিছু নয় যা আপনি সর্বত্র ছড়িয়ে দিতে পারেন। এটি কেবল সেই সীমার মধ্যেই কাজ করে।

এই গণ্ডিগুলি ক্ষুরের পাতলা নয়। তাদের মধ্যে কোড রয়েছে। এই কোডটি ওওপি হতে পারে না। এটি কার্যকরীও হতে পারে না। এই কোডের কোনওটিই আমাদের আদর্শগুলি থেকে সরে যায় নি যাতে এটি কঠোর বাস্তবতার সাথে মোকাবিলা করতে পারে।

মাইকেল ফিটারস সেই সাদা সংযোগকারী টিস্যুর পরে এই কোডটিকে ফ্যাসিয়া বলে called

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

আদর্শগুলি কেবল তাদের যথাযথ জায়গায় কাজ করে। তারা সর্বত্র কাজ করে না বলে তাদের ছেড়ে দেবেন না। তারা যেখানে কাজ করে সেখানে তাদের ব্যবহার করুন। সেই জায়গাটি হ'ল সরস অংশ যা fascia সুরক্ষা দেয়।

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

এখন আপনি যদি জানতেন, আপনি সেই আচরণটি সরিয়ে ফেলতে পারেন, এবং স্থিতিশীল অবস্থা এড়াতে পারেন। যখন আপনি জানেন, আপনার উচিত। আপনি শুধু সবসময় জানেন না।

কিছু লোক একে একে যুক্তিবাদী বলে অভিহিত করে। এবং এটা করা হয়. তবে কেন আমাদের ব্যবহারিক হতে হবে তা জানতে পেরে ভালো লাগল।


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

আপনি যদি চান সর্বত্র পাইথনের দিকে তাকান। এখানে কোনও ব্যক্তিগত কীওয়ার্ড নেই। তবু পাইথন ওওওপি ঠিক জরিমানা করে। কিভাবে? তারা একটি শব্দার্থক কৌশল ব্যবহার করে। তারা নেতৃস্থানীয় আন্ডারস্কোর সহ প্রাইভেট হওয়ার জন্য যে কোনও কিছু নাম রাখে name এমনকি আপনি এটি থেকে পড়ার অনুমতি পেয়েছেন তবে আপনি যদি এটি করার জন্য দায়িত্ব গ্রহণ করেন তবে take "আমরা সবাই এখানে প্রাপ্তবয়স্ক", তারা প্রায়শই বলে।

সুতরাং যে মধ্যে পার্থক্য কি এবং জাভা বা সি # সব কিছু মধ্যে getters স্থাপন? দুঃখিত তবে এটি শব্দার্থবিজ্ঞান। পাইথনস আন্ডারস্কোর কনভেনশন আপনার কাছে স্পষ্টভাবে ইঙ্গিত দেয় যে আপনি কর্মীদের কেবল দরজার পিছনে হাঁটাচ্ছেন। সবকিছুর উপরে চড় মারতে হবে এবং আপনি সেই সিগন্যালটি আলগা করুন। প্রতিবিম্বের সাহায্যে আপনি যে কোনও উপায়ে প্রাইভেটটি ছিনিয়ে নিতে পারেন এবং এখনও সিনেমিক সিগন্যালটি হারাতে পারেননি। এখানে তৈরি করার জন্য কোনও কাঠামোগত যুক্তি নেই।

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

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

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

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

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


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

1
@ কুলপাস্ট আপনি ডেটা মালিকের অবজেক্ট তৈরি করতে পারবেন। ডেটা মালিকের অবজেক্টগুলি হ'ল ডেটা অবজেক্ট, তবে সেগুলি ডিজাইন করে নামকরণ করা হয় যাতে তারা (স্পষ্টভাবে) ডেটাটির মালিক হয়। অবশ্যই এই জিনিসগুলির গ্রাহকরা থাকবে।
রওং

1
@ রুং আপনি কী বলতে চাইছেন clearly? যদি মূল্য থেকে , স্পষ্টভাবে, আমার কাছে কোনও কিছু থেকে ডেটা সরবরাহ করা হয় তবে আমার অবজেক্টটি এখন ডেটাটির মালিক, তবে শব্দার্থক দ্বারা, এটি এখনও নেই, এই মুহুর্তে, এটি কেবল অন্য কারও কাছ থেকে ডেটা পেয়েছে। এরপরে সেই ডেটাটিকে নিজস্ব রূপান্তরিত করতে অপারেশন করা উচিত, ডেটাটি স্পর্শ করার মুহুর্তে আপনাকে অবশ্যই শব্দার্থক পরিবর্তন করতে হবে: আপনার নাম হিসাবে ডেটা পেয়েছে $data_from_requestএবং এখন আপনি এটিতে অপারেট করেছেন? এর নাম দিন $changed_data। আপনি অন্যদের কাছে এই ডেটা প্রকাশ করতে চান? একটি গেটর তৈরি করুন getChangedRequestData, তারপরে, মালিকানা স্পষ্টভাবে সেট করা আছে। অথবা এটা?
কুলপস্তার 5'19

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

2
দুর্দান্ত উত্তর!
মাস্টার -

10

আগতরা হলিউডের নীতি লঙ্ঘন করেছে ("আমাদের ডাকবে না, আমরা আপনাকে কল করব")

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

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

একজন গেটর ব্যবহার করে বোঝানো হয় যে আপনার যখন সেই প্রকৃত মূল্য প্রয়োজন তখন যখন আপনি বাস্তবে তা করেন না।

আপনার সম্ভবত সেই কর্মক্ষমতা উন্নতির প্রয়োজন হতে পারে

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


1
আমি বুঝতে পেরেছি এবং আমি আপনার সত্যের সাথে উড়ে যাব, যা আমার জানার দরকার নেই। । তবে আমি এমন একটি জায়গায় পৌঁছেছি যেখানে আমার প্রয়োজন। আমার একটি Generatorঅবজেক্ট রয়েছে যা আমার সমস্ত Itemsবস্তুর মধ্য দিয়ে লুপ করে, তারপরে আরও কিছু করার জন্য getNameপ্রত্যেককে কল করে Item। এ নিয়ে সমস্যা কী? তারপরে, Generatorবিনিময়ে , বিন্যাসিত স্ট্রিংগুলি স্পিট করে। এটি আমার কাঠামোর মধ্যে রয়েছে, যার জন্য আমার তখন উপরে একটি এপিআই রয়েছে যা লোকেরা যা সরবরাহ করে তা ফ্রেমওয়ার্কটিকে স্পর্শ না করে চালাতে ব্যবহার করতে পারে।
কুলপস্তার

3
What is the issue with this?আমি দেখতে পাচ্ছি না যে কিছুই। এটি মূলত একটি mapফাংশন যা করে। তবে আপনি যে প্রশ্নটি করেছিলেন তা নয়। আপনি মূলত জিজ্ঞাসা করেছিলেন "এমন কোনও শর্ত আছে যার অধীনে একজন প্রাপ্তি অনিবার্য হতে পারে?" আমি দুটি দিয়ে জবাব দিয়েছি, তবে এর অর্থ এই নয় যে আপনি সেটটারগুলি পুরোপুরি ছেড়ে দিন।
রবার্ট হার্ভে

1
আপনি ভুল লোকটি যে প্রশ্ন জিজ্ঞাসা করছেন। আমি একজন বাস্তববাদী; আমি আমার নির্দিষ্ট প্রোগ্রামগুলির পক্ষে সর্বোত্তমভাবে যা কিছু করি তা করি এবং যদি তারা আমার উদ্দেশ্য না করে তবে "নীতিগুলি" তে খুব বেশি স্টক রাখেন না।
রবার্ট হার্ভে

2
@ jpmc26: ফ্রেমওয়ার্কস। গ্রন্থাগার নয়।
রবার্ট হার্ভে

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

2

গেটার্স ফাঁস বাস্তবায়ন বিশদ এবং ব্রেক অ্যাবস্ট্রাকশন

বিবেচনা public int millisecondsSince1970()

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

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


এটি সত্য, তবে কোনও উপাদানের ভেরিয়েবলের জন্য কোনও ডাটা টাইপ / কাঠামো প্রয়োগ করার প্যাটার্ন সলিউশন, পাশাপাশি সেই ভেরিয়েবলের জন্য গেটর ব্যবহার করে এমন কিছু?
কুলপস্তার 5'19

1
এই উদাহরণটি একটি পৃথক ঘটনা, আদিম আবেশের চিত্র তুলে ধরে। আজকাল বেশিরভাগ লাইব্রেরি এবং ফ্রেমওয়ার্কগুলিতে যথাক্রমে প্রতিনিধিত্বমূলক timepointএবং প্রতিনিধিত্বমূলক ক্লাস রয়েছে timespan। ( epochএকটি নির্দিষ্ট মান timepoint।) এই শ্রেণীর, তারা যেমন getters প্রদান getIntবা getLongবা getDouble। সময়কে হেরফেরকারী ক্লাসগুলি যদি এমনভাবে লিখিত হয় যাতে তারা (1) এই বিষয়গুলি এবং পদ্ধতিগুলিতে সময় সম্পর্কিত গাণিতিকগুলি সরবরাহ করে এবং (2) গেটসগুলির মাধ্যমে এই সময়ের অবজেক্টগুলিতে অ্যাক্সেস সরবরাহ করে, তবে সমস্যাগুলি সমাধান করা হবে, গেটসগুলি থেকে মুক্তি পাওয়ার প্রয়োজন ছাড়াই without ।
রওয়ং

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

1
"মিলিসেকেন্ডসিন্স ১৯70০" জানুয়ারী 1970 এর আগে 32 বিট ইন্টের জন্য কাজ করা বন্ধ করে দিয়েছে, তাই আমি সন্দেহ করি এটি ব্যবহার করে অনেক কোড থাকবে :-)
gnasher729

1
@ রওং কিছুটা সঠিক, তবে আপনি ধরে নিয়েছেন যে পছন্দের লাইব্রেরিগুলি যে সময়সীমার প্রতিনিধিত্ব করে সেগুলি স্থিতিশীল। যা তারা নয়। উদাহরণস্বরূপ moment.js
user949300

1

আমি মনে করি প্রথম কীটি মনে রাখতে হবে যে বিস্মৃত হওয়া সর্বদা ভুল।

একটি ঠিকানা বই প্রোগ্রাম বিবেচনা করুন, যা কেবলমাত্র মানুষের যোগাযোগের তথ্য সঞ্চয় করে। তবে, আসুন এটি সঠিকভাবে করা যাক এবং এটি নিয়ামক / পরিষেবা / ভান্ডার স্তরগুলিতে বিভক্ত করুন।

একটা হতে যাচ্ছে Personনাম, ঠিকানা, ফোন নম্বর, ইত্যাদি ..: শ্রেণি যে প্রকৃত তথ্য ঝুলিতে Addressএবং Phoneখুব তাই আমরা সমর্থন নন-ইউএস স্কিম পরে পলিমরফিজম ব্যবহার করতে পারেন ক্লাস,। এই শ্রেণীর তিনটিই হ'ল ডেটা ট্রান্সফার অবজেক্টস , সুতরাং তারা গেটরস এবং সিটার ছাড়া আর কিছুই হবে না। এবং, যে অর্থে তোলে তারা অগ্রাহ্য পরলোক যদি তাদের মধ্যে কিছুমাত্র যুক্তি আছে যাচ্ছেন না equalsএবং getHashcode; আপনাকে একজন ব্যক্তির সম্পূর্ণ ব্যক্তির তথ্য উপস্থাপন করতে বলার অর্থ হয় না: এটি কি এইচটিএমএল উপস্থাপনা, একটি কাস্টম জিইউআই অ্যাপ্লিকেশন, একটি কনসোল অ্যাপ, একটি এইচটিটিপি শেষ পয়েন্ট ইত্যাদি?

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

কন্ট্রোলার একটি ইনজেকশনের পরিষেবা পেতে চলেছে, যা এর মতো পদ্ধতিগুলি উন্মোচিত করবে getএবং saveউভয়ই কিছু যুক্তিযুক্ত যুক্তি গ্রহণ করবে (উদাহরণস্বরূপ, getনাম অনুসারে অনুসন্ধান করতে, জিপ কোড দ্বারা অনুসন্ধান করতে, বা কেবল সমস্ত কিছু পেতে ওভাররাইড থাকতে পারে; saveসম্ভবত গ্রহণ করবে) একক Personএবং এটি সংরক্ষণ করুন)। নিয়ামক কি পেতে হবে? কংক্রিট শ্রেণীর নাম পেতে সক্ষম হওয়া লগিংয়ের জন্য দরকারী হতে পারে তবে এতে যে রাজ্যটি এতে ইনজেকশনের ব্যবস্থা করা হয়েছে তা বাদ দিয়ে এটি অন্য কোন রাজ্যে থাকবে?

একইভাবে, পরিষেবা স্তরটি ইনজেকশনের সাথে একটি সংগ্রহস্থল পাবে, যাতে এটি প্রকৃতপক্ষে পেতে এবং ধরে রাখতে Personপারে এবং এতে কিছু "ব্যবসায়িক যুক্তি" থাকতে পারে (যেমন, সম্ভবত আমাদের প্রয়োজন হবে যে সমস্ত Personবস্তুর কমপক্ষে একটি ঠিকানা বা ফোন থাকতে পারে) নম্বর)। তবে, আবার: ইনজেকশন ছাড়া কীসের সাথে ওই বস্তুর আর কোন রাজ্য রয়েছে? আবার, কিছুই না।

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

ইউনিট পরীক্ষাগুলিও বিবেচনা করুন (আপনি ইউনিট পরীক্ষা লিখছেন, তাই না?): পরিষেবাটি নির্দিষ্ট শ্রেণীর ইঞ্জেকশন হওয়ার আশা করে না, বরং এটি একটি ইন্টারফেসের একটি কংক্রিট বাস্তবায়ন ইনজেকশনের প্রত্যাশা করে চলেছে। এটি অ্যাপ্লিকেশনটিকে পুরো পরিবর্তন হিসাবে অনুমতি দেয় যেখানে কোনও কিছু না করেই ডেটা সংরক্ষণ করা হয় তবে পরিষেবাতে ইনজেক্ট করা ভান্ডারটিকে অদলবদল করে। এটি মক সংগ্রহশালা ইনজেকশন দ্বারা পরিষেবাটিকে ইউনিট পরীক্ষার অনুমতি দেয়। এর অর্থ ক্লাসের চেয়ে ইন্টারফেসের ক্ষেত্রে চিন্তাভাবনা। সংগ্রহস্থল ইন্টারফেসটি কোনও প্রাপ্তিদের প্রকাশ করতে পারে? অর্থাৎ, এমন কোনও অভ্যন্তরীণ অবস্থা কি হবে: সমস্ত ভাণ্ডারগুলিতে সাধারণ, osos of?, And of outside outside outside outside? Outside outside outside outside outside outside???????????????????????????????????????????????????????????????????????????????????????????? আমি নিজের সম্পর্কে চিন্তা করতে কঠোর চাপিত হব

টি এল; ডিআর

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


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

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

1

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

পরিবর্তনীয় সদস্য।

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

যদি আপনি এমন কোনও মিউটরটিজ অবজেক্ট থাকে যা আপনি একজন গেটরের মাধ্যমে প্রকাশ করছেন, তবে আপনি সম্ভাব্যভাবে নিজেকে উন্মুক্ত করে যাচ্ছেন এমন কোনও উপায়ে আপনি প্রত্যাশা করবেন না এমনভাবে পরিবর্তিত হচ্ছে object

সত্যই খারাপ উদাহরণটি এমন একটি বস্তু হবে যা 1 থেকে 100 পর্যন্ত গণনা করছে এবং তার বর্তমান মানটিকে পরিবর্তনীয় রেফারেন্স হিসাবে প্রকাশ করে। এটি তৃতীয় পক্ষের অবজেক্টটিকে কারেন্টের মানটি এমনভাবে পরিবর্তন করতে দেয় যাতে মান প্রত্যাশিত সীমা ছাড়িয়ে যায়।

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

এমন রূপক ব্যবহার করা যাতে পার্থক্যটি আরও সহজে দেখা যায়।

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

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

কখনও কখনও (কম ঘন ঘন, তবে এখনও এটি যথেষ্ট পরিমাণে যথেষ্ট যথেষ্ট) সেটারগুলি বেশ বৈধ ওও ডিজাইন। আমার কাছে যদি গ্রাহক অবজেক্ট থাকে তবে তাদের ঠিকানার জন্য সেটারটি প্রকাশ করা বেশ বৈধ। আপনি যে কিনা কল setAddress(string address)বা ChangeMyAddressBecauseIMoved(string newAddress)বা শুধু string Address { get; set; }শব্দার্থবিদ্যা একটি ব্যাপার। Object বস্তুর অভ্যন্তরীণ অবস্থার পরিবর্তন হওয়া দরকার এবং তা করার উপযুক্ত উপায় হ'ল সেই বস্তুর অভ্যন্তরীণ স্থিতি নির্ধারণ করা। এমনকি যদি আমার কাছে ofতিহাসিক রেকর্ডগুলির ঠিকানা থাকতে Customerহয় তবে আমি তার অভ্যন্তরীণ অবস্থাকে যথাযথভাবে পরিবর্তন করতে সেটারটি ব্যবহার করতে পারি। Customerএক্ষেত্রে এটি অপরিবর্তনীয় হওয়ার পক্ষে কোন মানে হয় না এবং এটির জন্য সেটটার সরবরাহ করার চেয়ে কোনও ঠিকানা পরিবর্তন করার পক্ষে এর চেয়ে ভাল আর কোনও উপায় নেই।

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

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

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


-1

মতামত ছাড়াই একটি জিনিস কী, যদি আমি গেটার ব্যবহার করি তবে তা ভেঙে যাবে ...

রক্ষণাবেক্ষণ ভাঙবে।

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

আসুন @ ক্যানডেড_আরঞ্জের Collectionউদাহরণ সহ। তিনি যা লেখেন তার বিপরীতে একজন খাঁটি Collection হওয়া উচিত নয় । সংগ্রহগুলি নির্দিষ্ট নির্দিষ্ট কারণে, সমস্ত আইটেমের উপরে পুনরাবৃত্তি করার জন্য বিদ্যমান । এই কার্যকারিতা কারও কাছে অবাক হওয়ার কিছু নয়, তাই এটি ব্যবহারকারীর উপর এই স্পষ্ট ব্যবহার-কেস চাপার পরিবর্তে, চক্র এবং গেটার্স বা হোয়াট নোট ব্যবহার করে প্রয়োগ করা উচিতCollection

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


1
Counterexample। একটি ফাংশন বিবেচনা করুন যা Collectionএকইসাথে দুটি গুলি পুনরাবৃত্তি করতে হবে (A1, B1), (A2, B2), ...। এটির জন্য "জিপ" বাস্তবায়ন প্রয়োজন। দু'জনের একটিতে যদি পুনরাবৃত্তি ওভার ফাংশনটি প্রয়োগ করা হয় আপনি কীভাবে "জিপ" প্রয়োগ করবেন - আপনি কীভাবে অন্যটিতে Collectionসম্পর্কিত আইটেমটি অ্যাক্সেস করবেন?
রবিং

@ রওয়ং লাইব্রেরিটি কীভাবে রচিত তা নির্ভর করে Collectionএটি zipনিজেই প্রয়োগ করতে হবে। যদি এটি না হয়, আপনি এটি বাস্তবায়ন করুন এবং গ্রন্থাগার স্রষ্টাকে একটি টান অনুরোধ জমা দিন। নোট করুন যে আমি একমত হয়েছি যে কিছু সীমানার মাঝে মাঝে গেটার দরকার হয়, আমার আসল সমস্যাটি আজকাল সর্বত্রই রয়েছে ters
রবার্ট ব্রুটিগাম

সেক্ষেত্রে, এর থেকে বোঝা যায় যে গ্রন্থাগারের Collectionকমপক্ষে তার নিজস্ব প্রয়োগের জন্য অবজেক্টটিতে গিটার থাকতে হবে zip। (এটি হ'ল,
গ্রাহকের

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

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