ব্যবহারকারীর তথ্য প্রদর্শন করে গিটার এবং সেটটারগুলি এড়িয়ে চলুন


10

পটভূমি

আমি "ক্লিন কোড বই" পড়ছি, এবং প্যারালেলে, আমি ব্যাঙ্কারের অ্যাকাউন্টের মতো কাতা ক্যালিথেনিক বস্তুগুলিতে কাজ করছি এবং আমি এই নিয়মে আটকে রয়েছি:

ক্যালিস্টেনিক অবজেক্টের নবম নিয়ম হ'ল আমরা গেটর বা সেটটার ব্যবহার করি না।

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

এটি আমার মনে নিখুঁত ধারণা তৈরি করে এবং আমি এই নীতির সাথে পুরোপুরি একমত agree অনুশীলনে সমস্যা আসে।

প্রসঙ্গ

উদাহরণস্বরূপ, আমার একটি অ্যাপ্লিকেশন রয়েছে যাতে আমাকে কিছু ব্যবহারকারীর তালিকা করতে হবে এবং ব্যবহারকারীর বিবরণ প্রদর্শন করতে হবে।

আমার ব্যবহারকারীর সমন্বয়ে গঠিত:

-> Name
   --> Firstname --> String
   --> Lastname --> String
-> PostalAddress
   --> Street --> String
   --> PostalCode --> String

সমস্যা

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

আমার মনে যা আসে

একটি সমাধান করা হয়:

user.getName().getFirstName().getStringValue()

যা মোটামুটি ভয়াবহ, ক্যালিস্টেনিক অবজেক্টের অনেক নিয়ম ভঙ্গ করে এবং ডিমেটার আইন ভঙ্গ করে।

অন্য একটির মতো কিছু হবে:

String firstName = user.provideFirstnameForOutput();
// That would have called in the user object =>
String firstName = name.provideFirstnameForOutput();
// That would have called in the name object =>
String firstName = firstname.provideFirstnameForOutput();

তবে আমি এই সমাধানটি দিয়ে স্বাচ্ছন্দ্য বোধ করি না, এটি কেবলমাত্র "উচ্চতর অর্ডার অ্যাক্সেসর" বলে মনে হয় কেবলমাত্র একটি পদ্ধতি যা ডেমিটার আইনকে মেলাতে লক্ষ্য করে স্ট্যান্ডার্ড গেটর / সেটারকে বাইপাস করার মতো ...

কোন ধারণা ?

উত্তর:


17

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

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

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

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

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

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


ঠিক আছে, আমি আমার পরামর্শটি ঠিক আমার ডোমেন সত্তার মধ্যে একটি ম্যাপারের মতো, আমার উপস্থাপনা স্তরটির জন্য একটি কাস্টম ডিটিও-র কাছে যা কিছু অ্যাক্সেসর পেতে পারে?
এমফ্রেচেট

@ মার্গিন প্রেটি অনেক, হ্যাঁ
অ্যান্ডি

এই সমস্ত ক্যাসকেডিং স্টাফ সত্যিই ভাল এবং মসৃণ শোনায়, উত্তরের জন্য ধন্যবাদ;)
এমফ্রেচেট

2

ভাবার এক দিক হ'ল কাঁচা ডেটাতে অ্যাক্সেস সরবরাহ না করে জেনেরিক স্ট্রিং ফর্ম্যাটিং সদস্য ফাংশন সরবরাহ করা। এটার মতো কিছু:

String lastName = user.formatDescription("$(Lastname)");
String fullName = user.formatDescription("$(Lastname), $(Firstname)");
String abbreviated = user.formatDescription("$(FnAbb). $(LnAbb).");

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

String accountName = user.formatDescription("$(firstname).$(lastname)");

আপনি সাধারণত কিছু ব্যবহৃত, সম্ভবত জটিল ফর্ম্যাটগুলি একবার সংজ্ঞায়িত করতে পারেন, উদাহরণস্বরূপ আপনি বলতে পারেন

String fullAddress = user.formatDescription(User.kAddressFormat);

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

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


5
এটি অবশ্য আমার কাছে এসআরপি লঙ্ঘনের মতো দেখাচ্ছে। Userকোনও টেম্প্লেটিং ল্যাঙ্গুয়েজ বিশ্লেষণ ও সংকলন / ব্যাখ্যা করার জন্য কি কোনও বস্তুর দায়বদ্ধতা রয়েছে ?
জার্গ ডব্লু মিট্টাগ

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

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