2011-06-09 5 views
6

संदर्भ: मुझे मिश्रित अनुभव के समूह को "रचनाकृत विधियों" की व्याख्या करने की आवश्यकता है।रचनात्मक कार्यों/विधियों को लिखते समय "अबाधता के समान स्तर" के लिए एक एसिड परीक्षण क्या है?

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

आधार काफी सरल है।

"कार्य कम होना चाहिए, एक बात अच्छी तरह से करते हैं और एक इरादा को प्रकट नाम होता है। में हर कदम विधि के शरीर अमूर्त के समान स्तर पर होना चाहिए।"

मैं "समान स्तर के अमूर्तता" के लिए एक जांच के साथ संघर्ष कर रहा हूं .. जैसे .. शुरुआती लोगों के लिए पन को थोड़ा सा माफ कर दो।

मेरा वर्तमान स्पष्टीकरण एसआईसीपी के "इच्छापूर्ण सोच" के समान होगा। (चरणों के आदर्श सेट कल्पना कीजिए और फिर/कार्यान्वयन के बारे में चिंता यह हो रही है। ")।

है किसी को भी नियमों का एक बेहतर सेट/अपने निर्णय का मूल्यांकन करने के लिए एक कसौटी है, जबकि बना तरीकों लेखन है?

उत्तर

12

ही अमूर्त के स्तर - उदाहरण:

void DailyChores() 
{ 
    Dust(); 
    Hoover(); 
    MopKitchenFloor(); 
    AddDirtyClothesToWashingMachine(); 
    PlaceDetergentInWashingMachine(); 
    CloseWashingMachineDoor(); 
    StartWashingMachine(); 
    Relax(); 
} 

उम्मीद है कि यह स्पष्ट किया जाना चाहिए कि washingmachine गाथा बेहतर एक अलग विधि में निकाला जा होगा entited WashDirtyLaundry();

यकीनन MopKitchenFloor चाहिए als ओ) एक अलग विधि CleanKitchen (हकदार) के रूप में काफी संभावना है आप भविष्य में इस विस्तार करने के लिए WashPots शामिल करने के लिए (चाहेगा, DefrostFridge() आदि में हो

तो एक बेहतर तरीका इस प्रकार लिखने के लिए होगा:

void DailyChores() 
{ 
    Dust(); 
    Hoover(); 
    CleanKitchen(CleaningLevel.Daily); 
    WashDirtyClothes(); 
    Relax(); 
} 

void WashDirtyClothes() 
{ 
    AddDirtyClothesToWashingMachine(); 
    PlaceDetergentInWashingMachine(); 
    CloseWashingMachineDoor(); 
    StartWashingMachine(); 
} 

void CleanKitchen(CleaningLevel level) 
{ 
    MopKitchenFloor(); 
    WashPots(); 

    if(level == CleaningLevel.Monthly) 
    { 
     DefrostFridge(); 
    } 
} 

enum CleaningLevel 
{ 
    Daily, 
    Weekly, 
    Monthly 
} 

"नियम" के संदर्भ में इस सिद्धांत का पालन नहीं कर कोड करने के लिए लागू करने के लिए:

1) आप वर्णन कर सकते क्या विधि किसी भी संयोजक के बिना एक भी वाक्य में करता है (उदाहरण के लिए "तथा")? यदि तक आप इसे विभाजित नहीं कर सकते हैं। जैसे उदाहरण में मेरे पास AddDirtyClothesToWashingMachine() और PlaceDetergentInWashingMachine() अलग विधियों के रूप में है - यह सही है - एक विधि के अंदर इन 2 अलग-अलग कार्यों के लिए कोड होना गलत होगा - हालांकि नियम 2 देखें।

2) क्या आप समूह कर सकते हैं समान तरीकों से एक उच्च स्तर की विधि में कॉल करता है जिसे एक वाक्य में वर्णित किया जा सकता है। उदाहरण में, कपड़े धोने से संबंधित सभी विधियों को एक विधि में धोया जाता है WashDirtyClothes()। पाश के अंदर एक सरल बयान की तुलना में अधिक

void AddStuffToWashingMachine() 
{ 
    AddDirthClothesToWashingMachine(); 
    PlaceDetergentInWashingMachine(); 
} 

3) आप के साथ किसी भी छोरों है: या नियम 1, विधियों AddDirtyClothesToWashingMachine() और PlaceDetergentInWashingMachine() के विचार में एक भी विधि AddStuffToWashingMachine() से कहा जा सकता है ? कोई लूपिंग व्यवहार एक अलग विधि होना चाहिए। स्विच स्टेटमेंट्स के लिए डिट्टो, या यदि, तो और कथन।

आशा इस

+0

@ बोनीटी - शुरुआती बिंदु थोड़ा "आशावादी" है। शुरुआत बिंदु को इनलाइन कोड के मिश्रण के रूप में कल्पना करें और अन्य कार्यों/निर्भरताओं पर कॉल करें .. विधियों को अभी तक निकाला नहीं गया है या आपके पास अच्छे नाम नहीं हैं (जैसे आपके पास अगला चरण स्पष्ट है)। उदाहरण के लिए +1 हालांकि मैं Relax() को एक कोर नहीं कहूंगा :) – Gishu

+0

आपने कहा था कि आप लोगों को प्रशिक्षित करना चाहते हैं? इस मामले में "स्वच्छ" उदाहरण से शुरू करना सबसे अच्छा है और उसके बाद प्रगति करें कि आप इसे मौजूदा मैसी कोड पर कैसे लागू करेंगे। – BonyT

+0

सामान्य रूप से मैं शीर्ष स्तर पर शुरू करके वर्णन करता हूं जैसा कि आप शीर्ष स्तर पर शुरू करके वर्णन करते हैं और बिट्स के लिए इसे देखते हैं जो एक ही उद्देश्य से कार्यरत एक अच्छी तरह से नामित फ़ंक्शन में अलग-अलग रह सकते हैं। जहां तक ​​संभव हो इन बाहर निकालें। फिर श्रृंखला को आगे बढ़ाएं - नए बनाए गए तरीकों में - एक ही कोड काटना, इत्यादि करें। जैसे ही आप बिट्स काट लें, पुन: उपयोग की संभावनाओं को देखें और इस कोड को एक अलग वर्ग पुस्तकालय में ले जाएं। – BonyT

5

में मदद करता है मैं ले "कसौटी" मतलब करने के लिए आप कुछ ठोस नियम है कि मदद सवाल में अमूर्त अवधारणा प्रतीक चाहते हैं। के रूप में "आप अमूर्त के स्तर को मिश्रित हो सकता है अगर ..."

आप अमूर्त अगर के स्तर को मिश्रित हो सकता है ...

  • आप समारोह में एक चर है कि केवल के भाग के लिए प्रयोग किया जाता है है कार्यक्रम।
  • आपके पास फ़ंक्शन में एकाधिक लूप हैं।
  • यदि आपके पास बयान एक दूसरे से स्वतंत्र हैं तो आपके पास एकाधिक हैं।

मैं दूसरों के ऊपर करने के लिए जोड़ देगा आशा ...

+0

"कोड गंध ...। जांचने के लिए परीक्षण, जो आपको स्थानांतरित करने की आवश्यकता हो सकती है, या शायद नहीं। मुझे यह पसंद है। – XIVSolutions

0

संपादित करें: चेतावनी - आगे आत्म सिखाया पुरुष से उत्तर है। । ।

मेरी विनम्र राय में (मैं पूरी तरह से यहां भी सीख रहा हूं) ऐसा लगता है कि बोनीटी और डैनियल टी सही रास्ते पर हैं। यहां जो टुकड़ा गुम हो सकता है वह डिज़ाइन हिस्सा है। हालांकि यह कहना सुरक्षित है कि रिफैक्टरिंग/कंपोज़िंग हमेशा एक आवश्यकता होगी, यह भी कहना सुरक्षित होगा कि (शुरुआती लोगों के साथ विशेष रूप से!) उचित डिजाइन सामने वाला पहला, दूसरा और तीसरा कदम सही ढंग से तैयार कोड होगा?

जबकि मैं जो पूछ रहा हूं वह प्राप्त करता हूं (कोड संरचना के लिए परीक्षण का परीक्षण/सेट), मुझे लगता है कि बोनीटी डिजाइन प्रक्रिया के "छद्म कोड" भाग के दौरान उन परीक्षणों में से जल्द से जल्द आवेदन कर रहा है, नहीं?

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

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

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

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

मुझे एहसास हुआ कि मैंने यहां कुछ भी नया प्रस्ताव नहीं दिया है, लेकिन मुझे जो कहना है वह एक टिप्पणी से अधिक लंबा था!

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