OOP के पीछे मूल विचार यह है कि डेटा और व्यवहार (उस डेटा पर) अविभाज्य हैं और वे एक वर्ग के ऑब्जेक्ट के विचार से युग्मित हैं। ऑब्जेक्ट में डेटा और विधियाँ हैं जो उस (और अन्य डेटा) के साथ काम करती हैं। ओओपी के सिद्धांतों द्वारा स्पष्ट रूप से, ऑब्जेक्ट जो केवल डेटा (जैसे सी संरचनाएं) हैं, उन्हें एक विरोधी पैटर्न माना जाता है।
अब तक सब ठीक है।
समस्या यह है कि मैंने देखा है कि मेरा कोड हाल ही में इस विरोधी पैटर्न की दिशा में अधिक से अधिक हो रहा है। मुझे लगता है कि जितना अधिक मैं कक्षाओं और शिथिल युग्मित डिजाइनों के बीच छिपी जानकारी को प्राप्त करने की कोशिश करता हूं, उतना ही अधिक मेरी कक्षाओं को शुद्ध डेटा नो बिहेवियर क्लास और सभी व्यवहार नो डेटा वर्गों का मिश्रण हो जाता है।
मैं आम तौर पर एक तरह से कक्षाओं को डिजाइन करता हूं जो अन्य वर्गों के अस्तित्व के बारे में उनकी जागरूकता को कम करता है और अन्य वर्गों के इंटरफेस के बारे में उनके ज्ञान को कम करता है। मैं इसे विशेष रूप से टॉप-डाउन फैशन में लागू करता हूं, निचले स्तर की कक्षाएं उच्च स्तर की कक्षाओं के बारे में नहीं जानती हैं। उदाहरण के लिए:
मान लीजिए कि आपके पास एक सामान्य कार्ड गेम एपीआई है। आपकी एक क्लास है Card
। अब इस Card
वर्ग को खिलाड़ियों को दृश्यता निर्धारित करने की आवश्यकता है।
एक तरीका यह है boolean isVisible(Player p)
पर Card
वर्ग।
एक और है boolean isVisible(Card c)
पर Player
वर्ग।
मैं विशेष रूप से पहले दृष्टिकोण को नापसंद करता हूं क्योंकि यह उच्च स्तर की Player
कक्षा के बारे में निचले स्तर के Card
वर्ग के लिए ज्ञान देता है ।
इसके बजाय मैंने तीसरे विकल्प का विकल्प चुना जहां हमारे पास एक Viewport
वर्ग है, Player
जो कार्ड की एक सूची देता है और निर्धारित करता है कि कौन से कार्ड दिखाई दे रहे हैं।
हालाँकि यह दृष्टिकोण एक संभावित सदस्य फ़ंक्शन के दोनों Card
और Player
वर्गों को लूटता है। एक बार जब आप ताश के पत्तों की दृश्यता के अलावा अन्य सामान के लिए ऐसा करते हैं, आप के साथ छोड़ दिया जाता है Card
और Player
वर्ग है जो विशुद्ध रूप से डेटा होते हैं के रूप में सभी कार्यक्षमता अन्य वर्गों, जो ज्यादातर कोई डेटा, बस तरह-तरह के साथ वर्ग हैं में कार्यान्वित किया जाता Viewport
ऊपर।
यह ओओपी के प्रमुख विचार के खिलाफ स्पष्ट रूप से है।
सही तरीका कौन सा है? मुझे कक्षा की अन्योन्याश्रितियों को कम करने और ग्रहण किए गए ज्ञान और युग्मन को कम करने के कार्य के बारे में कैसे जाना चाहिए, लेकिन अजीब डिजाइन के साथ घुमावदार बिना, जहां सभी निम्न स्तर की कक्षाओं में केवल डेटा होता है और उच्च स्तर की कक्षाओं में सभी विधियां होती हैं? क्या किसी के पास वर्ग डिजाइन पर कोई तीसरा समाधान या परिप्रेक्ष्य है जो पूरी समस्या से बचा जाता है?
पुनश्च यहाँ एक और उदाहरण है:
मान लें कि आपके पास वह वर्ग है DocumentId
जो अपरिवर्तनीय है, केवल एक BigDecimal id
सदस्य है और इस सदस्य के लिए एक गेट्टर है। अब आपको कहीं एक विधि की आवश्यकता है, जिसने एक डेटाबेस से इस आईडी के लिए DocumentId
रिटर्न दिया हो Document
।
क्या आप:
- कक्षा में
Document getDocument(SqlSession)
विधि जोड़ेंDocumentId
, अचानक अपनी दृढ़ता ("we're using a database and this query is used to retrieve document by id"
) के बारे में ज्ञान का परिचय देते हुए , डीबी और इसी तरह उपयोग किए जाने वाले एपीआई का उपयोग करें। इस वर्ग को भी अब संकलन करने के लिए दृढ़ता JAR फ़ाइल की आवश्यकता है। - विधि के साथ कुछ अन्य वर्ग जोड़ें
Document getDocument(DocumentId id)
,DocumentId
वर्ग को मृत के रूप में छोड़ दें , कोई व्यवहार नहीं, संरचना जैसा वर्ग।