जब रोब पाइक कहते हैं, "गो कंपोज़िशन के बारे में है", तो वास्तव में उसका क्या मतलब है? [बन्द है]


12

से कम तेजी से और अधिक है

यदि C ++ और Java प्रकार की पदानुक्रमों और प्रकारों के वर्गीकरण के बारे में हैं, तो गो रचना के बारे में है।

जवाबों:


13

उसका अर्थ है कि आप कहां के आदेश पर कुछ का उपयोग करेंगे:

class A : public B {};

जावा या C ++ जैसी किसी चीज़ में, आप जिस चीज़ का उपयोग करेंगे (उसके समतुल्य):

class A {
    B b;
};

हां, यह विरासत जैसी क्षमताएं प्रदान करता है। आइए उदाहरण का विस्तार थोड़ा ऊपर करें:

struct B {
    int foo() {}
};

struct A { 
    B b;
};

A a;

a.foo();  // not allowed in C++ or Java, but allowed in Go.

हालांकि, ऐसा करने के लिए, आप C ++ या जावा में एक सिंटैक्स का उपयोग नहीं करते हैं - आप अपने स्वयं के नाम के बिना एम्बेडेड ऑब्जेक्ट को छोड़ देते हैं, इसलिए यह अधिक पसंद है:

struct A {
   B;
};

1
मैं उत्सुक हूं, मैं सी ++ (पसंद रचना) में ऐसा करता हूं। क्या वे सुविधाएँ प्रदान करते हैं जो जावा / सी ++ में मुझे रचना करने में मदद करती हैं जो मुझे विरासत में प्राप्त करने होंगे?
डग टी।

2
@DougT।: हाँ, मैंने एक उदाहरण में संपादित किया है जो सामान्य विचार दिखा रहा है (का हिस्सा) कि यह क्या अनुमति देता है।
जेरी कॉफिन

2
मुझे लगता है कि यह बात याद आती है: अंतर केवल एक वाक्यात्मक नहीं है, जिसका अर्थ है कि आप अपने वर्गीकरण को बनाने के लिए एम्बेडिंग का उपयोग करते हैं। तथ्य यह है कि ओओपी विधि की कमी ओवरराइडिंग आपको अपनी शास्त्रीय वर्गीकरण का निर्माण करने से रोकती है और आपको इसके बजाय संरचना का उपयोग करना चाहिए।
डेनिस सेगुरेट जूल

1
@ डायस्ट्रो: जावा की तुलना में, आपके पास शायद एक बिंदु है। सी ++ की तुलना में, इतना नहीं - क्योंकि (कम से कम उन लोगों के बीच एक सुराग) जो विशालकाय वर्गीकरणों को आखिरी बार 20 साल पहले के करीब देखा गया था।
जेरी कॉफिन

1
@ डिस्ट्रॉय: आप अभी भी समझ नहीं रहे हैं। आधुनिक सी ++ में तीन स्तरीय पदानुक्रम अनसुना करने के लिए है। C ++ में आप उन्हें iostreams लाइब्रेरी और अपवाद पदानुक्रम में देखेंगे - लेकिन कहीं और नहीं। अगर आज iostreams लाइब्रेरी को डिज़ाइन किया जा रहा था, तो मुझे लगता है कि यह कहना सुरक्षित है कि यह इस तरह से भी नहीं होगा। नीचे पंक्ति: आपके तर्क सी ++ के बारे में कम बताते हैं कि आप इसके साथ कितने स्पर्श से बाहर हैं। यह देखते हुए कि आपने दशकों में इसका उपयोग नहीं किया है, यह समझ में आता है। क्या मतलब नहीं है कहने की कोशिश कर रहा है कि उस दिनांकित अनुभव के आधार पर C ++ का उपयोग कैसे किया जाता है।
जेरी कॉफिन

8

यह सवाल / समस्या के लिए इसी तरह की तरह है यह एक

गो में, आपके पास वास्तव में OOP नहीं है।

यदि आप किसी वस्तु को "विशेषज्ञ" करना चाहते हैं, तो आप इसे एम्बेड करके करते हैं, जो एक रचना है, लेकिन कुछ अच्छाइयों के साथ यह आंशिक रूप से विरासत के समान है। आप इसे इस तरह करते हैं:

type ConnexionMysql struct {
    *sql.DB
}

इस नमूने में, ConnexionMysql * sql.DB का एक प्रकार का विशेषज्ञता है, और आप ConnexionMysql पर * sql.DB पर परिभाषित कार्यों को कॉल कर सकते हैं:

type BaseMysql struct {
    user     string
    password string
    database string
}

func (store *BaseMysql) DB() (ConnexionMysql, error) {
    db, err := sql.Open("mymysql", store.database+"/"+store.user+"/"+store.password)
    return ConnexionMysql{db}, err
}

func (con ConnexionMysql) EtatBraldun(idBraldun uint) (*EtatBraldun, error) {
    row := con.QueryRow("select pv, pvmax, pa, tour, dla, faim from compte where id=?", idBraldun)
    // stuff
    return nil, err
}

// somewhere else:
con, err := ms.bd.DB()
defer con.Close()
// ...
somethings, err = con.EtatBraldun(id)

तो पहली नजर में आप सोच सकते हैं कि यह रचना आपकी सामान्य करदेयता बनाने का उपकरण है।

परंतु

यदि कोई कार्य * sql.DB पर परिभाषित एक फ़ंक्शन * sql.DB पर परिभाषित अन्य फ़ंक्शन को कॉल करता है, तो यह मौजूद होने पर भी ConnexionMysql पर पुनर्निर्धारित फ़ंक्शन को कॉल नहीं करेगा।

शास्त्रीय विरासत के साथ, आप अक्सर ऐसा कुछ करते हैं:

func (db *sql.DB) doComplexThing() {
   db.doSimpleThing()
   db.doAnotherSimpleThing()
}

func (db *sql.DB) doSimpleThing() {
   // standard implementation, that we expect to override
}

यही है, आप doComplexThingसुपर क्लास को एक संगठन के रूप में विशेषज्ञता के कॉल पर परिभाषित करते हैं।

लेकिन Go में, यह विशेष फ़ंक्शन को नहीं बल्कि "सुपरक्लास" फ़ंक्शन कहेगा।

इसलिए, यदि आप एक एल्गोरिथ्म को * sql.DB पर परिभाषित कुछ फ़ंक्शन को कॉल करने की आवश्यकता चाहते हैं, लेकिन ConnexionMySQL (या अन्य विशेषज्ञता) पर फिर से परिभाषित किया गया है, तो आप इस एल्गोरिथ्म को * sql.DB के फ़ंक्शन के रूप में परिभाषित नहीं कर सकते, लेकिन इसे कहीं और परिभाषित कर सकते हैं। और यह फ़ंक्शन केवल प्रदान किए गए विशेषज्ञता के लिए कॉल की रचना करेगा।

आप इंटरफेस का उपयोग करके इसे इस तरह कर सकते हैं:

type interface SimpleThingDoer {
   doSimpleThing()
   doAnotherSimpleThing()
}

func doComplexThing(db SimpleThingDoer) {
   db.doSimpleThing()
   db.doAnotherSimpleThing()
}

func (db *sql.DB) doSimpleThing() {
   // standard implementation, that we expect to override
}

func (db ConnexionMySQL) doSimpleThing() {
   // other implemenation
}

यह वर्ग पदानुक्रम के शास्त्रीय अधिभाव से काफी अलग है।

विशेष रूप से, आप स्पष्ट रूप से दूसरे से एक समारोह कार्यान्वयन विरासत में सीधे तीसरे स्तर का नहीं हो सकता है।

व्यवहार में, आप ज्यादातर (ऑर्थोगोनल) इंटरफेस का उपयोग करते हुए समाप्त हो जाएंगे और फ़ंक्शन को उन कॉल को व्यवस्थित करने के कार्यान्वयन के "सुपरक्लास" होने के बजाय कॉल प्रदान करते हैं।

मेरे अनुभव में, यह पदानुक्रमों की व्यावहारिक अनुपस्थिति को एक स्तर से अधिक गहरा करता है।

बहुत बार, अन्य भाषाओं में, आपके पास रिफ्लेक्स होता है, जब आप देखते हैं कि अवधारणा ए अवधारणा बी का एक विशेषीकरण है, तो इस तथ्य को एक वर्ग बी और एक वर्ग ए को बी के उपवर्ग के रूप में बनाकर इसे संशोधित करने के बजाय। अपने डेटा के आसपास का कार्यक्रम, आप अपने कोड में वस्तुओं की वर्गीकरण को पुन: प्रस्तुत करने में समय बिताते हैं, इस सिद्धांत पर कि यह वास्तविकता है।

गो में आप एक सामान्य एल्गोरिथ्म को परिभाषित नहीं कर सकते और इसे विशेषज्ञ नहीं बना सकते। आपको एक सामान्य एल्गोरिथ्म को परिभाषित करना चाहिए और यह सुनिश्चित करना चाहिए कि यह सामान्य है और प्रदान किए गए इंटरफ़ेस कार्यान्वयन के साथ काम करता है।

कुछ पदानुक्रम के पेड़ों की बढ़ती जटिलता से भयभीत होकर, जिस पर कोडर एक एल्गोरिथ्म को समायोजित करने की कोशिश करने के लिए जटिल हैक कर रहे थे, जिसका तर्क अंत में सभी स्तरों का तात्पर्य है, मैं कहूंगा कि मैं सरलता से खुश हूं लॉजिक, भले ही यह हमला करे आप सिर्फ अपने आवेदन मॉडल की अवधारणाओं को संशोधित करने के बजाय सोचने के लिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.