2009-04-13 13 views
7

द्वारा डिज़ाइन के लिए सर्वोत्तम प्रथाएं क्या हैं अनुबंध प्रोग्रामिंग द्वारा डिज़ाइन के लिए सर्वोत्तम प्रथाएं क्या हैं।अनुबंध प्रोग्रामिंग

1) कुल प्रोग्रामिंग::

कॉलेज में मैं अनुबंध Paradigma (एक OO वातावरण में) हम तीन तरीकों से समस्या से निपटने के लिए सीखा है द्वारा डिजाइन सीखा अपने प्रभाव में हर संभव असाधारण मामलों को शामिल किया गया (सीएफ। मठ)

2) नाममात्र प्रोग्रामिंग: पूर्व शर्त मिलने पर केवल सही प्रभावों का वादा करता है। (अन्यथा प्रभाव अपरिभाषित है)

3) रक्षात्मक प्रोग्रामिंग: तरीकों

अब के अवैध आमंत्रण संकेत करने के लिए अपवाद का उपयोग करें, हम प्रत्येक स्थिति में सही उपयोग पर विभिन्न OO स्थितियों में ध्यान केंद्रित किया है, लेकिन हमने सीखा नहीं किया है जब उपयोग करें ... (अधिकतर रणनीति जहां अभ्यास द्वारा बीमा किया जाता है ..)

अब मुझे लगता है कि यह बहुत अजीब बात है कि मैंने अपने शिक्षक से नहीं पूछा है (लेकिन फिर, व्याख्यान के दौरान, किसी के पास नहीं है)

व्यक्तिगत रूप से, मैं कभी नाममात्र का उपयोग नहीं करता, और पूर्व शर्त को प्रतिस्थापित करता हूं अपवादों के साथ (इसलिए मैं इसका उपयोग करता हूं: 'पूर्व शर्त: विभाजक को शून्य से अलग होना चाहिए) और केवल प्रोग्राम कुल जो समझ में आता है (इसलिए मैं शून्य पर विभाजन पर पारंपरिक मूल्य वापस नहीं लौटाऊंगा), लेकिन यह विधि है बस व्यक्तिगत निष्कर्षों और पसंदों के आधार पर।

तो मैं आप पूछ रहा हूँ लोग:

वहाँ किसी भी सर्वोत्तम प्रथाओं कर रहे हैं ??

उत्तर

5

मुझे इस विभाजन के बारे में पता नहीं था, और यह वास्तव में मेरे अनुभव को प्रतिबिंबित नहीं करता है।

कुल प्रोग्रामिंग लगभग असंभव है। आप गारंटी नहीं दे सकते कि आप सभी असाधारण मामलों को कवर करते हैं। तो बुनियादी तौर पर आप अपने कार्यक्षेत्र को सीमित और स्थितियों है कि क्षेत्र से बाहर हैं अस्वीकार करना चाहिए

नाममात्र प्रोग्रामिंग वांछित नहीं है (कि पूर्व की स्थिति की भूमिका है)। अपरिभाषित प्रभाव पर प्रतिबंध लगा दिया जाना चाहिए।

रक्षात्मक प्रोग्रामिंग एक जरूरी है। आपको हमेशा तरीकों के अवैध आक्रमणों को संकेत देना चाहिए।

मैं पूरा डिजाइन-दर-अनुबंध तत्वों के कार्यान्वयन, जो है, मेरी राय में कुल प्रोग्रामिंग

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

पोस्टकंडिशन वांछित प्रभाव प्राप्त नहीं होने पर त्रुटि उत्पन्न करने के लिए। यहां तक ​​कि यदि यह आपकी गलती है, तो आपको कॉलर को सूचित करना चाहिए कि आप अपना लक्ष्य याद करते हैं।

Invariants यह जांचने के लिए कि ऑब्जेक्ट स्थिरता संरक्षित है।

+0

वास्तव में स्पष्ट लेकिन प्रासंगिक दावे को सीमित करने के दायरे की तरह है ताकि आप कोड को सरल बना सकें ... उत्कृष्ट सलाह! – Rob

1

यह सब कुछ उधार देता है कि आप ग्राहक को क्या जिम्मेदारियां और अनुबंध के कार्यान्वयनकर्ता को असाइन करना चाहते हैं।

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

एक और बिंदु यह है कि लोग और ढांचे अब अपवाद अनुवाद तंत्र को लागू करते हैं जो मुख्य रूप से चेक अपवादों (रक्षात्मक शैली) को रनटाइम अपवादों का अनुवाद करने के लिए उपयोग किया जाता है जो कुछ गलत होने पर पॉप अप हो जाएंगे। इस तरह अनुबंध के ग्राहक और कार्यान्वयनकर्ता को एक-दूसरे से निपटने के बारे में चिंता करने की कम जानकारी नहीं है।

फिर से यह मेरी निजी राय है कि मेरे पास सीमित अनुभव के साथ ही, मुझे इस विषय के बारे में और अधिक सुनना अच्छा लगेगा।

+0

आप या तो सरणी को पूर्व शर्त के रूप में क्रमबद्ध कर सकते हैं। हम इसे सी ++ में आवेषण के साथ करते हैं। –

+0

पूरे सरणी को जांचने के लिए वास्तव में एक बाइनरी खोज करने से अधिक समय लगता है :) – MahdeTo

+0

बस कुछ विचार: आप केवल कुछ तरीकों से पूर्व शर्त जांच सकते हैं, बिना किसी चीज के कह सकते हैं? आगे एक पूर्व शर्त सिर्फ कहा जा सकता है और परीक्षण नहीं किया गया है, निश्चित रूप से – Peter

1

... लेकिन उपयोग करने के लिए जब जो ...

मुझे लगता है कि सबसे अच्छा अभ्यास "संभव के रूप में बचाव की मुद्रा में" के रूप में हो रहा है हमें पता चला नहीं किया है। यदि आप कर सकते हैं तो अपने रनटाइम चेक करें। जैसा कि @ महदेतो ने कभी-कभी उल्लेख किया है कि प्रदर्शन कारणों से असंभव है; ऐसे मामलों में अपरिभाषित या असंतोषजनक व्यवहार पर वापस आते हैं।

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

0

कंप्यूटिंग के अधिकांश की तरह "यह निर्भर करता है" शायद सबसे अच्छा जवाब है।

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

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

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

मेरे लिए "नाममात्र प्रोग्रामिंग" असली दुनिया में एक मृत अंत है। आप मानते हैं कि यदि आपने सही मूल्यों को पारित किया है (जो आपने किया है) तो आपके द्वारा प्राप्त मूल्य अच्छा है। अगर आपकी धारणा गलत थी - तो आप टूट जाते हैं।

0

मुझे लगता है कि परीक्षण संचालित प्रोग्रामिंग उत्तर है। वास्तव में मॉड्यूल को लागू करने से पहले, आप पहले एक यूनिट टेस्ट बनाते हैं (इसे अनुबंध कहते हैं)। फिर धीरे-धीरे कार्यक्षमता को कार्यान्वित करें और सुनिश्चित करें कि अनुबंध अभी भी वैध है जैसा आप जाते हैं। आम तौर पर मैं सादे स्टब्स और मॉकअप के साथ शुरू करता हूं, फिर धीरे-धीरे बाकी चीजों को वास्तविक सामान के साथ बदल देता हूं। परीक्षण को मजबूत और बनाए रखना जारी रखें। अंत में आप कहा मॉड्यूल के एक मजबूत कार्यान्वयन के साथ खत्म हो गया है और आप एक शानदार परीक्षण बिस्तर मिला है - अनुबंध के कोडित कार्यान्वयन। बाद में, अगर कोई मॉड्यूल को संशोधित करता है, तो पहले आप देखते हैं कि यह अभी भी टेस्ट बेड फिट कर सकता है या नहीं। यदि ऐसा नहीं होता है, तो अनुबंध टूट जाता है - परिवर्तनों को अस्वीकार कर दें। या, अनुबंध पुराना है, - यूनिट परीक्षण को ठीक करें। और इतने पर .. सॉफ्टवेयर विकास के उबाऊ चक्र :)

+0

एक अच्छा विचार है, मुझे नहीं लगता कि यह सवाल का जवाब देता है। यदि आपने तय नहीं किया है कि सिस्टम को अमान्य मानों का पहले जवाब देना चाहिए तो आप अमान्य मानों के लिए परीक्षण नहीं लिख सकते हैं। – Mark

+0

@ मार्क आप नहीं कर सकते। तो, 1) तय करें, 2) सबसे बुनियादी अमान्य मान के लिए परीक्षण लिखना शुरू करें 3) जब अनुपलब्ध कोड की वजह से परीक्षण विफल रहता है, परीक्षण पास तक पुनरावृत्ति कोड, 4) रिफैक्टर परीक्षण और उत्पादन कोड 5) अगले अमान्य मूल्य के बारे में निर्णय लें और एक और लाल बनाएं -ग्रीन-रिफैक्टर पुनरावृत्ति जब तक आप संभव अवैध अमान्य मान समूहों से बाहर निकलने तक परीक्षण नहीं करते हैं और फिर सबसे बुनियादी बातों से शुरू होने वाले खुश मामलों के लिए परीक्षण लिखना शुरू करते हैं, जैसे चाचा बॉब सलाह :) – Tom

+0

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

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