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