2009-06-24 11 views
6

मैं है निम्नलिखित एपीआई:जावा एपीआई तोड़

public class MyApiImpl { 

    public void method() throws MyException { 
    if (C1) { 
     throw new MyException("c1 message"); 
    } else if (c2) { 
     throw new MyException("c2 message"); 
    } 
    ... 
    } 
} 

आप कार्य करें:

public interface MyApi { 

    /** 
    * Performs some stuff. 
    * @throws MyException if condition C1 
    */ 
    public void method() throws MyException; 
} 

अब मैं अपने API कार्यान्वयन में निम्नलिखित संशोधन प्रदर्शन कर रहा हूँ

public class MyApiImpl { 

    public void method() throws MyException { 
    if (C1) { 
     throw new MyException("c1 message"); 
    } 
    ... 
    } 
} 

ने ले ली है इसे एपीआई ब्रेकेज के रूप में मानें?

ग्राहक का कोड अभी भी संकलित होगा लेकिन एपीआई जावाडोक द्वारा परिभाषित विधि अनुबंध अब और अधिक सम्मानित नहीं है क्योंकि MyExcepiton को "नई" स्थिति से फेंक दिया गया है।

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

उस पर आपका क्या दृष्टिकोण है?

उत्तर

7

हां, आप सी 1 नहीं होने पर अपवाद फेंक कर इंटरफ़ेस का अनुबंध तोड़ रहे हैं।

अंगूठे के नियम के रूप में, इंटरफ़ेस अनुबंध को योनर करना आसान है, तो इसे तोड़ना आसान नहीं है :) यदि इंटरफ़ेस को स्पष्ट सी 1 के संदर्भ में परिभाषित नहीं किया गया है, लेकिन अधिक सामान्य शब्दों में, यह बहुत कुछ देता है लचीलापन।

6

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

यह वास्तव में दोनों तरीकों से जा सकता है, यह आपके और आपके ग्राहकों के बीच है कि आपका दृष्टिकोण क्या होगा।

1

यह काफी हद तक निर्भर करता है कि सी 2 क्या है। क्या यह पूर्व-मौजूदा अनुबंध पर तार्किक सीमाओं के भीतर है? यदि ऐसा है, तो आप MyException फेंक कर अनुबंध को संतुष्ट कर रहे हैं। यदि नहीं तो शायद आपको एक नया प्रकार का अपवाद फेंकने की जरूरत है।

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

1

मैं कहूंगा "नहीं", कोई एपीआई ब्रेकेज नहीं, जब तक MyException एक रनटाइम अपवाद नहीं है। तो यह है।

वैसे भी, मैं शर्त सी 2

और दोनों स्थितियों C1 और C2 के लिए MyException उपवर्ग था होना चाहिए "असाधारण" IMHO, मैं फेंक अपवाद

1

यह एक टूटना है की एक आदत नहीं होगा। चाहे एपीआई भाषा संरचनाओं द्वारा लागू किया गया हो या बस दस्तावेज अप्रासंगिक है।

चाहे यह ब्रेकेज क्लाइंट कोड के लिए समस्या का कारण बनता है, एक अलग सवाल है। ऐसा हो सकता है कि आप एक दोष को ठीक कर रहे हैं और इसे ठीक करने के लिए केस सी 2 को कवर करने की आवश्यकता है। उस सम्मान से ग्राहक कोड डेवलपर खुश हो सकते हैं कि आपने यह परिवर्तन किया है (मान लीजिए कि वे वर्तमान में इस तरह के दोष में काम नहीं कर रहे हैं जो परिवर्तन के चेहरे में टूट जाएगा!)

1

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

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