2009-03-09 11 views
10

मेरे व्यक्तिगत प्रोग्रामिंग राक्षसों में से एक हमेशा जटिल तर्क रहा है जिसे बयान (या समान) द्वारा नियंत्रित किया जाना चाहिए। हमेशा जरूरी नहीं कि जटिल या तो, कभी-कभी केवल कुछ राज्य जिन्हें जिम्मेदार ठहराया जाना चाहिए।क्या जटिल 'अगर' तर्क के साथ सहायता करने के लिए कोई उपकरण हैं?

क्या कोई उपकरण या कदम डेवलपर समय के दौरान प्रदर्शन कर सकते हैं ताकि 'राज्य' देखने में मदद मिल सके और परिणामी कोड को सरल बनाने के लिए कोड को दोबारा करने के उपायों को उठाया जा सके? मैं एक मैट्रिक्स या उन पंक्तियों के साथ कुछ ड्राइंग सोच रहा हूँ ...?

उत्तर

17

मैं प्रत्येक महत्वाकांक्षी प्रोग्रामर के लिए propositional logic में एक बुनियादी पाठ्यक्रम की सिफारिश करता हूं। सबसे पहले, नोटेशन और यूनानी अक्षरों को गणित के विपरीत लगने लगते हैं, लेकिन यह वास्तव में आपके कौशल में सबसे शक्तिशाली (और उपेक्षित) उपकरण में से एक है, बल्कि कोर पर, बल्कि सरल है।

basic operators, de Morgan's और other basic laws, truth tables, और उदाहरण के अस्तित्व disjunctive और conjunctive normal forms मेरे लिए एक आंख खोलने वाले थे। इससे पहले कि मैंने उनके बारे में सीखा, सशर्त अभिव्यक्ति खतरनाक जानवरों की तरह महसूस हुई। तब से, मुझे पता है कि भारी तोपखाने तोड़कर जब भी आवश्यक हो मैं उन्हें जमा करने में चाबुक कर सकता हूं!

3

सत्य सारणी और इकाई परीक्षण - तालिकाएं (एन चर के लिए एन आयामी) खींचें, और फिर इन्हें अपने यूनिट परीक्षण में इनपुट के रूप में उपयोग करें, जो चर के प्रत्येक संयोजन का परीक्षण कर सकते हैं और परिणामों को सत्यापित कर सकते हैं।

+0

सत्य सारणी हमेशा 2-आयाम होते हैं (जब तक कि नए विकास नहीं होते हैं?)। क्या आप एन चर के लिए एन कॉलम का मतलब है? –

+0

बहु आयामी सत्य सारणी? सुनने में अच्छा लग रहा है! –

+1

एर ... सत्य तालिकाओं में मूल्यों के सभी संयोजनों के लिए सभी चर और पंक्तियों के लिए स्तंभ हैं। आप जितनी चाहें उतने चर का प्रतिनिधित्व कर सकते हैं। – cletus

0

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

+0

ठीक है, यह काफी दृष्टिकोण है जो मैं लेता हूं, समस्या यह है कि मैं अपनी खुद की नई शाखाओं को भरता हूं और जब मैं उनकी आवश्यकता की पहचान करता हूं और मौजूदा शाखा नहीं ढूंढ पाता हूं। यह स्पष्ट रूप से स्पेगेटी कोड में परिणाम देता है ... मुझे इसे लेने और Pex के बारे में जानकारी के लिए 'देखें-द-बिग-पिक्चर' –

5

सत्य सारणी मूल रूप से संपूर्ण दृष्टिकोण हैं और (संभावना है) सभी संभावनाओं को उजागर करेंगे।

आप Microsoft Pex पर एक नज़र डालना चाहेंगे, जो कि उन फ्रिंज मामलों को ढूंढने में सहायक हो सकता है जिनके बारे में आपने नहीं सोचा था।

+1

+1 करने का एक तरीका चाहिए। एक महान उपकरण की तरह लग रहा है। –

2

जटिल आईएफ के साथ वर्षों के दौरान मैंने देखा सबसे बड़ी समस्या यह है कि लोग सभी शाखाओं का परीक्षण नहीं करते हैं। प्रत्येक संभावित शाखा के लिए एक परीक्षा लिखना सुनिश्चित करें, इससे कोई फर्क नहीं पड़ता कि ऐसा लगता है कि आप इसे प्रभावित करेंगे।

0

कोई कारण नहीं है कि आप केवल गार्ड विवरणों के साथ तर्क को संभाल नहीं सकते हैं?

2

आप Karnaugh maps को भी आजमा सकते हैं, जो कि 4 चर के लिए अच्छा है।

+0

आपने मुझे इसे हराया। –

+0

कर्णघ मानचित्र इसके लिए अच्छे हैं। यह बहुत बुरा है मैं उन्हें जुनून से नफरत करता हूं। वे मुझे विश्वास दिलाते हैं कि मैं कभी भी कंप्यूटर अभियंता बनना नहीं चाहता हूं। :-) –

0

Karnaugh maps एक सत्य तालिका (विज़िज़ द्वारा सुझाए गए) से जानकारी लेने और उन्हें कॉम्पैक्ट और/या/अभिव्यक्तियों में बदलने के अच्छे तरीके हो सकते हैं। इन्हें आमतौर पर ईई डिजिटल लॉजिक कोर्स में पढ़ाया जाता है।

1

यदि आप पहले से नहीं हैं, तो मैं अत्यधिक Code Complete पढ़ने का सुझाव दूंगा। इस तरह के विषयों पर इसकी बहुत सारी सलाह है। इस समय मेरी प्रतिलिपि आसान नहीं है, अन्यथा मैं पुस्तक में इस खंड का सारांश पोस्ट करूंगा।

4

मुझे लगता है कि डेवलपर पूछ रहा है कि कोड के साथ जटिल होने पर अपने जीवन को कैसे आसान बनाना है।

जिस तरह से मैं जटिल संभालता हूं, कोड को जितना संभव हो सके कोड को कोड करना है और पहले सभी अस्वीकारों को बाहर निकालना है। यदि आप ऊपर के हिस्से को रखकर यौगिक से छुटकारा पा सकते हैं, तो ऐसा करें।

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

यह पढ़ने के लिए आसान है:

if(broken){ 
    return false; 
} 
if (simple){ 
    doit(); 
    return true; 
} 
if(complicated){ 
    divide(); 
    conquor(); 
} 
if(extra){ 
    extra(); 
} 

से इसे पढ़ने के लिए है:

if(!broken && (simple || complicated)){ 
.... 
} 
return false; 
0

चेक बाहर परमाणु विकल्प: Drools। इसके लिए बहुत कुछ है - मुझे अपनी क्षमताओं पर एक संभाल पाने के लिए साहित्य को समझने का एक या दो दिन लिया। लेकिन अगर आपके पास ऐसे अनुप्रयोग हैं जहां आपका जटिल है- तो तर्क परियोजना का एक विकसित हिस्सा है (उदाहरण के लिए, मॉड्यूलर एल्गोरिदम के साथ एक एप्लीकेशन) यह केवल चीज हो सकती है।

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