एक महत्वपूर्ण बग को ठीक करते समय शब्दार्थ संस्करण


18

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

जो परिवर्तन मैं करना चाहता हूं, वह घूमता है कि कैसे पुनरावृत्तियों का उपयोग किया जाता है। वर्तमान में, उपयोगकर्ताओं को यह करना होगा:

while ($element = $iterator->next()) {
   // ...
}

जो गलत है, कम से कम PHP के मूल Iterator इंटरफ़ेस में । मैं इसके साथ प्रतिस्थापित करना चाहता हूं:

while ($iterator->valid()) {
   $element = $iterator->current();
   // ...
   $iterator->next();
}

जो अनुरूप है:

foreach ($iterator as $element) {
    // ...
}

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

मेरे पास अंततः 2.0.0 जारी करने की योजना है, लेकिन मुझे लगा कि यह तब था जब आपने पुस्तकालय को पूरी तरह से फिर से लिखा था और कई सार्वजनिक एपीआई परिवर्तन लागू किए थे। क्या इस रिफैक्टिंग वॉरंट की शुरुआत एक बड़े संस्करण को रिलीज़ करती है? मैं वास्तव में यह नहीं देख सकता कि यह कैसे होता है - मैं इसे 1.8.0 या 1.7.4 के रूप में जारी करने में अधिक सहज महसूस करता हूं। किसी को कुछ सलाह है?


आपको पिछड़ी अनुकूलता रखने से क्या रोकता है?
मौविसील

फिलहाल, next()वर्तमान तत्व को पुनः प्राप्त करने और आंतरिक पॉइंटर को आगे बढ़ाने के लिए विधि का उपयोग किया जाता है। क्या गलत है। next()सूचक को ले जाना चाहिए, और current()पुनः प्राप्त करने के लिए उपयोग किया जाता है ...
hohner

6
इसलिए नए संस्करण में लोगों को next()केवल उस पॉइंटर के रिटर्न वैल्यू की परवाह नहीं करनी चाहिए , जो वास्तव में संगतता को नहीं तोड़ता है
शाफ़्ट फ्रीक

जवाबों:


29

आप संकोच करते हैं क्योंकि आप शब्दार्थ संस्करण बनाना नहीं चाहते हैं, आप "विज्ञापन समर्थन संस्करण" बनाना चाहते हैं। आप दुनिया को यह बताने के लिए एक संस्करण संख्या "2.0" की उम्मीद करते हैं कि आपके पास अब अपने पुस्तकालय में नई शांत सुविधाओं का एक गुच्छा है, न कि आपने एपीआई को बदल दिया है। यह ठीक है (कई सॉफ्टवेयर कंपनियां और / या डेवलपर्स ऐसा करते हैं)। IMHO आपके पास निम्नलिखित विकल्प हैं:

  • सिमेंटिक वर्जनिंग से चिपके रहें और इस तथ्य के साथ रहें कि आपको वर्जन नंबर को 2.0.0 में बदलना है
  • अपनी वर्जनिंग स्कीम को 4 नंबरों में बदलें। "1.1.7.3" अब एपीआई बदलने के बाद आपका अगला संस्करण "1.2.0.0" है, और "2.0.0.0" "पूरी तरह से नया 2.x उत्पाद परिवार" में से पहला है
  • अपने फिक्स को पीछे की ओर संगत करें (ताकि की कार्यक्षमता में बदलाव न करें next, बस validऔर currentकार्यों को जोड़ें )। फिर आप अगले संस्करण संख्या के रूप में "1.8.0" का उपयोग कर सकते हैं। अगर आपको लगता है कि व्यवहार को बदलना nextवास्तव में महत्वपूर्ण है, तो इसे 2.0.0 में करें।

जितना अंतिम विकल्प होगा, उतना ही सही समाधान होगा: आप यह नहीं कर सकते next()कि वह क्या कर रहा है। कार्यक्षमता को सही ढंग से लागू करने के लिए, इसे कुछ अलग करना होगा। इसलिए अगर मैं इसे पीछे की ओर संगत बनाता हूं - नई कार्यक्षमता / सुधार भी गलत होगा, और परिवर्तन के पूरे बिंदु को कम कर देगा।
होहनेर

2
व्यापक सुझाव जो आप अपनी तीसरी बुलेट में करते हैं (फिक्स बैकवर्ड को संगत बनाते हैं) विचार करने के लिए एक अच्छा है। यह इस विशेष मामले में काम नहीं कर सकता है, लेकिन समग्र तकनीक विचार करने योग्य है। फ़ंक्शन अधिक जटिल होने पर समाप्त होता है लेकिन यह एक व्यावहारिक मार्ग हो सकता है।

सभी को धन्यवाद: अगर मैं दो को स्वीकार कर सकता हूं तो मैं करूंगा। मैंने next()सभी नई कार्यक्षमता को करने के लिए नई पद्धति को हैक करना समाप्त कर दिया , साथ ही पीछे की संगत बनाने के लिए क्या आवश्यक था। यह इस तरह की नई कार्यक्षमता को धूमिल करने के लिए भयानक तरह का महसूस करता है, लेकिन हे हो।
होनर

10
@ कोहबर: फिर अब पुराने व्यवहार को पदावनत करने के लिए दस्तावेज करने का समय है, इसलिए आप इसे 2.0.0 में निकाल सकते हैं।
Jan Fabry

7

सिमेंटिक संस्करण के लिए टॉम के गाइड के साथ छड़ी।

सार्वजनिक API में कोई भी महत्वपूर्ण परिवर्तन दोनों बिंदुओं में से किसी एक पर किया जाना चाहिए:

  1. कभी नहीँ
  2. एक प्रमुख रिलीज अपडेट पर

मेरा वोट, वैसे, पहली बार है। लेकिन मैं स्वीकार करता हूं कि यह केवल चीजों को रौंदने के लिए उपयुक्त है।

समस्या पश्चगामी संगतता बनाए रख रही है और यह सुनिश्चित करती है कि आप अपने एपीआई के पिछले उपयोगकर्ताओं के लिए चीजों को न तोड़ें।

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

  1. नए दृष्टिकोण का उपयोग करने के लिए कोड को ठीक करें
  2. फिक्स को सत्यापित करें और सुनिश्चित करें कि यह कुछ भी नहीं तोड़ता है
  3. अपने उत्पाद के नए रिलीज़ को अपने अंतिम उपयोगकर्ताओं तक शिप करें

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

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

  1. अपने कोड ट्री में v2.0.0 ब्रांच बनाएं
  2. V2.0.0 शाखा में पहला योगदान दें, जो यह परिवर्तन है
  3. Release Notesसमय से पहले एक पूर्वावलोकन भेजें कि प्रसारण आ रहा है

और फिर धैर्य रखें क्योंकि अन्य चीजों को संचित करने में थोड़ा समय लगेगा जो संस्करण संख्या को एक नए प्रमुख रिलीज में अपग्रेड करने को सही ठहराते हैं। उन्नत सूचना (भाग 3) आपको अंतिम उपयोगकर्ताओं से प्रतिक्रिया प्राप्त करने का समय देती है ताकि यह पता लगाया जा सके कि परिवर्तन कितना प्रभाव डालने वाला है।


एक वैकल्पिक समाधान एक नया फ़ंक्शन जोड़ना है जो आपके इच्छित तरीके से संचालित होता है।

यदि आपके पास है foo()तो आप फ़िक्सेस fooCorrect()प्रदान करने के लिए बनाएंगे , लेकिन बैकवर्ड संगतता को भी पूरी तरह से संरक्षित करेंगे। और कुछ बिंदु पर आप foo()दूसरों को इसका उपयोग न करने देने के लिए समझ सकते हैं ।

वहां चुनौती यह है कि आपको कुछ और मिलेगा fooCorrect()जिसके भीतर यह अपडेट होना आवश्यक है और आप fooCorrectedCorrect()कुछ अन्य मूर्खतापूर्ण बकवास के साथ समाप्त होते हैं ।

यदि आप वास्तव में इसे अभी निर्धारित करना चाहते हैं, तो यह वैकल्पिक दृष्टिकोण संभवतः सबसे अच्छा मार्ग है। इस तरह से बहुत सारे अतिरिक्त कार्य करने के बारे में जागरूक और सावधान रहें क्योंकि यह एपीआई को काम करने के लिए कठिन बनाता है। और यह जागरूकता इस प्रकार की समस्याओं के सबसे बुरे को रोकने के लिए पर्याप्त हो सकती है।

लेकिन यह कुछ छोटा करने के लिए "कम से कम बुरा" दृष्टिकोण हो सकता है।


मैं आपसे सहमत हुँ। मेरे सामने समस्या यह है कि मैं पूरी तरह से v2.0.0 के लिए पुस्तकालय को फिर से लिखना चाहता हूं (क्योंकि इनमें से बहुत सारे मुद्दे हैं जिन्हें ठीक करने की आवश्यकता है); इसलिए मैं यह नहीं चाहता कि इस बड़े बदलाव का आधार बनाने के लिए पुनरावृत्तियों के रूप में इतना छोटा परिवर्तन हो। तो मेरे विकल्प या तो हैं: इस बग को अनदेखा करें, या बग को ठीक करें और इसे एक नए प्रमुख संस्करण में डालें?
होनर

@ हॉनर - नए कार्यों को बनाने के साथ एक वैकल्पिक दृष्टिकोण प्रदान करने के लिए अद्यतन उत्तर। इस बात का ध्यान रखें कि बहुत से नए, इसी प्रकार नामित कार्य लगभग एपीआई को बदलने के समान ही खराब हैं।

3
@ कोहबर: लगातार गलत> असंगत इस मामले में सही है। व्यवहार अभी भी कार्य करता है, यह सिर्फ मुहावरेदार नहीं है। इस बात पर विचार करें कि यदि आप यह परिवर्तन करते हैं तो आप क्लाइंट कोड को तोड़ रहे हैं । चेतावनी के बिना ऐसा करने के लिए सराहना नहीं की जाएगी।
फोसिवी

@ GlenH7 इस मामले में, वैकल्पिक रूप से नामित विधि का उपयोग करने से काम नहीं चलेगा। PHP का मूल पुनरावर्तक इन विधियों (यानी next()नहीं nextCorrect()) पर निर्भर करता है । मैं देखूंगा कि क्या मैं अगला संशोधित कर सकता हूं () तो यह पीछे की ओर संगत है और Iteratorइंटरफ़ेस को लागू करते समय काम करता है।
होनर

1
@ घोषी तुम हाजिर हो - मैं अब पूरी तरह से सहमत हूँ। अब यह कोशिश करने और असंभव को कोड करने का समय है: D
hohner
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.