डिजाइन: ऑब्जेक्ट विधि बनाम अलग-अलग वर्ग की विधि जो ऑब्जेक्ट को पैरामीटर के रूप में लेती है?


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();

आपकी चिंता यह है कि आंकड़ों की संख्या n हो सकती है , और यह कि वे देश श्रेणी में नहीं होने चाहिए। यह सच है। हालाँकि, यदि आपका मॉडल केवल उस विशेष आँकड़े के लिए कहता है, तो यह मॉडलिंग उदाहरण वास्तव में ठीक हो सकता है।

इस मामले में, आप तार्किक रूप से कह सकते हैं कि एक देश को अपने स्वयं के आँकड़ों की गणना करने में सक्षम होना चाहिए, आपके मॉडल और हाथों की आवश्यकताओं के लिए।

और उसमें यह बात निहित है: आपकी आवश्यकताएं क्या हैं? आपकी आवश्यकताएं आपको दुनिया को मॉडल करने के तरीके को चलाएंगी, संदर्भ, जिसमें इन आवश्यकताओं को संतुष्ट किया जाना है।

यदि आपके पास वास्तव में एक भीड़ / चर संख्या के आंकड़े हैं, तो आपका दूसरा उदाहरण अधिक समझ में आता है:

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++
}

वर्ग ऋण

वर्ग शिशुमृत्युत्व विज्ञान सांख्यिकीसंपादित करें सांख्यिकी सांख्यिकी

और आगे और आगे। जो निम्नलिखित की ओर जाता है: सामान्यीकरण, प्रतिनिधिमंडल, अमूर्तता। सांख्यिकीय सभा विशिष्ट उदाहरणों के लिए प्रत्यायोजित होती है जो एक विशिष्ट अमूर्त (एक आँकड़े संग्रह एपीआई) को सामान्यीकृत करते हैं ।

मुझे नहीं पता कि यह आपके प्रश्न का 100% उत्तर देता है। आखिरकार, हमारे पास अचूक मॉडल जमीन नहीं है, जैसे कि हिंसात्मक कानूनों (जैसे ईई लोग करते हैं।) आप जो कुछ कर सकते हैं, वह सब कुछ है। और यह एक इंजीनियरिंग निर्णय है जिसे आपको करने की आवश्यकता है। सबसे अच्छी बात यह है कि वास्तव में OO सिद्धांतों (और सामान्य रूप से अच्छे सॉफ्टवेयर मॉडलिंग सिद्धांतों) से परिचित होना है।


1
+1 सांख्यिकीसालकुलर इंटरफ़ेस (और बाद में रणनीति पैटर्न का उपयोग) के लिए। और पूरी तरह से अच्छी तरह से सोचा जवाब
एडवर्ड्समैट

3
इस समय पूरी तरह से इसे फिर से बनाने के लिए अपर्याप्त समय है, लेकिन यह इंगित करना चाहिए कि प्रिंटर वर्ग समय के साथ एक ईश्वर वर्ग बन जाएगा, सभी प्रकार के दस्तावेज़ वर्गों को कसकर जोड़ा जाएगा। Pdf.Print बेहतर होगा - लेकिन यह सब इस बात पर निर्भर करता है कि आप 'सिंगल जिम्मेदारी' को कैसे परिभाषित करते हैं? ;-)
स्टीवन ए। लोवे

@Steve - आप जो प्रस्ताव कर रहे हैं वह एक भयानक विचार है (Pdf कार्यान्वयन प्रिंट ())। यह प्रतिबिंबित नहीं करता है कि वास्तविक जीवन में मुद्रण कैसे लागू किया जाता है। हर ऑपरेटिंग सिस्टम और प्रिंटिंग एपीआई, जिसके बारे में मुझे पता है, के लिए एक अमूर्तता प्रदान करता है Printer। अपने XP / Vista मशीन (या अंडर / var / स्पूल या समकक्ष में * nix।) में प्रिंटर सूची देखें। प्रत्येक एप्लिकेशन अपने प्रिंटर में से किसी एक में दस्तावेज़ ऑब्जेक्ट को क्रमबद्ध करता है। कोई वर्ड प्रिंटर, या टेक्स्ट प्रिंटर या पीडीएफ प्रिंटर नहीं है। केवल मुद्रण डिवाइस के लिए विशिष्ट प्रिंटर हैं और दस्तावेज़ प्रकार के लिए विशिष्ट नहीं हैं।
luis.espinal

2
+1 मुझे यह पसंद है कि मैंने जो कुछ कहा है, उस पर आप विचार कर रहे हैं .. @ सामान्य और उपसर्ग: मुझे लगता है कि भगवान की वस्तुओं के बारे में बहस का लापता टुकड़ा एक सामान्य प्रिंटर ऑब्जेक्ट है, जिसे एएससीआईआई या बिटमैप जैसे कुछ मानक स्वरूपों को स्वीकार करना चाहिए (हालांकि पीडीएफ शायद उचित भी है) और इन मानक प्रारूपों में से किसी एक को एक विशेष दस्तावेज़ प्रकार (एक एमएस वर्ड दस्तावेज़ कहना) में परिवर्तित करने के लिए कुछ 3 वर्ग की जिम्मेदारी होनी चाहिए।
उपयोगकर्ता

2
यह मुझे लगता है कि शायद एक पीडीएफ खुद को या तो कैनवस इंटरफेस पर या एक इमेज ऑब्जेक्ट में रेंडर करने में सक्षम होना चाहिए जिसे तब प्रिंटर ऑब्जेक्ट द्वारा संसाधित किया जा सकता है।
विंस्टन एवर्ट

4

मुझे लगता है कि न तो निश्चित रूप से दूसरे से बेहतर है। Pdf.Print () का उपयोग करना कठिन है, लेकिन PdfPrinter वर्ग होने पर बेहतर हो सकता है:

  • आपको प्रिंटर के इंस्टेंस को प्रबंधित करने की आवश्यकता है
  • वहाँ विकल्पों और कार्यों की एक विस्तृत श्रृंखला है जो pdf.Print (... प्रिंट जटिलता रद्द, अतिरिक्त स्वरूपण, आदि) को उड़ा देगा।

मैं अन्यथा उस पर लटका नहीं होता।


एक अच्छा, व्यावहारिक उत्तर; समय बताएगा कि इसे कैसे विकसित किया जाना चाहिए
स्टीवन ए। लोवे

1
लघु सुझाव एसआरपी को लागू करते समय तर्क और डेटा दोनों को देखने के लिए है , ताकि यह तय किया जा सके कि क्या हमें खेद है कि जल्द ही उन्हें डिकॉय नहीं किया जाएगा । Pdfकक्षा में प्रति-प्रिंटर सेटिंग्स को संग्रहीत करने में समस्या यह है कि उन्हें एक साथ संग्रहीत नहीं किया जाना चाहिए - Pdfएक फ़ाइल में संग्रहीत किया जाता है, लेकिन प्रति-प्रिंटर सेटिंग्स उपयोगकर्ता / मशीन प्रोफाइल के साथ संग्रहीत की जानी चाहिए।
rwong
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.