2009-05-18 12 views
6

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

जबकि मुझे स्मॉलटाक बिल्कुल नहीं पता, वह भाषा रूबी से बहुत पहले रही है। मैंने यह देखने के लिए कुछ शोध किया है कि कैसे और कैसे स्मॉलटॉक ने इनमें से कुछ समस्याओं को हल किया लेकिन Google पर बहुत कुछ नहीं मिला। तो मैं यहां हूं, छोटे-छोटे लोगों से पूछना कि क्या वे अपना ज्ञान साझा कर सकते हैं।

परिदृश्य एक: बग फिक्सिंग संघर्ष

परियोजना ए और बी पर परियोजना सी परियोजना सी निर्भर एक बग है। प्रोजेक्ट ए और बी रिलीज में परियोजना सी

के लिए एक फिक्स शामिल है यदि आपका कोड प्रोजेक्ट ए और बी का उपयोग करता है, तो आप कैसे जान सकते हैं कि पैच संघर्ष नहीं करेंगे?

परिदृश्य बी: पुराना बग फिक्सिंग

परियोजना सी अपनी परियोजना की एक निश्चित लघु संस्करण जारी करता है।

यदि आप प्रोजेक्ट ए लोड करते हैं, तो संभावित ब्रेकेज के साथ पैच अभी भी लागू होगा? मुझे यह जानने में दिलचस्पी है कि क्या कुछ तंत्र हैं, उदाहरण के लिए, यदि कोड ठीक किया गया है तो पैच लोड न करें।

परिदृश्य सी: परस्पर विरोधी एक्सटेंशन

परियोजना ए और बी उपयोग परियोजना सी वर्ग फू। दोनों फू को एक यूटिलिटी विधि जोड़ें, कहें, #toDate। ए का टूडेट संस्करण दिनांक स्ट्रिंग देता है, और बी दिनांक दिनांक में से एक।

यदि आप दोनों परियोजनाओं (सी डी के साथ) लोड करते हैं, तो क्या कोई ऐसी तंत्र है जो संघर्ष को चेतावनी/रोक देगा? या किसी विधि में गलत उम्मीद के कारण रनटाइम त्रुटि में फेंकने तक आपको इंतजार करना पड़ेगा?

सवाल अद्यतन

जवाब पढ़ने के बारे में, मुझे लगता है मेरे सवाल काफ़ी व्यापक है और अस्पष्ट था। तो यहां इसका एक पुनर्लेखित संस्करण है।

+0

देखें वास्तव में एक समस्या monkeypatch करने की क्षमता है? – CookieOfFortune

+0

बंदरगाह की आपकी आलोचना चिह्न से काफी दूर लगती है। बंदरगाह में निहित कुछ भी नहीं है जो शुरुआती कक्षा के डिजाइन की तुलना में किसी भी तरह की अव्यवस्थितता को जन्म देता है। न ही यह अन्य कोड की तुलना में स्वाभाविक रूप से अधिक "क्रूर" है। किसी ऑब्जेक्ट को अलग-अलग फाइलों में विभाजित करना सच है, हालांकि कुछ तर्क देंगे कि प्रबंधनीय मॉड्यूल होने की अच्छी बात है - असल में, इसे उद्देश्य-सी में समूह से संबंधित कार्यक्षमता के लिए अच्छा अभ्यास माना जाता है। शायद भाषा की सुविधाओं के मुकाबले कोडर के साथ आपकी समस्याएं अधिक हैं। – Chuck

+0

किसी भी सीएई में, अलग-अलग फ़ाइलों में विभाजित चीजों की पूरी धारणा गलत है; स्मॉलटॉक इस तरह से चीजें नहीं करता है। –

उत्तर

1

यह कहता है "हाँ! इसके लिए जाओ!"

पूरी धारणा वास्तव में शायद स्मॉलटाक में दिखाई दे रही है।

क्लास ब्राउज़र में रूट क्लास पर जाएं, और आप अपनी पसंद की छवि में सभी विधियां जोड़ सकते हैं।

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

1

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

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

+0

+1, विधि ओवरराइडिंग (एक पूरी तरह से अलग बात) के साथ भ्रमित करने के लिए -1 – Javier

+0

बंदर पैचिंग पर विकिपीडिया लेख पढ़ने के बाद स्पष्ट रूप से पूरी तरह से अलग बात नहीं है। खैर, ऐसा लगता है कि स्मॉलटाक में हम एक लाइव छवि में कुछ विधि बदलकर बंदर पैचिंग कर रहे हैं? हम वैसे भी ऐसा कर रहे हैं। –

+0

न्यूज़पीक में यह वास्तव में वही है :) –

5

स्मॉलटॉक में, हमने परंपरागत रूप से इस ओवरराइडिंग को बुलाया है। वर्जन कंट्रोल टूल्स के आधार पर आप स्मॉलटाक के साथ उपयोग करते हैं, आप या तो;

  • पैकेज मूल रूप से स्वामित्व है कि प्रश्न में वर्ग/विधि (रों)
  • एक नए पैकेज जो सवाल
में वर्ग/विधि (ओं) का ओवरराइड स्वामी होगा बनाने का एक नया संस्करण बनाने

विजुअलवर्क्स और ऑब्जेक्टस्टूडियो (स्मॉलटॉक मैं सबसे परिचित हूं) में, बाद का दृष्टिकोण उपयोग किया जाता है। वीए स्मॉलटाक में, जहां ईर्ष्या का उपयोग किया जाता है, पूर्व दृष्टिकोण लिया जाता है। मेरा मानना ​​है कि स्क्वाक मॉन्टिसेलो का उपयोग करके बाद के दृष्टिकोण का पालन करेगा, लेकिन मैं पूरी तरह से निश्चित नहीं हूं।

अधिकांश स्मॉलटॉक कार्यान्वयन में, ओवरराइड कोड के मूल संस्करण और वर्तमान में स्थापित ओवरराइड दोनों को देखना आसान है।

क्लाइंट अनुप्रयोगों में, ओवरराइड वास्तव में केवल तभी प्रभावित होते हैं जब आप वेनॉर (या स्क्वाक टीम, एट अल।) से स्मॉलटॉक के नए संस्करण में अपडेट करते हैं। सर्वर ऐप्स के लिए, जहां सर्वर में एकाधिक एप्लिकेशन निवासी हो सकते हैं, आपको जो करना है, उसके बारे में आपको और अधिक सावधान रहना होगा।

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

0

अपने आप को उत्तर देना, यहाँ मेरे विचार की वर्तमान बिंदु है:

परिदृश्य ए और बी

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

एक नया संस्करण जारी करने के लिए अपने फिक्स और गति को मर्ज करने के लिए अपस्ट्रीम की इच्छा के आधार पर, आप एक बंदरगाह बनाने की कल्पना कर सकते हैं। उस स्थिति में, सबसे अच्छा यह होगा कि एक तंत्र होना चाहिए जो कहता है:

monkeypatch(ClassName, :method, &newcode) of the broken project 
is applied if project.version in [a set of releases where the bug exist] 
if the project version is unknown to the monkeypatch, 
    raise an error to tell the developer to fix the monkeypatch (check if bug exist). 
if a monkeypatch for that project, classname and method already exist, yell 

यह मेरे सिर के शीर्ष से है। यदि किसी बगफिक्स को विधि परिवर्तन से अधिक की आवश्यकता होती है तो यह समस्याग्रस्त हो सकता है।

परिदृश्य सी: TODO

+0

परिदृश्य सी के लिए, विवादों से बचने का सबसे अच्छा तरीका चयनकर्ता नामस्थान का उपयोग करना है, इसलिए यदि आपके पास पैकेज फू और पैकेज बार है, तो दोनों कुछ वर्ग के व्यवहार को विस्तारित करना चाहते हैं, जैसे #toDate: method , आप इसे 2 बार बढ़ाते हैं: पैकेज Foo fooToDate का उपयोग करके विस्तारित करें: नाम, और पैकेज बार, - barToDate:। और समस्या चली गई :) –

1

आप देख रहे हैं अत्याधुनिक समाधान के लिए, Changeboxes पर एक नज़र डालें। चेंजबॉक्स का शोध प्रोटोटाइप स्क्वाक स्मॉलटाक पर आधारित है।

http://scg.unibe.ch/research/changeboxes

+0

सूचक के लिए धन्यवाद! – zimbatm

संबंधित मुद्दे