2009-07-15 25 views
9

मैं निम्नलिखित समस्या है और हो, तो एकाधिक वंशानुक्रम का उपयोग किए बिना इन वस्तुओं मॉडल करने के लिए एक अच्छा तरीका मैं सोच रहा हूँ। अगर इससे कोई फर्क पड़ता है, तो मैं पाइथन का उपयोग कर रहा हूं।को खत्म करना एकाधिक वंशानुक्रम

छात्र संपर्क जानकारी के साथ साथ छात्र जानकारी की जरूरत है। वयस्कों को संपर्क जानकारी और बिलिंग जानकारी की आवश्यकता है। छात्र वयस्क छात्र हो सकते हैं, इस मामले में मुझे संपर्क/छात्र/बिलिंग जानकारी की आवश्यकता है, या वे बच्चे हो सकते हैं, इस मामले में मुझे संपर्क/छात्र/अभिभावक की जानकारी चाहिए।

सिस्टम का उपयोग करने के तरीके के बारे में स्पष्ट होने के लिए, मुझे सभी वयस्कों की एक सूची (और मुझे वयस्क छात्र और माता-पिता मिलेंगे), या सभी छात्रों की एक सूची के लिए पूछने में सक्षम होना चाहिए (और मैं बाल छात्रों और वयस्क छात्रों को प्राप्त करें)।

इसके अलावा, इन सभी वस्तुओं को एक सामान्य आधार वर्ग की आवश्यकता है।

+0

यह वास्तव में एक होमवर्क असाइनमेंट की तरह लगता है। :) –

+0

@ ब्रायन मैके: शायद, लेकिन मुझे संदेह है कि यह एक सीधा होमवर्क असाइनमेंट है - यानी "एकाधिक विरासत को खत्म करें" - लेकिन कुछ होमवर्क परियोजना का हिस्सा शायद अधिक है कि वह आने का एक अलग तरीका ढूंढने की कोशिश कर रहा है। मैंने यहां देखी गई कुछ प्रतिलिपि/पेस्ट होमवर्क प्रश्नों से निश्चित रूप से बेहतर पूछा है। – Randolpho

+0

मुझे पता है कि यह करता है, लेकिन मैं आपको आश्वस्त कर सकता हूं कि यह नहीं है :) –

उत्तर

8

आपके पास भूमिका का एक उदाहरण है - यह विरासत द्वारा भूमिका मॉडल करने के लिए एक आम जाल है, लेकिन भूमिकाएं बदल सकती हैं, और किसी ऑब्जेक्ट की विरासत संरचना को बदलना (यहां तक ​​कि उन भाषाओं में जहां यह संभव है, जैसे पायथन) की अनुशंसा नहीं की जाती है। बच्चे बड़े होते हैं और वयस्कों के हो जाते हैं, और कुछ वयस्कों भी बच्चों छात्रों के अभिभावकों के साथ-साथ वयस्क छात्रों को हो जाएगा - वे तो या तो भूमिका ड्रॉप लेकिन अन्य रखने के लिए आवश्यकता हो सकती है (उनके बच्चे स्कूलों में परिवर्तन लेकिन वे नहीं है, या viceversa) ।

बस अनिवार्य फ़ील्ड और वैकल्पिक वाले वर्ग के साथ एक वर्ग व्यक्ति है, और उत्तरार्द्ध, भूमिकाओं का प्रतिनिधित्व करने वाले, बदल सकते हैं। "एक सूची के लिए पूछ" (विरासत का काफी स्वतंत्र रूप से या अन्यथा) (प्रत्येक चाहे वह आवश्यकताओं को पूरा के लिए जाँच करने सभी वस्तुओं के माध्यम से चलने के लिए) मक्खी पर सूची निर्माण या बनाए रखने संभव आवश्यकताओं के लिए इसी सूचियों द्वारा किया जा सकता है या तो (या एक लगातार और विज्ञापन-संबंधी दोनों प्रश्नों के लिए दो रणनीतियों का मिश्रण)। किसी प्रकार का डेटाबेस यहां मदद करने की संभावना है (और अधिकांश डीबी रास्ते में विरासत के बिना बहुत बेहतर काम करते हैं ;-)।

+0

क्या आप इस समाधान की सिफारिश कर रहे हैं क्योंकि भूमिकाएं बदल सकती हैं? –

+0

हां, इस मामले में विरासत से बचने के लिए भूमिका [ओं] की उत्परिवर्तन # 1 प्रेरणा है (अन्य भी हैं, जो अधिक व्यापक रूप से लागू होते हैं और अन्य प्रतिक्रियाओं का उल्लेख किया गया है)। विरासत पर पक्ष संरचना को जोड़ने के लिए –

2

बहुत ही सरल समाधान: उपयोग रचना के बजाय विरासत। छात्र को संपर्क और बिलिंग से प्राप्त करने के बजाय, व्यक्ति के क्षेत्र/विशेषता से संपर्क करें और उस से प्राप्त करें। छात्र के क्षेत्र को बिलिंग करें। माता-पिता को व्यक्ति का आत्म-संदर्भ क्षेत्र बनाएं।

2

ऐसा लगता है कि आपको वास्तव में एकाधिक विरासत की आवश्यकता नहीं है। वास्तव में, आप वास्तव में को एकाधिक विरासत की आवश्यकता नहीं है। यह सिर्फ एक सवाल है कि क्या एकाधिक विरासत चीजों को सरल बनाती है (जिसे मैं यहां मामला नहीं देख सकता था)।

मैं एक व्यक्ति वर्ग बनाउंगा जिसमें वयस्क और छात्र साझा किए जाने वाले सभी कोड होंगे। फिर, आपके पास वयस्क वर्ग हो सकता है जिसमें केवल वयस्क आवश्यकताओं और एक बाल वर्ग है जिसमें कोड कोड बच्चे की ज़रूरत है।

+0

व्यक्ति वर्ग विशाल होगा। हर बार जब एक नया संपर्क प्रकार जोड़ा गया तो व्यक्ति बढ़ेगा और एक या अधिक अन्य रैपर वर्ग भी बढ़ेगा। एलेक्स मार्टेलि के पास यह सही है। – Mike

5

जैसा कि मुझे यकीन है कि कोई और जल्द ही टिप्पणी करेगा (यदि वे पहले से नहीं हैं), एक अच्छा ओओ सिद्धांत "Favor composition over inheritance" है। अपने विवरण से, यह आप Single Responsibility Principle तोड़ने रहे हैं, और अलग वस्तुओं में कार्यक्षमता टूट जाना चाहिए संदेह से जैसा लगता है।

यह भी मेरे लिए होता है कि पायथन duck typing का समर्थन करता है, जो सवाल पूछता है "यह इतना महत्वपूर्ण क्यों है कि सभी वर्गों में एक सामान्य आधार वर्ग हो?"

+0

+1। बिल्कुल मेरा मुद्दा! – Randolpho

+0

ध्यान रखें कि, जैसा कि लिंक किए गए आलेख में बताया गया है, संरचना को अक्सर इंटरफ़ेस विरासत के माध्यम से कार्यान्वित किया जाता है। यदि ऐसा है, तो अभी भी मूल समस्या है। – Mike

0

एक समाधान बेस इन्फो क्लास/इंटरफेस बनाने के लिए है जो क्लास ContactInfo, StudentInfo, और BillingInfo से प्राप्त होता है। किसी प्रकार की व्यक्ति वस्तु है जिसमें जानकारी ऑब्जेक्ट्स की एक सूची है, और फिर आप InfoInfo, StudentInfo, आदि के साथ जानकारी ऑब्जेक्ट्स की सूची पॉप्युलेट कर सकते हैं।

1

ऐसा लगता है कि zope.components जैसे घटक आर्किटेक्चर के साथ काफी अच्छी तरह से और flexibly किया जा सकता है। घटक एक तरह से सुपर-लचीली संरचना पैटर्न हैं।

इस मामले में मैं कुछ जानकारी के आधार पर मार्कर इंटरफेस सेट करने के लिए डेटा लोड करते समय कुछ भी कर सकता हूं, जैसे कि उम्र> = 18 आपने आईएडल्ट इंटरफ़ेस सेट किया है, आदि। फिर आप प्राप्त कर सकते हैं

adultschema = IAdultSchema(person) 

या ऐसा कुछ करने से वयस्क जानकारी। (संपादित करें: असल में मैं शायद

queryAdapters(person, ISchema) 

एक ही बार में सभी स्कीमा प्राप्त करने के लिए उपयोग करना चाहते हैं :)

एक घटक वास्तुकला overkill हो सकता है, लेकिन एक बार आप उस तरह सोच करने के लिए इस्तेमाल किया गया,। कई समस्याएं तुच्छ हो जाती हैं। :)

इसके बारे में Brandons उत्कृष्ट PyCon बात की जाँच करें: http://www.youtube.com/watch?v=UF77e2TeeQo और मेरे परिचय ब्लॉग पोस्ट: http://regebro.wordpress.com/2007/11/16/a-python-component-architecture/

1

मैं अपनी आवश्यकताओं को अति सरल कर रहे हैं, के बाद से कोई वास्तविक स्थिति में है, तो आप अपने खुद के साथ छात्रों को हो सकता है लगता है बिलिंग को संभालने के लिए खाते हैं भले ही वे नाबालिग हैं जिन्हें माता-पिता संपर्क जानकारी की आवश्यकता है। साथ ही, आपके पास वास्तविक स्थिति में बिलिंग जानकारी से अभिभावकीय संपर्क जानकारी अलग हो सकती है। आपके पास बिल करने के लिए किसी और के साथ वयस्क छात्र भी हो सकते हैं। लेकिन, एक तरफ - आपकी आवश्यकताओं को देखते हुए, यहां एक तरीका है:

कक्षाएं: व्यक्ति, बिलिंगिंग, छात्रइंफो।

सभी लोगों को वर्ग व्यक्ति के उदाहरण हैं ...

class Person: 
    # Will have contact fields all people have - or you could split these off into an 
    # object. 
    parent  # Will be set to None for adults or else point to their parent's 
        # Person object. 
    billing_info # Set to None for non-adults, else to their BillingInfo object. 
    student_info # Set to None for non-student parents, else to their StudentInfo 
        # object. 

क्षेत्रों जाँच हो रही है के रूप में आप की इच्छा आप सूचियां बनाने के लिए अनुमति देगा।

0

स्यूडोकोड में, आप कुछ इस तरह कर सकता है:

Class Student 
    Inherits WhateverBase 

    Private m_StudentType as EnumStudentTypes 'an enum containing: Adult, Child 
    Private m_Billing as Billing 
    Private m_Contact as Contact 
    Private m_Parent as Parent 

    Public Sub Constructor(studentType, billing, contact, parent) 
     ...logic to make sure we have the right combination depending on studentType. 
     ...throw an exception if we try to assign a a parent to an adult, etc. 
     ...maybe you could have seperate constructors, one for each studenttype.    
    End Sub 


    Public Property StudentType as EnumStudentTypes 
     Get 
      Return m_StudentType 
     End Get 
    End Sub 

    Public Property Parent 
     Get 
      ...code to make sure we're using a studentType that has a parent, 
      ...and throws an exception if not. Otherwise it returns m_Parent 
     End Get 
    End Sub 


    [more properties] 
End Class Student 

तो फिर तुम एक वर्ग StudentManager कहा जाता है बना सकते हैं:

Public Class StudentManager 
    Public Function GetAdults(studentCollection(Of Students)) as StudentCollection(Of Students) 
     Dim ResultCollection(Of Students) 

     ...Loop through studentCollection, adding all students where Student.StudentType=Adult 

     Return ResultCollection 
    End Function 


    [Other Functions] 
End Class 

Public Enum StudentType 
    Adult=0 
    Child=1 
End Enum 
संबंधित मुद्दे