নকশা: অবজেক্ট পদ্ধতি বনাম পৃথক শ্রেণির পদ্ধতি যা অবজেক্টটিকে প্যারামিটার হিসাবে গ্রহণ করে?


14

উদাহরণস্বরূপ, এটি করা কি ভাল:

Pdf pdf = new Pdf();
pdf.Print();

বা:

Pdf pdf = new Pdf();
PdfPrinter printer = new PdfPrinter();
printer.Print(pdf);

আরেকটি উদাহরণ:

Country m = new Country("Mexico");
double ratio = m.GetDebtToGDPRatio();

বা:

Country m = new Country("Mexico");
Country us = new Country("US");
DebtStatistics ds = new DebtStatistics();
double usRatio = ds.GetDebtToGDPRatio(us);
double mRatio = ds.GetDebtToGDPRatio(m);    

সর্বশেষ উদাহরণে আমার উদ্বেগটি হ'ল সম্ভাব্য অন্তহীন পরিসংখ্যান রয়েছে (তবে আসুন মাত্র 10 বলুন) আপনি কোনও দেশ সম্পর্কে জানতে চাইতে পারেন; তারা সবাই কি দেশের আপত্তিতে পড়ে?

যেমন

Country m = new Country("Mexico");
double ratio = m.GetGDPToMedianIncomeRatio();

এগুলি সহজ অনুপাত তবে ধরে নেওয়া যাক কোনও পদ্ধতির ওয়ারেন্ট দেওয়ার জন্য পরিসংখ্যানগুলি যথেষ্ট জটিল।

অপারেশনের মধ্যে যে লাইনটি কোনও বস্তু বনাম অপারেশনের অভ্যন্তরীণ যা কোনও বস্তুর উপর সঞ্চালিত হতে পারে তবে এর অংশ নয়?

উত্তর:


16

আপনার পিডিএফ উদাহরণগুলিকে প্রারম্ভিক পয়েন্ট হিসাবে গ্রহণ করা যাক, এটি দেখুন।

http://en.wikipedia.org/wiki/Single_responsibility_principle

একক দায়িত্বের নীতিটি প্রস্তাব দেয় যে কোনও বস্তুর একটি এবং একমাত্র উদ্দেশ্য থাকতে হবে। এটি মাথায় রাখুন।

http://en.wikipedia.org/wiki/Separation_of_concerns

উদ্বেগের নীতির বিচ্ছেদ আমাদের বলে যে ক্লাসগুলির ওভারল্যাপিং ফাংশন থাকা উচিত নয়।

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

এখন, আপনার পিডিএফ উদাহরণে, প্রশ্নটি হল, মুদ্রণের জন্য দায়বদ্ধ কে? কী বোঝায়?

প্রথম কোড স্নিপেট:

Pdf pdf = new Pdf();
pdf.Print();

এটা ভাল না. একটি পিডিএফ নথি নিজেই মুদ্রণ করে না। এটি ... টা দা! .. একটি মুদ্রক দ্বারা মুদ্রিত হয়। সুতরাং আপনি দ্বিতীয় কোড স্নিপেট অনেক ভাল:

Pdf pdf = new Pdf();
PdfPrinter printer = new PdfPrinter();
printer.Print(pdf);

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

Pdf pdf = new Pdf();
Printer printer = new Printer();
printer.Print(pdf);

সুতরাং এটি সহজ। পদ্ধতিগুলি রাখুন যেখানে তারা বোঝায়। স্পষ্টতই, এটি সর্বদা সহজ নয়। উদাহরণস্বরূপ আপনার দেশের পরিসংখ্যান নিন:

Country m = new Country("Mexico");
double ratio = m.GetDebtToGDPRatio();

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

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

এবং এর মধ্যে এটি রয়েছে: আপনার প্রয়োজনীয়তাগুলি কী? আপনার প্রয়োজনীয়তাগুলি আপনি বিশ্বকে, মডেলটিকে যেভাবে প্রাসঙ্গিক করে তুলবেন সেভাবে পরিচালিত করবে।

যদি আপনার কাছে সত্যিকারের সংখ্যা বা ভেরিয়েবল সংখ্যা থাকে তবে আপনার দ্বিতীয় উদাহরণটি আরও অর্থবোধ করে:

Country m = new Country("Mexico");
DebtStatistics ds = new DebtStatistics();
double usRatio = ds.GetDebtToGDPRatio(m);

আরও ভাল, পরিসংখ্যান নামে একটি বিমূর্ত সুপারক্লাস বা ইন্টারফেস রয়েছে যা একটি দেশকে প্যারামিটার হিসাবে গ্রহণ করে:

interface StatisticsCalculator // or a pure abstract class if doing C++
{
   double getStatistics(Country country); // or a pure virtual function if in C++
}

ক্লাস tণটোগজিডিপিআরটিস্ট্যাটিস্টিক্সক্যালকুলেটর স্ট্যাটিস্টিক্সক্যালকুলেটর প্রয়োগ করে ....

ক্লাস ইনফ্যান্টমোরালটিস্ট্যাটিস্টিক্স ক্যালকুলেটর স্ট্যাটিস্টিক্সক্যালকুলেটর প্রয়োগ করে ...

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

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


1
পরিসংখ্যানক্যালকুলেটর ইন্টারফেসের জন্য +1 (এবং কৌশল প্যাটার্নের পরবর্তী ব্যবহার)। এবং পুঙ্খানুপুঙ্খভাবে সুচিন্তিত উত্তর
এডওয়ার্ডসেট

3
এই মুহূর্তে এটি পুরোপুরি ডিকনস্ট্রাক্ট করার জন্য অপর্যাপ্ত সময়, তবে অবশ্যই উল্লেখ করতে হবে যে প্রিন্টার শ্রেণি সময়ের সাথে একটি Godশ্বর শ্রেণিতে পরিণত হবে, সমস্ত ধরণের নথি ক্লাসের সাথে দৃ tight়ভাবে মিলিত হবে। পিডিএফ.প্রিন্ট বাঞ্ছনীয় - তবে এটি কীভাবে আপনি 'একক দায়িত্ব' সংজ্ঞায়িত করেন তার উপর নির্ভর করে ;-)
স্টিভেন এ। লো

@ স্টিভ - আপনি যা প্রস্তাব করছেন তা হ'ল একটি ভয়ঙ্কর ধারণা (পিডিএফ প্রিন্ট প্রয়োগ করে) () implement এটি বাস্তব জীবনে মুদ্রণ কীভাবে প্রয়োগ করা হয় তা প্রতিফলিত করে না। আমি সচেতন প্রতিটি অপারেটিং সিস্টেম এবং মুদ্রণ API এর জন্য একটি বিমূর্ততা সরবরাহ করে Printer। আপনার এক্সপি / ভিস্তা মেশিনে প্রিন্টারগুলির তালিকাটি দেখুন (বা / var / spool বা * নিক্সের সমতুল্য) কোনও ওয়ার্ড প্রিন্টার, বা পাঠ্য প্রিন্টার বা পিডিএফ প্রিন্টার নেই। মুদ্রণ ডিভাইসের সাথে সুনির্দিষ্ট প্রিন্টার রয়েছে এবং নথির ধরণের সাথে সুনির্দিষ্ট নয়।
luis.espinal

2
+1 আমি পছন্দ করি আপনি যা বলেছিলেন সে সম্পর্কে আমি চিন্তা করছি .. @ স্টিভ এবং লুইস: আমি মনে করি objectsশ্বর বিষয়গুলি সম্পর্কে বিতর্কটির অনুপস্থিত অংশটি জেনেরিক প্রিন্টার অবজেক্টকে ASCII বা বিটম্যাপের মতো কয়েকটি স্ট্যান্ডার্ড ফর্ম্যাট গ্রহণ করতে হবে (যদিও পিডিএফ সম্ভবত যুক্তিসঙ্গতও) এবং নির্দিষ্ট স্ট্যান্ডার্ড ডকুমেন্ট টাইপকে (একটি এমএস ওয়ার্ড ডকুমেন্ট বলুন) এই স্ট্যান্ডার্ড ফর্ম্যাটগুলির মধ্যে একটিতে রূপান্তর করার কিছু তৃতীয় শ্রেণির দায়িত্ব হওয়া উচিত।
ব্যবহারকারী

2
আমার কাছে মনে হয় সম্ভবত কোনও পিডিএফ নিজেই ক্যানভাস ইন্টারফেসে বা কোনও চিত্র অবজেক্টে রেন্ডার করতে সক্ষম হবে যা প্রিন্টার অবজেক্ট দ্বারা প্রক্রিয়া করা যেতে পারে।
উইনস্টন ইওয়ার্ট

4

আমি মনে করি উভয়ই অবশ্যই অন্যটির চেয়ে ভাল নয়। পিডিএফ.প্রিন্ট () ব্যবহার করা আরও শক্ত, তবে পিডিএফপ্রিন্টার ক্লাস করা আরও ভাল হতে পারে যদি:

  • আপনার মুদ্রকগুলির উদাহরণগুলি পরিচালনা করতে হবে
  • বিভিন্ন বিকল্প এবং ক্রিয়া রয়েছে যা পিডিএফ.প্রিন্ট (...) জটিলতা ফুটিয়ে তুলবে (যেমন মুদ্রণ বাতিলকরণ, অতিরিক্ত বিন্যাস ইত্যাদি)

আমি অন্যথায় এটি পেতে হবে না।


একটি ভাল, ব্যবহারিক উত্তর; সময় কীভাবে এটি বিকশিত হতে হবে তা বলবে
স্টিভেন এ। লো

1
সংক্ষিপ্ত পরামর্শটি হ'ল এসআরপি প্রয়োগ করার সময় যুক্তি এবং তথ্য উভয়ই দেখার জন্য, যাতে আমরা তাড়াতাড়ি তাদের ডিকম্পল না করে অনুশোচনা করব কিনা তা স্থির করার জন্য । Pdfক্লাসে প্রতি-প্রিন্টার সেটিংস সংরক্ষণ করার ক্ষেত্রে সমস্যাটি হ'ল এগুলি একসাথে সংরক্ষণ করার কথা নয় - Pdfএকটি ফাইলে সংরক্ষণ করা হয় তবে প্রতি-প্রিন্টার সেটিংস ব্যবহারকারীর / মেশিন প্রোফাইলের সাথে সংরক্ষণ করা উচিত।
রবিং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.