क्या यह संभव है कि लंबे कोड का प्रतिनिधित्व करना आसान है?


9

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

क्या ऐसे हार्ड-टू-रीड कोड को बुरा कोड माना जाता है? इसी तरह, अगर मैं एक जटिल एल्गोरिथ्म के लिए कोड लिखता हूं जिसके परिणामस्वरूप हार्ड-टू-रीड कोड स्पष्ट रूप से नामित विधि में लिपटे हुए हैं, तो क्या वह कोड खराब कोड है?


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

क्या आपका ORM विचारों का समर्थन करता है? आप एक (समूह) को एक दृश्य में शामिल कर सकते हैं और फिर दृश्य का चयन कर सकते हैं। यहां तक ​​कि अगर यह दृश्य कहीं और इस्तेमाल नहीं किया जाता है, तो यह एक बड़े SQL स्टेटमेंट को तोड़ने में मदद कर सकता है
Caleth

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

जवाबों:


17

आप ने लिखा

क्या ऐसा हार्ड-टू-रीड कोड बुरा कोड माना जाता है

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

  • कोड किसी और को दिखाएं जो कोड की सफाई में आपसे अधिक अनुभवी हो। यदि आपके पास आपके संगठन में कोई व्यक्ति नहीं है, तो आप पूछ सकते हैं, codereview.stackexchange प्रयास करें

  • विशिष्ट समस्या के लिए Google पर प्रयास करें। आपके उदाहरण के लिए, "क्लीन लॉन्ग एसक्ल स्टेटमेंट" जैसी चीजें एक अच्छी शुरुआत हो सकती हैं। आपको आश्चर्य होगा कि आप उस विषय के बारे में कितने लेख पाते हैं, और यहां तक ​​कि अगर आप अपने मामले के लिए एक शानदार नुस्खा नहीं ढूंढ सकते हैं, तो आपको कुछ नए विचार मिल सकते हैं

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

  • अभ्यास, अभ्यास, अभ्यास। "क्लीन कोडिंग" एक दिन में सीखी गई कोई चीज नहीं है, यह अधिक अनुभव के साथ आसान हो जाती है। हो सकता है कि आज आपको अपनी समस्या का समाधान न मिले, लेकिन जब आप कुछ महीनों में कोड पर वापस आते हैं, तो यह आपके लिए अलग तरह से दिखेगा।


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

@Walfrat: मेरा इरादा प्रक्रिया के बारे में एक सामान्य दिशानिर्देश प्रदान करना था, न कि "SQL कोड की 50 पंक्तियों" के लिए, और सभी संभावित दृष्टिकोणों के साथ "आउट-ऑफ-द-बॉक्स" समाधान के रूप में नहीं।
डॉक्टर ब्राउन

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

4

पढ़ना मुश्किल है बुरा नहीं है - अनावश्यक रूप से पढ़ना मुश्किल है।

कुछ चीज़ों को कर रहे हैं मुश्किल। उस मामले में, आपको समस्या को पूरी तरह से समझने की जरूरत है, कोड लिखें, और यह उतना ही अच्छा है जितना कि आप अगले डेवलपर को मौका दे सकते हैं।

लेकिन कुछ चीजें केवल मुश्किल होती हैं क्योंकि आपने उन्हें मुश्किल बना दिया है। यदि समस्या को सरल और आसान बनाया जा सकता है, तो इसे सरल बनाएं। यदि यह समझना कठिन है, लेकिन यथोचित रूप से उप-प्रकार में विभाजित किया जा सकता है, तो इसे सरल बनाने के लिए इसे उप-प्रकार में विभाजित करें।


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

1

ORM रिपोर्ट बनाने के लिए? गंभीरता से? कुछ SQL जानें, यार। इस तरह की चीज़ों पर प्रक्रियात्मक भाषा भयानक होती है।

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

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


2
ईमानदारी से, आप जिस तथ्य को ओआरएम पसंद नहीं करते, वह सवाल के लिए पूरी तरह अप्रासंगिक है।
डॉक ब्राउन

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

0

सामान्य तौर पर कोड पढ़ना मुश्किल है कहीं भी एक बुरा विचार है - भले ही आप एकमात्र अनुचर हैं - मेरे पास कुछ कोड वर्षों या यहां तक ​​कि हफ्तों बाद लौटने और मेरे सिर को पाने के लिए कठिन होने की कई घटनाएं हुई हैं ।

यदि आपको एक ही प्रश्न में बहुत कुछ करने की आवश्यकता है तो इसे एम्बेडेड टिप्पणियों के साथ लाइनों में विभाजित करने का प्रयास करें:

query(join(map(condition1, condition2), blah, blah, something(bah, blah, blah))) 

हो जाता है:

// Why are we doing such an awful single query rather than a sequence of selects?
query( // Description of query
  join( // Why are you doing a join here
    map( // Why a map
      condition1, // What is this
      condition2  // And this
   ), // End Map
   blah, // What, Why?
   blah, // What, Why?
   something( // What does this do?
      bah, // What, Why?
      blah, // What, Why?
      blah // What, Why?
      ) // End Something
   ) // End Join
) // End Query

मैं आपके उदाहरण के बारे में अस्पष्ट हूं। टिप्पणियों को यह बताना चाहिए कि कोड ऐसा क्यों है। क्या पहचानकर्ता द्वारा व्यक्त किया जाना चाहिए ...
टिमोथी दबना

@TimothyTruckle मैं सहमत हूं कि पहचानकर्ताओं को स्पष्ट रूप से पहचानना चाहिए कि वे क्या हैं, लेकिन सभी अक्सर वे सामान्य कोड में स्पष्ट नहीं होते हैं - रिकॉर्ड फ़ील्ड नामों के मामले में अक्सर ऐतिहासिक बाधाओं के कारण स्पष्टता की कमी होती है, जो मैं उन मामलों में आया हूं जो क्षेत्र के नाम थे। 5 वर्णों तक सीमित थे, जो सभी ऊपरी मामले ASCII पत्र होने चाहिए थे और उन्हें संगतता आवश्यकताओं के कारण नहीं बदला जा सकता था, उदाहरण के लिए एमडी पसंदीदा रिपोर्टिंग टूल।
स्टीव बार्न्स ने

0

@ DocBrown के उत्कृष्ट उत्तर के अलावा, मुझे लगता है कि यह पहचानने योग्य है कि हर समय कोई भी "अच्छा" कोड नहीं लिखता है। कोडिंग ट्रेड-ऑफ कर रही है, और अक्सर यह स्वीकार करना बेहतर होता है कि आपने अपनी पसंद से कुछ कम साफ लिखा है और बाद में वापस आना है। समय के साथ कोड को सुधारने की प्रक्रिया है - और मेरे अनुभव में, यही वह है जो एक अच्छा कोड आधार बनाता है, न कि "इसे सही समय पर प्राप्त करें"।

और आप आवेदन के स्तर पर कोड का आकलन करते हैं, न कि व्यक्तिगत तरीकों / कोड की लाइनों के स्तर का। इसलिए यदि आपके पास एक जटिल तरीका है, लेकिन यह स्पष्ट रूप से नामित है, तो मुझे नहीं लगता कि आपके पास "बुरा" कोड है जब तक विधि सामंजस्यपूर्ण नहीं है।

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

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.