यहाँ एक समस्या है जिसे मैं अक्सर चलाता हूं: एक वेब शॉप प्रोजेक्ट हो जिसमें प्रोडक्ट क्लास हो। मैं एक फीचर जोड़ना चाहता हूं जो उपयोगकर्ताओं को किसी उत्पाद के लिए समीक्षा पोस्ट करने की अनुमति देता है। इसलिए मेरे पास एक समीक्षा वर्ग है जो एक उत्पाद का संदर्भ देता है। अब मुझे एक ऐसी विधि की आवश्यकता है जो किसी उत्पाद की सभी समीक्षाओं को सूचीबद्ध करे। दो संभावनाएँ हैं:
(ए)
public class Product {
...
public Collection<Review> getReviews() {...}
}
(बी)
public class Review {
...
static public Collection<Review> forProduct( Product product ) {...}
}
कोड को देखने से, मैं चुनता हूं (ए): यह स्थिर नहीं है और इसे पैरामीटर की आवश्यकता नहीं है। हालांकि, मुझे लगता है कि (ए) एकल जिम्मेदारी सिद्धांत (एसआरपी) और ओपन-क्लोज्ड सिद्धांत (ओसीपी) का उल्लंघन करता है जबकि (बी) ऐसा नहीं करता है:
(एसआरपी) जब मैं किसी उत्पाद के लिए समीक्षा के तरीके को बदलना चाहता हूं, तो मुझे उत्पाद वर्ग को बदलना होगा। लेकिन उत्पाद वर्ग को बदलने का केवल एक कारण होना चाहिए। और यह निश्चित रूप से समीक्षा नहीं है। यदि मैं उत्पाद में उत्पादों के साथ कुछ करने के लिए हर सुविधा को पैक करता हूं, तो यह जल्द ही बंद हो जाएगा।
(OCP) मुझे इस सुविधा के साथ इसे विस्तारित करने के लिए उत्पाद वर्ग को बदलना होगा। मुझे लगता है कि यह सिद्धांत के 'क्लोज्ड फॉर चेंज' भाग का उल्लंघन करता है। इससे पहले कि मुझे समीक्षाओं को लागू करने के लिए ग्राहक का अनुरोध मिले, मैंने उत्पाद को समाप्त मान लिया, और इसे "बंद" कर दिया।
क्या अधिक महत्वपूर्ण है: ठोस सिद्धांतों का पालन करना, या एक सरल इंटरफ़ेस होना?
या मैं यहां कुछ गलत कर रहा हूं?
परिणाम
वाह, आपके सभी महान उत्तरों के लिए धन्यवाद! आधिकारिक उत्तर के रूप में इसे चुनना कठिन है।
मुझे उत्तर से मुख्य तर्क संक्षेप में प्रस्तुत करने चाहिए:
- समर्थक (ए): OCP कानून नहीं है और कोड मामलों की पठनीयता भी है।
- समर्थक (ए): इकाई संबंध नौगम्य होना चाहिए। दोनों वर्गों को इस संबंध के बारे में पता हो सकता है।
- समर्थक (ए) + (बी): दोनों (और ए) में (बी) को सौंपते हैं ताकि उत्पाद को फिर से बदलने की संभावना कम हो।
- समर्थक (सी): खोजक विधियों को तृतीय श्रेणी (सेवा) में रखें जहां यह स्थिर नहीं है।
- गर्भनिरोधक (बी): परीक्षणों में नकल।
मेरे काम में कुछ अतिरिक्त चीजों ने योगदान दिया:
- प्रो (बी): हमारा ओआरएम ढांचा स्वचालित रूप से (बी) के लिए कोड उत्पन्न कर सकता है।
- समर्थक (ए): हमारे ओआरएम ढांचे के तकनीकी कारणों के लिए, कुछ मामलों में "बंद" इकाई को बदलना आवश्यक होगा, स्वतंत्र रूप से जहां खोजकर्ता जाता है। इसलिए मैं हमेशा एसओएलआईडी से नहीं रह पाऊंगा, वैसे भी।
- गर्भनिरोधक (सी): बहुत अधिक उपद्रव ;-)
निष्कर्ष
मैं अपने वर्तमान प्रोजेक्ट के लिए प्रतिनिधिमंडल के साथ दोनों (ए) + (बी) का उपयोग कर रहा हूं। एक सेवा-उन्मुख वातावरण में, हालांकि, मैं (सी) के साथ जाऊंगा।
Assert(5 = Math.Abs(-5));
Abs()
समस्या नहीं है, किसी चीज का परीक्षण करना जो उस पर निर्भर करता है। एक मॉक का उपयोग करने के लिए आश्रित कोड-अंडर-टेस्ट (CUT) को अलग करने के लिए आपके पास सीम नहीं है। इसका मतलब है कि आप इसे परमाणु इकाई के रूप में नहीं देख सकते हैं और आपके सभी परीक्षण एकीकरण परीक्षण बनते हैं जो कि इकाई तर्क का परीक्षण करते हैं। परीक्षण में विफलता CUT या Abs()
(या उसके आश्रित कोड) में हो सकती है और इकाई परीक्षणों के निदान लाभों को हटा देती है।