PHP CodeSniffer कितना उपयोगी है? सामान्य में कोड मानक प्रवर्तन?




standards code-smell (6)

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

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

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

मैं अपने कोड-बेस की गुणवत्ता में सुधार करने के प्रयास में हमारे निरंतर एकीकरण सर्वर पर PHP CodeSniffer स्थापित करने के विचार से डब रहा हूं। प्रलेखन पढ़ने के बाद मैं अपने कोडिंग मानकों को सामान्य बनाने और लागू करने के विचार के बारे में बहुत उत्साहित हूं। हालांकि, मैं अपने उत्पाद में वास्तविक सुधार के बारे में सोच रहा हूं। मुझे अच्छी तरह से पता है कि स्निफर केवल परिभाषित कोडिंग-मानक के उल्लंघन का पता लगाता है लेकिन स्वच्छ, सुसंगत, कोड-बेस किस प्रकार के लाभ प्रदान करता है? क्या पीयर मानक के अनुरूप कोड के 100k + लाइनों के साथ एक परियोजना को दोबारा करने के लिए अतिरिक्त काम लायक है?

उन लोगों के लिए जो सामान्य रूप से PHP CodeSniffer या कोड-गंध से परिचित नहीं हैं, यहां एक उदाहरण आउटपुट है:

फ़ाइल: /path/to/code/myfile.php
फाउंड 5 त्रुटि (एस) 2 लाइन (एस) को प्रभावित करना
-
2 | त्रुटि | फ़ाइल दस्तावेज़ टिप्पणी गुम है
20 | त्रुटि | PHP कीवर्ड लोअरकेस होना चाहिए; अपेक्षित "झूठा" लेकिन पाया "गलत"
47 | त्रुटि | लाइन सही ढंग से इंडेंट नहीं किया गया; 4 रिक्त स्थान की उम्मीद है लेकिन 1 मिला
51 | त्रुटि | गुम समारोह टिप्पणी टिप्पणी
88 | त्रुटि | लाइन सही ढंग से इंडेंट नहीं किया गया; 9 रिक्त स्थान की उम्मीद है लेकिन 6 पाया

कड़ाई से बोलते हुए, उपयोगकर्ता / ग्राहक को ऐसे उत्पाद में कोई फर्क नहीं पड़ता जो मानकों के अनुरूप होने के लिए दोबारा प्रतिक्रिया दी गई थी लेकिन मुझे आश्चर्य है कि क्या अन्य छिपे लाभ हैं

अभी हमारे कोड का कोई मतलब नहीं है और हम अपने व्यक्तिगत मानकों का पालन करने का प्रयास करते हैं, जो अधिकांश भाग के लिए, पियर के कोडिंग मानकों से प्राप्त होते हैं लेकिन एक प्रशिक्षित आंख अंतर को खोज सकती है।

तो मेरा सवाल यह है कि वे किसी उत्पाद की गुणवत्ता में कितना सुधार करते हैं। इससे किस प्रकार के गुप्त लाभ हुए?

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


ऐसे कई मामले हैं जिनके लिए मानव निर्णय की आवश्यकता होती है, और CodeSniffer में कोई नहीं है।

लगातार ब्रैकेट, इंडेंटेशन कोड में सुधार करता है। समारोह कॉल में अल्पविराम के बाद अंतरिक्ष की कमी? शायद क्षमा किया जा सकता है, लेकिन कोडस्निफर के अनुसार यह त्रुटि है

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

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

सीएस बहुत आसानी से टर्ड-पॉलिशिंग टूल बन सकता है।


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

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

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

यदि आप यह जांचने के लिए इसका उपयोग करना चाहते हैं कि आप अपने वर्तमान मानक का पालन करते हैं , तो यह संभव प्रतीत होता है, प्रश्न का उत्तर देखें "मैं आपके कोडिंग मानकों से सहमत नहीं हूं! क्या मैं PHP_CodeSniffer को अपना स्वयं का लागू कर सकता हूं?" उनके एफएक्यू में


क्या आप पीईएआर / पीईसीएल के माध्यम से सार्वजनिक वितरण के लिए पीयर पैकेज प्रदान कर रहे हैं? यदि ऐसा है तो आप शायद पीयर सम्मेलनों में रहना चाहते हैं।

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

उदाहरण के लिए, मैं एक प्रशंसक हूँ

function foo () {

प्रारूप बनाम पीयर मानक ..

function foo ()
{

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


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

बेशक, यह एक नई परियोजना के लिए सबसे अच्छा काम करता है, जहां नए मानक में परिवर्तित करने के लिए विरासत कोड का भार नहीं है। इसके आस-पास एक तरीका आपके एसवीएन प्री-प्रतिबद्ध हुक को केवल कोडनिफर में नए परिवर्धन चलाने और संशोधनों को अनदेखा करने के लिए संशोधित करता है। आप लाइन जोड़कर ऐसा कर सकते हैं:

$SVNLOOK changed "$REPOS" -t "$TXN" | grep "^A.*\.php " > /dev/null || exit 0

अगर पार्स करने के लिए कोई नया PHP कोड नहीं है तो यह हुक स्क्रिप्ट से बाहर निकल जाएगा। इसलिए सभी नई फाइलों को मानक का पालन करने की आवश्यकता होगी और आप विरासत कोड को अपने समय में मानक तक ला सकते हैं।


सबसे पहले, मैं PHP_CodeSniffer का रखरखाव कर रहा हूं, इसलिए मैं इस क्षेत्र में स्पष्ट रूप से पक्षपाती हूं। लेकिन मैंने अपने 10 वर्षों में एक PHP देव के रूप में कुछ बड़े कोड अड्डों पर भी काम किया है, इसलिए मुझे आशा है कि मैं कुछ ठोस कारण बता सकता हूं कि क्यों कोडिंग मानकों की अच्छी बात है। मैं इस विषय पर एक ब्लॉग श्रृंखला लिख ​​सकता हूं, लेकिन मैं आपको थोड़ी सी कहानी दूंगा कि PHP_CodeSniffer किस प्रकार आया था ताकि आप उस समस्या को समझ सकें जो टूल मेरे लिए हल हो गया है।

मैंने कुछ बड़ी सीएमएस परियोजनाओं पर काम किया है। पहले इसके पीछे कोड का एक ढेर था और अपेक्षाकृत छोटी विकास टीम थी। हमारे पास कोई मानक नहीं था। लेकिन हमें कोई वास्तविक समस्या नहीं थी। टीम छोटी थी और थोड़ी देर के लिए एक साथ रुक गई। हम एक दूसरे के लिए इस्तेमाल किया गया।

फिर हमने एक नया सीएमएस बनाया। हमने केवल दो देवताओं के साथ ताजा शुरुआत की। मैं तब केवल दो डेवलपर्स की एक टीम का हिस्सा था। फिर, कोडिंग मानकों ने हमें कोई समस्या नहीं पहुंचाई। मैं और दूसरा देव एक ही पृष्ठभूमि से आया था और हमने पहले ही कुछ दिशानिर्देश स्थापित किए थे। हमें तब PHPCS की आवश्यकता नहीं थी।

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

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

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

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

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

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





codesniffer