क्या लोकप्रिय "सर्वोत्तम प्रथाएं" हमेशा सर्वश्रेष्ठ नहीं होती हैं, और क्यों? [बन्द है]


100

हमारे उद्योग में "सर्वोत्तम प्रथाएं" हर जगह हैं। एक "सर्वोत्तम प्रथाओं कोडिंग" पर गूगल खोज लगभग 15 लाख परिणामों को बदल जाता है। विचार कई लोगों को दिलासा देता है; बस निर्देशों का पालन करें, और सब कुछ ठीक हो जाएगा।

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

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

मैंने जिन सर्वोत्तम प्रथाओं के बारे में पढ़ा है, वे यहाँ सूचीबद्ध करने या व्यक्तिगत प्रश्न पूछने के लिए बस बहुत से हैं, इसलिए मैं इसे सामान्य शब्दों के रूप में वाक्यांश देना चाहूंगा:

कौन सी कोडिंग प्रथाएं जिन्हें लोकप्रिय रूप से "सर्वोत्तम प्रथाओं" के रूप में लेबल किया जाता है, कुछ परिस्थितियों में उप-इष्टतम या हानिकारक भी हो सकती हैं? वे परिस्थितियां क्या हैं और वे अभ्यास को गरीब क्यों बनाती हैं?

मैं विशिष्ट उदाहरणों और अनुभवों के बारे में सुनना पसंद करूंगा।


8
वे कौन सी प्रथाएं हैं जिनसे आप असहमत हैं?
सर्जियो अकोस्टा

कोई भी पुस्तक लिख सकता है, और मुझे इसके साथ सहमत होने की आवश्यकता नहीं है - यह उतना ही सरल है।
जॉब

स्टीव मैककोनेल की पुस्तक "कोड कम्प्लीट" के बारे में एक बात मुझे अच्छी लगती है कि वह अपने सभी सुझावों को कठिन प्रमाणों और शोधों के साथ वापस ले लेता है। बस '
कहो

5
@Alter: यह महीनों से खुला है, यह निश्चित रूप से रचनात्मक है, इसे बंद क्यों करें?
परिक्रमा

2
यह देखते हुए कि मेरे नाम का उल्लेख यहां कैसे किया जा रहा है, मुझे लगता है कि मुझे इसमें चिप लगाना चाहिए: मेरा मानना ​​है कि यहां उत्तर मूल्यवान हैं, लेकिन प्रश्न का उत्तर कुछ भी अमान्य किए बिना निश्चित रूप से कम मतदान में पुन: प्रस्तुत किया जा सकता है। उदाहरण शीर्षक: "कौन सी लोकप्रिय 'सर्वोत्तम प्रथाएँ कभी-कभी हानिकारक हो सकती हैं, और कब / क्यों?"
Aaronaught

जवाबों:


125

मुझे लगता है कि आपने इस बयान से सिर पर कील ठोक दी है

मैं अंकित मूल्य पर चीजों को लेने से घृणा करता हूं और उनके बारे में गंभीर रूप से नहीं सोचता

जब यह मौजूद नहीं है तो स्पष्टीकरण के साथ नहीं आने पर मैं लगभग सभी सर्वोत्तम प्रथाओं को अनदेखा करता हूं

रेमंड चेन इस लेख में सबसे अच्छा कहते हैं जब वह कहता है

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


4
कमाल की बोली।
डेविड थॉर्नले

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

3
मुझे आशा है कि लोग इसे एक बहाने के रूप में नहीं लेते हैं कि यह देखने के लिए कि सर्वोत्तम प्रथाओं के पीछे तर्क क्या है, हालांकि। ;) दुर्भाग्य से, मैंने डेवलपर्स को इस रवैये के साथ देखा है।
वेटल

3
औचित्य अच्छा है। शोध बेहतर है।
जॉन पुरडी

7
बिल्कुल सच है, और मैंने पहले भी यही कहा है। शायद किसी भी "मानक" दस्तावेज़ में पहला मानक पढ़ना चाहिए, "ज्ञान साझा करने और बाद में समय पर मानकों को फिर से निर्धारित करने के लिए आवश्यक जानकारी प्रदान करने के हित में, सभी मानकों में उनके अस्तित्व के कारणों को शामिल किया जाएगा।"
स्कॉट व्हिटलॉक

95

साथ ही रिंग में फेंक सकते हैं:

Premature optimization is the root of all evil.

नहीं यह नहीं।

पूरा उद्धरण:

"हमें छोटी क्षमताओं के बारे में भूलना चाहिए, समय के 97% के बारे में कहना चाहिए: समय से पहले अनुकूलन सभी बुराई की जड़ है। फिर भी हमें उस महत्वपूर्ण 3% में अपने अवसरों को पारित नहीं करना चाहिए।"

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

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

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


4
मजबूत नहीं के
स्टीफन

21
लेकिन अगर आपने पहले ही पहचान लिया है कि एक विशेष अनुकूलन उस महत्वपूर्ण 3% के भीतर है, तो क्या आप इसे अनुकूलित करने में समय से पहले हैं?
जॉन

7
@ रॉबर्ट: फिर इस कथन से असहमति की बात क्या है कि "समय से पहले अनुकूलन सभी बुराई की जड़ है"?
जॉन

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

8
@Robert, Knuth बोली को समय से पहले अनुकूलित किया गया ...

94

फ़ंक्शन / विधि के अनुसार एक वापसी।


7
मैं यह डालने जा रहा था। मैं मुझे कुछ शुरुआती रिटर्न स्टेटमेंट्स से प्यार करता हूं।
कार्सन मायर्स

4
पूर्ण रूप से! प्रारंभिक returnवक्तव्य से बचने के लिए लोग कुछ बहुत ही रोचक कार्यक्रम प्रवाह को नियंत्रित करते हैं। या तो गहरी नेस्टेड नियंत्रण संरचनाएं या निरंतर जांच। यह वास्तव में एक विधि को प्रफुल्लित कर if returnसकता है जब वास्तव में इस समस्या को सरल कर सकता है।
snmcdonald

4
यदि आपको किसी फ़ंक्शन (गार्ड से अलग) में कई रिटर्न चाहिए, तो आपका फ़ंक्शन संभवतः बहुत लंबा है।
एरिक पुरालेख

18
जब तक कि इसे कई स्थानों पर प्रदर्शित करने का इरादा नहीं था, रिटर्न कीवर्ड होने का कोई मतलब नहीं है। जल्दी लौटो, अक्सर लौटो। यह केवल आपके कोड को और सरल बनाने की सेवा करेगा। अगर लोग समझ सकते हैं कि बयान कैसे काम करते हैं / जारी रखते हैं, तो वे वापसी के लिए संघर्ष क्यों करते हैं?
इवान प्लाइस

7
मुझे लगता है कि यह एक बहुत ही आउट-डेटेड सर्वोत्तम अभ्यास है। मुझे नहीं लगता कि यह एक आधुनिक सर्वोत्तम अभ्यास है।
स्किलड्रिक

87

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

समस्या यह है कि 100% उपयुक्त समाधान शायद ही कभी मौजूद होता है। एक 80% उपयुक्त समाधान मौजूद हो सकता है, और इसका उपयोग करना शायद ठीक है। लेकिन लगभग 60% उपयुक्त कैसे? 40%? आपने पंक्ति को कहां खींचा था? यदि आप लाइन नहीं खींचते हैं, तो आप अपनी परियोजना के लिए एक फूला हुआ पुस्तकालय शामिल करना समाप्त कर सकते हैं क्योंकि आप इसकी 10% सुविधाओं का उपयोग कर रहे हैं - सिर्फ इसलिए कि आप "पहिया को सुदृढ़ करना" से बचना चाहते हैं।

यदि आप पहिया को सुदृढ़ करते हैं, तो आपको वही मिलेगा जो आप चाहते हैं। आप पहियों बनाना भी सीखेंगे। करके सीखना कम करके नहीं आंका जाना चाहिए। और अंत में, एक कस्टम व्हील ऑफ-द-शेल्फ जेनेरिक व्हील से बेहतर हो सकता है।


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

20
माना। यदि किसी ने कभी भी पहिए को नहीं लगाया, तो हम सभी अपनी कारों को लकड़ी के टायर पर चलायेंगे।
डॉ। विली का अपरेंटिस

6
मैं हमेशा आपके 10% उदाहरण की तरह महसूस करता हूं जब मैं सी + + प्रोजेक्ट में बूस्ट जोड़ता हूं। मुझे हमेशा इसके 10% से कम की आवश्यकता होती है, सीधे, लेकिन निश्चित रूप से कार्यों के लिए मुझे अन्य मॉड्यूल आयात करने की आवश्यकता होती है जो अन्य मॉड्यूल आयात करते हैं ...
रोमन स्टार्कोव

3
+1: बस इस हफ्ते, मैंने पहिया को फिर से मजबूत किया (जैसे कि हम अभी तक अपनी ज़रूरत के हिसाब से इस्तेमाल किए जाने वाले फूले हुए लोकप्रिय जैक्विरी प्लगइन को बदल देते हैं, जो कि हमारी जरूरतों को पूरा करता है)। इसके अलावा, ऐसे लोग हैं जिनका काम सचमुच पहिया को सुदृढ़ करना है: उदाहरण के लिए मिशेलिन को लें, वे टायर सुधारने के लिए आर एंड डी करते हैं।
वाइल्डपीक्स

2
@Dr। विली, उन पहियों को फिर से नहीं लगाया गया था, वे फिर से बनाए गए थे!

78

"यूनिट टेस्ट एवरीथिंग।"

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

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


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

36
यदि किसी पद्धति की संरचना में परिवर्तन से आपके परीक्षणों में बदलाव होता है, तो आप गलत परीक्षण कर सकते हैं। यूनिट परीक्षणों को कार्यान्वयन को सत्यापित नहीं करना चाहिए, केवल परिणाम।
एडम लेअर

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

13
मुझे लगता है कि यह भी है कि "पहले परीक्षण करें" विचार काम नहीं करता है। पहले परीक्षण करने के लिए आपके पास डिज़ाइन सही होना चाहिए। लेकिन डिज़ाइन सही होने के लिए आवश्यक है कि आप चीजों को आज़माएँ और देखें कि वे कैसे काम करते हैं ताकि आप उन पर सुधार कर सकें। इसलिए आप वास्तव में डिजाइन करने से पहले परीक्षण नहीं कर सकते हैं, और डिजाइन सही होने से आपको कोड करने और यह देखने की आवश्यकता है कि यह कैसे काम करता है। जब तक आपको कुछ वास्तव में uber-Architect नहीं मिला, मैं वास्तव में नहीं देखता कि यह विचार कैसे काम करेगा।
n1ckp

13
@ n1ck टीडीडी वास्तव में एक परीक्षण अभ्यास नहीं है जितना कि यह एक डिजाइन व्यायाम है। विचार यह है कि आप अपने डिजाइन को परीक्षणों के माध्यम से विकसित करते हैं (जैसा कि जल्दी से अपने सामान के लिए एक उचित एपीआई को उजागर करता है) परीक्षणों को एक मौजूदा डिजाइन (जो खराब / अपर्याप्त हो सकता है) के लिए फिट होने के बजाय। तो नहीं, आपके पास पहले परीक्षण करने के लिए डिज़ाइन का अधिकार नहीं है।
एडम लेअर

57

हमेशा इंटरफेस के लिए कार्यक्रम।

कभी-कभी केवल एक कार्यान्वयन होगा। यदि हम उस समय तक इंटरफ़ेस निकालने की प्रक्रिया में देरी करते हैं जब हम इसकी आवश्यकता देखते हैं, तो हम अक्सर पाएंगे कि यह आवश्यक नहीं है।


4
सहमत, आप एक इंटरफ़ेस के लिए प्रोग्राम करते हैं जब आपको एक इंटरफ़ेस (यानी काम करने के लिए एक स्थिर एपीआई) की आवश्यकता होती है।
रॉबर्ट हार्वे

45
मेरे पढ़ने में यह नियम इंटरफेस के बारे में नहीं है क्योंकि भाषा निर्माण करती है। इसका मतलब है कि आपको अपने तरीकों को कॉल करते समय किसी वर्ग के आंतरिक कामकाज के बारे में कोई धारणा नहीं बनानी चाहिए, और केवल एपीआई अनुबंधों पर भरोसा करना चाहिए।
Zsolt Török

2
ठीक है यहाँ एक दिलचस्प सवाल है - Im मुख्य रूप से एक .NET डेवलपर है तो मेरे लिए मेरे इंटरफेस IBusinessManager या IServiceContract की तरह दिखते हैं। मेरे लिए यह नेविगेट करना बेहद आसान है (और मैं आमतौर पर एक अन्य नामस्थान [या यहां तक ​​कि एक अन्य परियोजना] में अपना इंटरफेस रखता हूं)। जब मैंने जावा का उपयोग किया है, तो मैंने वास्तव में यह भ्रामक पाया है (आम तौर पर इंटरफ़ेस कार्यान्वयन जो मैंने देखा है उन्हें .impl के साथ प्रत्यय दिया गया है - और इंटरफेस का कोई परिसीमन नहीं है)। तो क्या यह एक कोड मानकों का मुद्दा हो सकता है? जावा में बेशक इंटरफेस कोड को अव्यवस्थित बनाते हैं - वे पहली नज़र में बिल्कुल सामान्य कक्षाओं के समान दिखते हैं।
वॉटसन

5
@Watson: एक लागत यह है कि हर बार मैं F3 ('जम्प टू डिक्लेरेशन') को Eclipse में एक विधि कॉल पर हिट करता हूं, मैं इंटरफ़ेस पर कूदता हूं, एक कार्यान्वयन नहीं। फिर मुझे नियंत्रण-टी, डाउन-एरो, कार्यान्वयन पर वापस लौटना होगा। यह कुछ स्वचालित रिफैक्टरिंग को भी रोकता है - उदाहरण के लिए, आप इंटरफ़ेस परिभाषा के पार एक विधि को इनलाइन नहीं कर सकते।
टॉम एंडरसन

4
@ टॉम: ठीक है सर, मैं ख़ुशी से आपको उस युद्ध में शामिल कर दूंगा, एक्लिप्स बनाम इन्टेलिज - हालाँकि मेरे पास एक उत्कृष्ट नैतिक कोड है जो मुझे एक स्पष्ट बाधा वाले व्यक्ति के साथ शारीरिक टकराव होने से रोकता है। बूम। मैं यह नहीं कह रहा हूं कि ग्रहण बुरा है, मैं कह रहा हूं कि अगर एक्सिस शक्तियों ने अपनी युद्ध मशीनों को बनाने या डिजाइन करने के लिए इसका इस्तेमाल किया था, तो WWII को अब "दो-दिवसीय केरफेल" के रूप में जाना जाएगा। गंभीरता से, मैंने पाया है कि इसमें कुछ पॉलिश की कमी है जो मुझे ऑफ-द-शेल्फ आईडीई (Intellij / VS + ReSharper) में मिलती है। मैंने खुद को एक से अधिक मौकों पर लड़ते हुए पाया है - जो कि बहुत सारे हैं।
वॉटसन

46

कुछ भी ओपन-सोर्स (या गैर-Microsoft आपके लिए .NET डेवलपर्स) का उपयोग न करें

यदि Microsoft ने इसे विकसित नहीं किया है - हम इसका यहाँ उपयोग नहीं करते हैं। ORM - EF का उपयोग करना चाहते हैं, IOC - एकता का उपयोग करना चाहते हैं, लॉग इन करना चाहते हैं - एंटरप्राइज़ लॉगिंग एप्लिकेशन ब्लॉक। इतने सारे बेहतर पुस्तकालय मौजूद हैं - फिर भी मैं हमेशा विकास की दुनिया के डॉलर मेनू से ऑर्डर देने से बच रहा हूं। मैं हर बार जब मैं माइक्रोसॉफ्ट बेस्ट प्रैक्टिसेस सुनता हूं तो मुझे लगता है कि मुझे लगता है कि "मैकडॉनल्ड्स पोषण संबंधी दिशानिर्देश"। निश्चित रूप से, यदि आप उनका अनुसरण करते हैं, तो आप संभवतः जीवित रहेंगे, लेकिन आप कुपोषित और अधिक वजन वाले भी होंगे।

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

13
भयानक लगता है ... = (मैं शायद दूसरी तरफ बहुत ज्यादा हूँ, हालांकि, मैं जितना संभव हो उतना M $
बचता हूं

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

4
आपको IBM ^ wMicrosoft
Christopher Mahan

17
मिरर-इमेज संस्करण भी है, यानी कभी भी Microsoft का उपयोग न करें, या कभी भी आपके द्वारा भुगतान की जाने वाली किसी भी चीज़ का उपयोग न करें।
रिचर्ड गैडसन

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

40

वस्तु अभिविन्यास

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


7
मैं उस संगठन का लाभ उठाए बिना किसी भी महत्वपूर्ण आकार के सॉफ्टवेयर सिस्टम के निर्माण की कल्पना नहीं कर सकता जो ऑब्जेक्ट ओरिएंटेशन प्रदान करता है।
रॉबर्ट हार्वे

18
रॉबर्ट। यूनिक्स ऑब्जेक्ट ओरिएंटेड नहीं है, और यह निश्चित रूप से महत्वपूर्ण आकार के सॉफ्टवेयर सिस्टम के रूप में योग्य है। यह भी काफी लोकप्रिय लगता है (मैक ओएसएक्स, आईफोन, एंड्रॉइड फोन, आदि पर विचार करें)
क्रिस्टोफर महान

7
मेरा मतलब है कि मुझे लगता है कि हमें सबसे उपयुक्त कार्यप्रणाली का उपयोग करना चाहिए। मैंने देखा है कि लोग ऐसे तरीकों और कक्षाओं का उपयोग करते हैं जहां यह बोझिल होता है और इसका बहुत मतलब नहीं होता है, सिर्फ इसलिए कि "यह ऑब्जेक्ट-ओरिएंटेड है"। वह कार्गो पंथ है।
LennProgrammers

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

9
मजेदार बात यह है कि वर्गों, बहुरूपता और पसंद का उपयोग करने के अलावा, वस्तु उन्मुख कोड का अधिकांश भाग वास्तव में प्रक्रियात्मक कोड है।
ओलिवर वीलर

35

सभी कोड टिप्पणी की जानी चाहिए।

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

/** hey you, if didn't get, it's logger. */
private static Logger logger = LoggerFactory.getLogger(MyClass.class);

13
सभी कोड को समझने योग्य होना चाहिए । टिप्पणियाँ उस में एक प्रमुख उपकरण हैं, लेकिन केवल एक से दूर।
ट्रेवेल

बिलकुल, कोड को समझने योग्य होना चाहिए। लेकिन एक टिप्पणी लिखने का कोई एक कारण नहीं है जो उदाहरण के लिए, विधि नाम में कुछ भी नहीं जोड़ेगा। यदि आप लिखते हैं तो /** sets rank. */ void setRank(int rank) { this.rank = rank; }मैं टिप्पणी को बेवकूफ़ मानता हूं। क्यों लिखा है?
व्लादिमीर इवानोव

2
दस्तावेज तैयार किया। प्रारूप टिप्पणी के /** */बजाय प्रारूप क्या है /* */। या .NET के लिए यह होगा///
Berin Loritsch

10
का उपयोग करते हुए }//end if, }//end for, }//end whileटिप्पणी मैंने कभी सामना किया है बेकार का सबसे अच्छा उदाहरण है। मैंने इसे कई बार देखा है जहां उद्घाटन ब्रेस 2 लाइनों से अधिक नहीं है। IMHO अगर आपको इन टिप्पणियों की आवश्यकता है, तो आपके कोड को फिर से फैक्टरिंग की आवश्यकता है ... या आपको $ 20 की आवश्यकता होगी और एक IDE / पाठ संपादक खरीदना होगा जो मिलान वाले ब्रेसिज़ को हाइलाइट करता है।
स्कुंलिफ

7
कोड "कैसे" कहते हैं। टिप्पणियों को "क्यों" कहने की आवश्यकता है।

32

तरीके, विशेष रूप से घोटाले। जब मैं सुनता हूँ तो मैं एक बड़ा चेहरा नहीं रख सकता। मैं डेवलपर्स के विरोध को सुनकर इतना थक गया हूं कि मेथोडोलॉजी एक्स का कुछ पहलू उनकी कंपनी के लिए काम नहीं कर रहा है, केवल गुरु सो-एंड द्वारा बताया जा सकता है कि यह काम नहीं करने का कारण यह है कि वे वास्तव में सही चिकित्सक नहीं हैं कार्यप्रणाली एक्स की "" कठिन परिश्रम करो, तुम, मेरे Padawan सीखना चाहिए! "

फुर्तीली कार्यप्रणालियों में ज्ञान की डली होती है --- उनमें से बहुत सी --- लेकिन वे अक्सर इतनी खाद में तब्दील हो जाती हैं कि मैं अपने गैग पलटा से नहीं लड़ सकता। विकिपीडिया के स्क्रैम पृष्ठ से इसे थोड़ा सा लें :

Scrum में कई भूमिकाओं को परिभाषित किया गया है। सभी भूमिकाएं दो अलग-अलग समूहों में गिरती हैं- सूअर और मुर्गियां- विकास प्रक्रिया में उनकी भागीदारी की प्रकृति के आधार पर।

वास्तव में? सूअर और मुर्गियां, आप कहते हैं? चित्त आकर्षण करनेवाला! यह मेरे मालिक को पिच करने के लिए इंतजार नहीं कर सकता ...


दिलचस्प। मैं एक हद तक सहमत हूं। हालांकि उस अंतिम भाग के साथ: उन्हें कॉल करें जो आप चाहते हैं, वे mnemonics हैं, बस।
स्टीवन एवर्स

12
+1 ... आप सही हैं, इसे गंभीरता से लेना मुश्किल है। <बड़ी धमाकेदार आवाज> * I द SCRUMMASTER * </ आवाज>
ग्रैंडमास्टरबी

2
और दृष्टान्त। यह मुझे चर्च के उपदेशों, या स्वयं-सहायता गुरुओं (और कॉमेडियन) के प्रकारों के बारे में याद दिलाता है, जो इस बात के लिए प्रसिद्ध हैं: "मेरे दोस्त स्टीव को ले लो। स्टीव लगातार अपनी पत्नी शेरिल के साथ बहस कर रहा था। वे दोनों इसके लिए घंटों तक चले जाते थे।" वह बिंदु जहां उनकी शादी वास्तविक खतरे में थी। फिर, एक दिन ... "इस प्रकार के दिलेर यार्न मुझे अन्य क्षेत्रों में परेशान नहीं करते हैं, लेकिन मुझे इंजीनियरिंग विज्ञान में उन्हें देखने से नफरत है।
evadeflow

2
स्क्रेम निन्जा के बारे में क्या?
बेरिन लोरिट्श

1
मैं "सुअर और चिकन" की तुलना से सहमत नहीं हूँ ... यह सीधे एगाइल मैनिफेस्टो के चेहरे पर उड़ता है। अर्थात् "अनुबंध वार्ता पर ग्राहक सहयोग"। परियोजना की टीम के रूप में ग्राहक परियोजना की सफलता में निहित हैं (यदि मोरेसो नहीं हैं)। कुछ भूमिकाओं सूअरों और अन्य भूमिकाओं वाले मुर्गियों को बुलाकर "हम बनाम उनमें" मानसिकता स्थापित की जाती है कि IMHO सफल परियोजनाओं के लिए सबसे बड़ा मार्ग है।
माइकल ब्राउन

25

ऑब्जेक्ट रिलेशनल मैपिंग ... http://en.wikipedia.org/wiki/Object-relational_mapping

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


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

28
ORM एक 80-20 टूल हैं। उनका इरादा 80% CRUD को संभालने का है, जो थोड़ी देर बाद सभी अंतहीन प्लंबिंग कोड लिखने के लिए इतना थकाऊ हो जाता है। अन्य 20% को संग्रहीत प्रक्रियाओं का उपयोग करने और साधारण एसक्यूएल प्रश्नों को लिखने की तरह अधिक "पारंपरिक" तरीकों से किया जा सकता है।
रॉबर्ट हार्वे

18
@ फ़िशटोस्टर: आपका मतलब यह नहीं है, "हमें छोटी क्षमताओं के बारे में भूलना चाहिए, 97% समय के बारे में कहना चाहिए: समय से पहले अनुकूलन सभी बुराई की जड़ है। फिर भी हमें उस महत्वपूर्ण 3% में अपने अवसरों को पारित नहीं करना चाहिए।"
रॉबर्ट हार्वे

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

12
@ क्रेग: आपने अपने बयान में विडंबना को कैसे नहीं पहचाना? ORM से अच्छा प्रदर्शन प्राप्त करने का तरीका सीखने के लिए एक वर्ष की आवश्यकता होती है, ORM के विरुद्ध एक उत्कृष्ट तर्क है , क्योंकि SQL द्वारा उत्पादित प्रक्रियाओं को "नियंत्रित" करना और संग्रहीत प्रक्रियाओं को इंजेक्ट करना आवश्यक है। यदि आपके पास इसके लिए ज्ञान है, तो आपके पास पूरी तरह से ओआरएम को बायपास करने का ज्ञान है।
निकोलस नाइट

22

फ़ंक्शन नाम लिखना जैसे कि वे अंग्रेजी वाक्य थे:

Draw_Foo()
Write_Foo()
Create_Foo()

आदि यह बहुत अच्छा लग सकता है, लेकिन जब आप एपीआई सीख रहे हों तो यह एक दर्द है। "फू के साथ शुरू होने वाली सब कुछ" के लिए एक सूचकांक खोजना कितना आसान है?

Foo_Draw()
Foo_Write()
Foo_Create()

आदि।


2
शायद TM के फंक्शन लिस्ट में Foo टाइप करना जितना आसान है।
जोश के

68
लगता है कि आप वास्तव में यह चाहते हैं Foo.Draw(), Foo.Write()और Foo.Create(), ताकि आप कर सकते हैं Foo.methods.sortयाFoo.methods.grep([what I seek]).sort
Inaimathi

7
'गेट ’से शुरू करना एक और उदाहरण है।
जेएफओ

1
मैं ऑब्जेक्टिव-सी दुनिया से आता हूं, और जब मैं जावा (मेरा दूसरा जीवन) करता हूं तो वर्बोज विधि के नाम और इन्फिक्स नोटेशन को बहुत याद करता हूं। जब से कोड पूरा होने का काम शुरू हुआ, मुझे कोई समस्या टाइपिंग नहीं मिली।

2
@Scott व्हिटलॉक: नहीं है कि कुछ नेट डेवलपर्स के लिए पुराने, iirc, 2008 वी.एस. कि ऐसा नहीं किया। 2010 हालांकि, और यह शानदार है।
स्टीवन एवर्स

22

एमवीसी - मुझे अक्सर लगता है कि एमवीसी दृष्टिकोण में कई वेब डिज़ाइन की समस्याओं का सामना करना सरलता या संरचना की तुलना में एक रूपरेखा (रेल आदि) बनाने के बारे में अधिक है। एमवीसी "आर्किटेक्चरल एस्ट्रोनॉट्स" का पसंदीदा है जो सादगी पर अत्यधिक मचान का मूल्य लगता है। YMMV।

वर्ग-आधारित OO - मेरी राय में, परिवर्तनशील राज्य की जटिल संरचनाओं को प्रोत्साहित करता है। वर्षों से क्लास-आधारित OO के लिए मैंने जो एकमात्र सम्मोहक मामले देखे हैं वे कॉर्नी "आकार-> आयत-> वर्ग" उदाहरण हैं जो किसी भी OO पुस्तक के अध्याय 1 का निर्माण करते हैं


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

1
जहां तक ​​OO का संबंध है, इसे करने के अच्छे और बुरे तरीके हैं। वंशानुक्रम को ओवररेटेड किया जाता है, और वास्तविक दुनिया में अधिक दुर्लभ रूप से उपयोग किया जाता है, जिसकी तुलना में अधिकांश पुस्तकों में आपको विश्वास होगा; वर्तमान में एक अधिक कार्यात्मक, अपरिवर्तनीय विकास शैली की ओर रुझान है, यहां तक ​​कि OO दुनिया में भी।
रॉबर्ट हार्वे

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

3
OO के रूप में, आप वास्तव में यह नहीं देखेंगे कि यह तब तक लाभ है जब तक कि आपकी परियोजना आकार में नहीं बढ़ जाती है, जहां प्रबंधन की जटिलता महत्वपूर्ण हो जाती है। जहाँ भी संभव हो एकल जिम्मेदारी सिद्धांत का पालन करें और यदि आपका कोड सार्वजनिक रूप से सुलभ है (उदाहरण के लिए .dll) तो कोड को अधिक सुरक्षित बनाने और एपीआई को सरल बनाने के लिए जहाँ भी संभव हो, कक्षाओं / विधियों / गुणों के आंतरिक कार्यान्वयन को छिपाएं।
इवान प्लाइस

1
मैं व्यक्तिगत रूप से आकार-> आयत-> वर्ग उदाहरण को ऊप के खिलाफ सबसे सुरुचिपूर्ण तर्कों में से एक मानता हूं । उदाहरण के लिए, Square(10).Draw()यह पर्याप्त है Rectangle(10, 10).Draw()। इसलिए मेरा अनुमान है कि वर्ग आयत का एक उपवर्ग है। लेकिन mySquare.setWidthHeight(5,10)बकवास है (आईई, यह लिस्कोव प्रतिस्थापन सिद्धांत को विफल करता है), एक वर्ग में अलग-अलग ऊंचाई और चौड़ाई नहीं हो सकती है, हालांकि एक आयत हो सकती है, ताकि इसका मतलब है कि आयत वर्ग का एक उपवर्ग है। इसे अन्य संदर्भों में "सर्कल,
एलिप्से

22

YAGNI

( आपको इसकी आवश्यकता नहीं है )

इस दृष्टिकोण ने मुझे घंटों और घंटों का समय दिया है जब मुझे एक मौजूदा कोडबेस पर सुविधाओं को लागू करना था, जहां सावधानीपूर्वक नियोजन ने इन सुविधाओं को पहले से ही शामिल किया होगा।

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

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


15
मैं YAGNI से सहमत हूं, लेकिन मैं देख रहा हूं कि आपको क्या मिल रहा है। YAGNI का उद्देश्य ऐसे लोगों से निपटना है जो हर चीज की थोड़ी सी विस्तार से योजना बनाना चाहते हैं । दस में से नौ बार हालांकि, इसका उपयोग इंजीनियर कोड के तहत एक बहाने के रूप में या पूरी तरह से योजना बनाने में किया जाता है।
जेसन बेकर

12
P.Floyd, @ जैसन बेकर: +1 बिल्कुल सही। पुरानी कहावत यहाँ लागू होती है "प्रयोगशाला में महीनों पुस्तकालय में घंटों की बचत कर सकते हैं"
स्टीवन एवर्स

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

1
@TokenMacGuy महत्वपूर्ण पहलू युक्ति भाग द्वारा निहित है । यही कारण है कि राय बहुत अलग है।
सीन पैट्रिक फ्लोयड

20

SQL के लिए

  1. ट्रिगर का उपयोग न करें
  2. हमेशा विचारों के पीछे टेबल छिपाएं

क्रम में:

  1. वे एक विशेषता है कि यह जगह है। आपके पास तालिका में कई अपडेट पथ हैं, या 100% ऑडिटिंग की आवश्यकता है?

  2. आखिर क्यों? अगर मैं एक अनुबंध को बनाए रखने के लिए मना कर रहा होता, तो नहीं, लेकिन जब मैंने पढ़ा है कि किसी भी तालिका परिवर्तन से मेल खाने के लिए दृश्य बदल जाता है

संपादित करें:

नंबर 3: EXISTS के साथ * टालना। 1/0 प्रयास करें। यह काम करता हैं। स्तंभ सूची का मूल्यांकन SQL मानक के अनुसार नहीं किया जाता है। पृष्ठ १ ९ १


3
# 2 एक सर्वोत्तम अभ्यास है?
होगन

2
@ हॉगन: हाँ, यह कई स्थानों पर दस्तावेजित है vyaskn.tripod.com/sql_server_security_best_practices.htm और flylib.com/books/en/3.404.1.34/1 और उससे कम: simple-talk.com/community/blogs/tony_davis/ संग्रह /
2009/08/06

1
@ होगन: एक दृश्य जो बस एक आधार तालिका को दिखाता है, सीधे आधार तालिका का उपयोग करने पर कोई सुरक्षा नहीं जोड़ता है। यदि आप सुरक्षा तालिका में शामिल होते हैं, या कुछ स्तंभों पर मुखौटा लगाते हैं तो पर्याप्त रूप से निष्पक्ष हो जाते हैं। लेकिन तालिका या दृश्य से प्रत्येक स्तंभ का चयन करें: कोई अंतर नहीं। व्यक्तिगत रूप से, मैं वैसे भी संग्रहीत procs का उपयोग करता हूं।
gbn

3
@ होगन: मुझे SQL सर्वर :-) stackoverflow.com/users/27535/gbn के बारे में कुछ पता है कि मेरा मतलब है कि टेबल पर GRANT चयन सही है, दृश्य पर चयन करने के लिए GRANT से अलग नहीं है, अगर दृश्य का चयन *
FABLE

1
@ भाग: मैं सहमत हूं। वहां कोई अंतर नहीं है। मुझे लगता है कि हम एक ही बात कह रहे होंगे। मुझे लगता है कि मेरी मूल टिप्पणी ("# 2 एक सर्वोत्तम अभ्यास है?") मेरे व्यक्तिगत अनुभव पर अधिक आधारित था कि विचार (जैसे ट्रिगर) सही रूप से उपयोग किए जाने की तुलना में अधिक बार मिस-यूज़ होते हैं। इस प्रकार इस तरह का सबसे अच्छा अभ्यास केवल दुरुपयोग को बढ़ाने के लिए नेतृत्व करेगा। अगर इसे सबसे अच्छा अभ्यास माना जाता है तो आप 100% सही हैं यह एक बुरा है।
होगन

20

डिज़ाइन पैटर्न ज्यादातर। वे उपयोग में हैं और उपयोग में हैं।


13
+1 मैं अभी भी नहीं देखता कि कैसे डिज़ाइन पैटर्न सुंदर या सुरुचिपूर्ण समाधान हैं। वे भाषा की कमियों के लिए कामगार हैं, इससे ज्यादा कुछ नहीं।
ओलिवर वीलर

2
बस इसे भाषा का उपयोग करते हुए भाषा की गंध को मिटाने के प्रयास के रूप में देखें।
फिलिप डुपनोविक

15

एकल जिम्मेदारी सिद्धांत

("हर वर्ग के पास केवल एक ही जिम्मेदारी होनी चाहिए; दूसरे शब्दों में, हर वर्ग में एक, और केवल एक ही होना चाहिए, बदलने का कारण")

मैं असहमत हूं। मुझे लगता है कि एक विधि को बदलने का केवल एक कारण होना चाहिए, और एक कक्षा के सभी तरीकों का एक-दूसरे से तार्किक संबंध होना चाहिए , लेकिन वर्ग स्वयं वास्तव में ऐसा कर सकता है कई (संबंधित) बातें।

मेरे अनुभव में, इस सिद्धांत को अक्सर अति उत्साह से लागू किया जाता है, और आप कई छोटे एक-विधि वर्गों के साथ समाप्त होते हैं। मैंने जो काम किया है, दोनों फुर्तीली दुकानों ने ऐसा किया है।

कल्पना करें कि .Net API के रचनाकारों की मानसिकता इस प्रकार की हो: List.Sort (), List.Reverse (), List.Find () आदि के बजाय, हमारे पास ListSorter, ListReverser और ListSerer वर्ग होंगे!

एसआरपी के खिलाफ अब और बहस करने के बजाय (जो खुद सिद्धांत में भयानक नहीं है) , मैं अपने लंबे समय से प्रसारित कुछ अनुभव साझा करूंगा:


एक स्थान पर मैंने काम किया, मैंने एक बहुत ही सरल अधिकतम प्रवाह सॉल्वर लिखा, जिसमें पांच वर्ग शामिल थे: एक नोड, एक ग्राफ़, एक क्रिएटर, एक ग्राफ़-सॉल्वर और एक वर्ग जो ग्राफ़-क्रिएटर / सॉल्वर का उपयोग करने के लिए हल करता है वास्तविक दुनिया की समस्या। कोई भी विशेष रूप से जटिल या लंबा नहीं था (सॉल्वर अब तक ~ 150 लाइनों में सबसे लंबा था)। हालांकि, यह तय किया गया था कि कक्षाओं में बहुत अधिक "जिम्मेदारियां" थीं, इसलिए मेरे सहकर्मियों ने कोड को फिर से भरने के बारे में निर्धारित किया। जब वे किए गए थे, तो मेरी 5 कक्षाओं का विस्तार 25 वर्गों में किया गया था, जिनकी कुल पंक्तियाँ ट्रिपल से अधिक थीं, जो कि वे मूल रूप से थीं। कोड का प्रवाह अब स्पष्ट नहीं था, न ही नई इकाई-परीक्षणों का उद्देश्य था; अब मेरे पास एक कठिन समय था कि मैं अपना कोड क्या करूं।


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


एक अन्य स्थान पर (जिसमें कक्षाएं भी थीं, केवल-एक-पद्धति मानसिकता थी), हम एक विधि का अनुकूलन करने की कोशिश कर रहे थे जो एक निश्चित ऑपरेशन के दौरान 95% समय लेता था। बाद में (बल्कि बेवकूफी से) इसे थोड़ा सा अनुकूलित करते हुए, मैंने अपना ध्यान इस ओर आकर्षित किया कि इसे बाजिलियन समय क्यों कहा जा रहा है। इसे एक कक्षा में लूप में बुलाया जा रहा था ... जिसकी विधि को दूसरी कक्षा में एक लूप में बुलाया जा रहा था .. जिसे लूप में भी कहा जा रहा था ..

सभी ने बताया, 13 वर्गों (गंभीरता से) में पांच-स्तर के लूप फैले हुए थे। वास्तव में कोई भी एक वर्ग जो कर रहा था, उसे देखते हुए यह निर्धारित करना असंभव था - आपको एक मानसिक ग्राफ को स्केच करना होगा कि यह किस तरीके से कहा जाता है, और उन तरीकों को क्या कहा जाता है, और इसी तरह। यदि यह सब एक विधि में लुप्‍त हो गया होता, तो यह हमारी समस्‍या-पद्धति के साथ लगभग 70 पंक्तियों की लंबी होती, जो पांच-स्‍पष्‍ट रूप से लूप के पांच-स्‍तर के अंदर निहित होती है।

उन 13 वर्गों को एक कक्षा में फिर से शामिल करने का मेरा अनुरोध अस्वीकार कर दिया गया।


6
लगता है जैसे किसी को "पैटर्न फीवर" या इस मामले में "प्रिंसिपल फीवर" मिला। सूची वर्ग SRP का उल्लंघन नहीं करता है। इसके सभी कार्य एक उद्देश्य की पूर्ति करते हैं, वस्तुओं के संग्रह में हेरफेर करते हैं। कक्षा में केवल एक ही कार्य करने से मुझे ओवरकिल की तरह लगता है। एसआरपी के पीछे सिद्धांत यह है कि कोड की एक इकाई (यह विधि, वर्ग, या पुस्तकालय हो) में एक ही जिम्मेदारी होनी चाहिए जिसे सफलतापूर्वक कहा जा सके।
माइकल ब्राउन

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

3
दूसरी टिप्पणी यहाँ। "सिद्धांतों" के बहुत सारे लागू होते हैं। कई चीजें हैं जो अच्छे विचार हैं, जहां सटीक विपरीत करना कभी-कभी उचित होता है। अच्छे प्रोग्रामर जानते हैं कि नियम कब टूटते हैं। क्योंकि नियम "नियम" नहीं हैं, वे "जब वास्तव में गूंगा विचार है तब को छोड़कर ज्यादातर अच्छे अभ्यास के कथन हैं।"
जल्‍दी से

"कल्पना करें कि .Net API के रचनाकारों में इस प्रकार की मानसिकता थी: List.Sort (), List.Reverse (), List.Find () आदि के बजाय, हमारे पास ListSorter, ListReverser और Listcearcher वर्ग होंगे; ! "। यह वही है जो C ++ में किया गया है, और यह अद्भुत है । एल्गोरिदम को डेटा संरचनाओं से अलग किया जाता है, इसलिए यदि मैं अपना कंटेनर लिखता हूं, तो सभी एल्गोरिदम जो मानक पुस्तकालय के साथ काम करते हैं, बस मेरे नए कंटेनर के साथ काम करते हैं । यह .Net भूमि में भयानक होना चाहिए, हर नए कंटेनर के लिए एक नया सॉर्टिंग फ़ंक्शन लिखना जिसे आप सॉर्ट करना चाहते हैं।
मकार्से

14

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

इसके अलावा, सरल प्राथमिक चीजों को प्रतिस्थापित करें

0 == memberArray.length

एक कक्षा में कक्षा की अपनी विधि जैसे कॉल के साथ

isEmpty()

एक संदिग्ध "सुधार" IMHO है। जोड़: अंतर यह है कि पहला चेक ठीक वही करता है जो यह कहता है: चेक करता है कि सरणी की लंबाई 0. ठीक है, isEmpty()सरणी की लंबाई भी जांच सकता है। लेकिन इसे इस तरह भी लागू किया जा सकता है:

return null != memberArray ? 0 == memberArray.length : true;

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


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

मैं यहां तक ​​कहूंगा कि कुछ मामलों में एक विधि के लायक होने के लिए 1-लाइन विधि बहुत कम है।


6
मैं शायद ही कभी इसे एक मुद्दे के रूप में देखता हूं। ज्यादातर ऐसा इसलिए है क्योंकि मैं आमतौर पर एक ही विधि में बहुत अधिक देखता हूं, बहुत कम नहीं। हालांकि, कुछ अध्ययनों के अनुसार विधियों में बहुत कम जटिलता भी मामूली कम जटिलता की तुलना में थोड़ी अधिक बग दर है। enerjy.com/blog/?p=198
MIA

हाँ, यह निश्चित रूप से केवल क्लीन कोड में एक मुद्दा है। जैसा कि आपने कहा वास्तविक जीवन में विधियां बहुत लंबी होती हैं। लेकिन उस वक्र को देखना दिलचस्प है! वास्तव में, चीजों को यथासंभव सरल बनाया जाना चाहिए, लेकिन कोई सरल नहीं।
जूनो पुलकका

1
मुझे आपका दूसरा उदाहरण उल्लेखनीय रूप से पढ़ने योग्य लगता है, और यह रूप (या कुछ इसी तरह, वर्ग पर एक लंबी संपत्ति की तरह) एक जरूरी है यदि आप इसे सार्वजनिक कर रहे हैं।
रॉबर्ट हार्वे

@ रोबर्ट हार्वे: दूसरा उदाहरण एक अच्छा सार्वजनिक तरीका है, लेकिन इसे कक्षा के भीतर से कॉल करना संदेहास्पद है, क्योंकि आप इसे लागू करने से पहले ठीक से नहीं जानते कि यह क्या करता है। उदाहरण के लिए, यह अशक्त के लिए जाँच कर सकता है। मेरे अलावा ऊपर देखें।
जूनस पुलकका

@ जून: मेला काफी।
रॉबर्ट हार्वे

13

"टिप्पणियों के साथ उदार बनें"

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


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

6
मुझे इस बात से सहमत होना होगा कि सोवा ने इसे किस तरह से रखा। स्वच्छ कोड टिप्पणियों के लिए बेहतर है।
रिवाल्क

4
आपको अभी भी "क्यों" की आवश्यकता है!

मैं नहीं बल्कि टिप्पणी क्यों समझा रहा हूँ। इसका मतलब है कि जब मैं इसे देखने आऊंगा तो कोड इंट्रेंस को रिवर्स इंजीनियरिंग में कम सोचना होगा।
जल्‍दी से जल्‍दी से जल्‍दी

12

GoTo ने हानिकारक माना

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

कोई भी "सर्वोत्तम अभ्यास" जो अपने नियमों के प्रति समझदार और प्रलेखित अपवादों के लिए अनुमति नहीं देता है, केवल सादा डरावना है।


16
मैं बिना किसी गोटो स्टेटमेंट के नौ साल की प्रोग्रामिंग पर जा रहा हूं (कई राज्य मशीनों सहित, जैसा कि आपने उल्लेख किया है)। नए विचारों के लिए अपने मन का विस्तार करें।
रिवलॉक

3
@ मैथ्यू एम - सहमत - संरचित नियंत्रण कथनों के साथ GOTO को मिलाना समझदारी नहीं है। (यह शुद्ध सी था और यह एक मुद्दा नहीं था।
MZB

1
@ Stargazer2 - एक साधारण एफएसएम के साथ, यह निर्भर करता है कि क्या राज्य को एक चर में रखा जाए और एक प्रक्रिया को कॉल करने के लिए एक सूचकांक के रूप में इसका उपयोग किया जाए (क्या यह एक गणना किए गए GOTO के समान नहीं है?) प्रोग्राम काउंटर का उपयोग करने की तुलना में स्पष्ट / तेज कोड देता है? FSM राज्य के रूप में। मैं इसे अधिकांश परिस्थितियों में सबसे अच्छा समाधान के रूप में वकालत नहीं कर रहा हूँ, बस कुछ परिस्थितियों में सबसे अच्छा समाधान। वैकल्पिक दृष्टिकोण के लिए अपने दिमाग का विस्तार करें।
MZB

5
@MZB, क्या आप इस बात से सहमत नहीं होंगे कि एक फंक्शन कॉल भी एक गणना किए गए GOTO है? वही दूसरों के बीच / जबकि / अगर / और / स्विच निर्माणों के लिए जाता है। भाषा डिजाइनर एक कारण के लिए कार्यक्रम काउंटर पर सीधे परिवर्तन को दूर करते हैं। गोटो का इस्तेमाल न करें।
रिवलॉक

3
प्रत्यक्ष रूप से एक स्टेटमाइन को लागू करना शायद एक एंटीपैटर्न है। राज्यों और परिवर्तनों को शाब्दिक रूप से व्यक्त किए बिना राज्य मशीन रखने के बहुत सारे तरीके हैं। उदाहरण के लिए,import re
सिंगल नेशनलाइजेशन

12

हम बलिदानों को कोड परीक्षण योग्य बनाते हैं

मैं अपने कोड को परीक्षण योग्य बनाने के लिए बहुत सारे हुप्स के माध्यम से कूदता हूं, लेकिन मैं इस बात का ढोंग नहीं करता हूं कि यदि मैंने विकल्प दिया तो मैं नहीं करूंगा। हालांकि, मैं अक्सर लोगों को इस विचार को आगे बढ़ाते हुए सुनता हूं कि ये "सर्वोत्तम-अभ्यास" हैं। इन प्रथाओं में (.Net की भाषा में लिखित, लेकिन अन्य भाषाओं पर भी लागू होता है) शामिल हैं :

  • हर वर्ग के लिए एक इंटरफ़ेस बनाना । इससे कोड और डुप्लिकेट कोड से निपटने के लिए कक्षाओं (फ़ाइलों) की संख्या दोगुनी हो जाती है । हां, इंटरफ़ेस प्रोग्रामिंग अच्छा है, लेकिन यह सार्वजनिक / निजी विनिर्देशक के लिए है।
  • स्टार्टअप पर त्वरित नहीं हर वर्ग एक कारखाने की जरूरत है। स्पष्ट रूप से, new MyClass()एक कारखाने को लिखने की तुलना में बहुत सरल है, लेकिन अब इसे बनाने वाली विधि को अलगाव में परीक्षण नहीं किया जा सकता है। यदि इस तथ्य के लिए नहीं, तो मैं केवल 1/20 वें नंबर की फैक्ट्री-कक्षाएं बनाऊंगा जो मैं अभी करता हूं।
  • हर वर्ग को सार्वजनिक करें, जो कक्षाओं में पहुंच निर्दिष्ट करने के उद्देश्य को पराजित करता है। हालांकि, गैर-सार्वजनिक वर्गों को अन्य परियोजनाओं से एक्सेस नहीं किया जा सकता (और इस प्रकार, परीक्षण किया गया), इसलिए एकमात्र अन्य विकल्प सभी परीक्षण कोड को उसी प्रोजेक्ट पर ले जाता है (और इस तरह इसे अंतिम उत्पाद के साथ जारी करता है)।
  • निर्भरता अन्तःक्षेपण। स्पष्ट रूप से हर दूसरे वर्ग को देने के लिए मैं एक फ़ील्ड का उपयोग करता हूं और एक कंस्ट्रक्टर-पैरामीटर केवल उन्हें बनाने की तुलना में बहुत अधिक काम करता है जब मुझे उनकी आवश्यकता होती है; लेकिन तब मैं इस वर्ग को अलग-थलग नहीं कर सकता।
  • सिंगल रिस्पांसिबिलिटी प्रिंसिपल, जिसने मुझे इतने सारे सिरदर्द दिए हैं, मैं इसे अपने जवाब में ले गया हूं ।

तो हम इसे ठीक करने के लिए क्या कर सकते हैं? हमें भाषा वास्तुकला में व्यापक बदलाव की आवश्यकता होगी:

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

संक्षेप में, हमें ज़मीन-आसमान से डिजाइन की गई भाषा को ध्यान में रखकर परीक्षण करने की आवश्यकता है


मैं अनुमान लगा रहा हूँ कि आपने टाइपमॉक के बारे में कभी नहीं सुना है ? यह मॉकिंग क्लासेस, प्राइवेटेट्स, स्टेटिक्स (फैक्ट्री), कुछ भी करने की अनुमति देता है।
एलोन गुरलीनक

@ सभी: मेरे पास है, लेकिन यह मुफ्त में बहुत दूर है , जिससे यह ज्यादातर लोगों के लिए एक विकल्प नहीं है।
ब्लूराजा - डैनी पफ्लुगुएफ्ट

यदि आपको बहुत सारी फैक्ट्री कक्षाएं लिखनी हैं तो आप कुछ गलत कर रहे हैं। स्मार्ट DI लाइब्रेरीज़ (जैसे C # के लिए ऑटोफ़ैक) फंक <T>, आलसी <T>, डेलिगेट्स आदि का कारखानों के लिए उपयोग कर सकते हैं, बिना किसी बायलर के खुद।
gix

10

टियर्स में अलग अनुप्रयोग; डेटा लेयर, बिजनेस लेयर, UI लेयर

मुख्य कारण जो मुझे नापसंद है वह यह है कि इस पद्धति का पालन करने वाले अधिकांश स्थान इसे पूरा करने के लिए बहुत भंगुर रूपरेखाओं का उपयोग करते हैं। IE UI लेयर को व्यापार परत वस्तुओं से निपटने के लिए हाथ से कोडित किया जाता है, व्यावसायिक नियमों और डेटाबेस से निपटने के लिए बिजनेस लेयर ऑब्जेक्ट्स को कोडित किया जाता है, डेटाबेस SQL ​​है और पहले से ही भंगुर और "DBA" समूह द्वारा प्रबंधित किया जाता है जो परिवर्तन को नापसंद करते हैं।

यह बुरा क्यों है? सबसे आम वृद्धि का अनुरोध होने की संभावना है "मुझे स्क्रीन पर एक क्षेत्र की आवश्यकता है जिसमें वाई है।" बैंग! आपके पास बस एक नई सुविधा है जो हर एक परत को प्रभावित करती है, और यदि आप अलग-अलग प्रोग्रामर के साथ परतों को अलग करते हैं, तो यह बहुत ही साधारण परिवर्तन के लिए कई लोगों और समूहों को शामिल करना एक बड़ा मुद्दा बन गया है।

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

"परतें" लीक भी होती हैं; यदि किसी भी परत को प्रक्रिया / मशीन की सीमाओं (IE वेब यूआई और व्यापार बैकएंड तर्क) द्वारा शारीरिक रूप से अलग किया जाता है, तो हर काम को अच्छी तरह से करने के लिए नियमों को दोहराया जाता है। यानी कुछ व्यावसायिक तर्क यूआई में समाप्त होते हैं, भले ही यह "व्यापार नियम" हो, क्योंकि उपयोगकर्ता को UI को उत्तरदायी बनाने की आवश्यकता होती है।

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

मैं शायद इस के लिए पटक दिया जाएगा, लेकिन यह वहाँ है :)


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

... आगे, अधिकांश दुकानें UI तर्क या प्रस्तुति तर्क को पहचानने में बिल्कुल विफल हो जाती हैं। क्योंकि उन्हें समझ में नहीं आता है कि एक विशिष्ट CRUD एप्लीकेशन में केवल व्यावसायिक तर्क कितना कम होता है, उन्हें ऐसा लगता है कि जब उनका तर्क प्रस्तुति परत में प्रस्तुति तर्क के रूप में रहता है, तो वे कुछ गलत कर रहे होंगे। इसे व्यावसायिक तर्क के रूप में गलत तरीके से पहचाना जाता है और फिर लोग इसे सर्वर पर किसी अन्य सर्वर कॉल के लिए धकेल देते हैं। एक पतला ग्राहक के पास और प्रेजेंटेशन लॉजिक हो सकता है, जैसे। (यदि text1 को dropDown3 में चुना गया है, तो TextField2 को छिपाएं)।
maple_shaft


7

उपयोगकर्ता की कहानियां / उपयोग मामले / व्यक्ति

 

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


7

80 char / line की सीमा गूंगी हैं

मैं समझता हूं कि जीयूआई पक्ष (स्क्रीन रिज़ॉल्यूशन सीमाएं, आदि) पर सबसे धीमे धावक की गति से मेल खाने के लिए कुछ समझौता करने की आवश्यकता है लेकिन, यह नियम कोड स्वरूपण पर क्यों लागू होता है?

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

निश्चित रूप से, सीएलआई संपादक धार्मिक रूप से * निक्स डायनासोर द्वारा उपयोग किए जाते हैं जो अपने VT220 टर्मिनलों की पुरानी पुरानी सीमाओं का पालन करते हैं लेकिन हम में से बाकी को एक ही मानक के लिए क्यों रखा गया है?

मैं कहता हूं, 80 char की सीमा पेंच करो। यदि डायनासोर पूरे दिन ईमेक / वीम पर हैक करने के लिए पर्याप्त महाकाव्य हैं, तो एक एक्सटेंशन बनाने में सक्षम क्यों नहीं होना चाहिए जो स्वचालित रूप से लाइनों को लपेटता है या अपने सीएलआई आईडीई को क्षैतिज स्क्रॉलिंग क्षमता देता है?

1920x1080 पिक्सेल मॉनिटर अंततः मानदंड बन जाएगा और डेवलपर्स अभी भी दुनिया भर में एक ही सीमा के तहत रह रहे हैं, क्योंकि वे इसके अलावा कोई असर नहीं डालते हैं, यही कारण है कि उन्हें अपने बड़ों द्वारा ऐसा करने के लिए कहा गया था जब वे बस कार्यक्रम शुरू कर रहे थे।

80 चार सीमाएं एक सर्वोत्तम अभ्यास नहीं हैं, लेकिन प्रोग्रामर की बहुत अल्पसंख्यक के लिए एक आला अभ्यास है और इस तरह के रूप में व्यवहार किया जाना चाहिए।

संपादित करें:

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

जब 800x600 कंप्यूटर मॉनिटर अधिकांश उपयोगकर्ताओं के लिए आदर्श बन गए, तो वेब डेवलपर्स ने बहुमत को समायोजित करने के लिए अपनी वेबसाइट की चौड़ाई बढ़ा दी ... डेवलपर्स ऐसा क्यों नहीं कर सकते।


1
@ @__ के साथ अच्छा GWB तर्क बुराई कोण है। तो आप hScroll को घृणा करते हैं, क्या आपके पास कोई वैध कारण है कि कोलो-चौड़ाई 80 वर्णों तक सीमित होनी चाहिए? 160 या 256 क्यों नहीं? मुझे लगता है कि हम सभी यह मान सकते हैं कि अधिकांश डेवलपर्स ने अपने VT220 टर्मिनलों को सेवानिवृत्त कर दिया है और उन्हें puTTY के साथ बदल दिया है ताकि वे वैसे भी प्रोग्राम को व्यापक रूप से विस्तारित करने में सक्षम हों।
इवान प्लाइस

4
मैं पसंद करता हूं कि हम 80 char सीमा पर रहें। जैसे ही आप मुझे अधिक क्षैतिज स्थान देंगे, मैं बाकी के साथ अतिरिक्त दस्तावेज़ों को एक साथ खोलने की कोशिश करूँगा। मुझे चार तरह से स्क्रॉल करने से नफरत होगी। इसके अलावा, मैंने अक्सर देखा है कि मैं 80 चार्ट के साथ अधिक पठनीय कोड लिखने के लिए मजबूर हूं।
फिलिप डुपनोविक

2
आप इसे कैसे छापेंगे?

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

3
2 स्थानों द्वारा इंडेंट। और एक स्वचालित इंडेंटेशन ट्रैकर के साथ एक संपादक का उपयोग करें। मैंने इसे सालों तक इस तरह से किया है, कोई बड़ी बात नहीं है। (सही मोड के साथ Emacs यहाँ मदद करता है।)
जल्दी_बस

5

नाप, नाप, नाप

तो ठीक है, दूर माप, लेकिन प्रदर्शन कीड़े को अलग करने के लिए , साथ ही साथ लगातार उन्मूलन के बारे में काम करता है। यहाँ मैं उपयोग विधि है।

मैं माप-माप "ज्ञान" के स्रोत को ट्रैक करने की कोशिश कर रहा हूं। एक लंबे पर्याप्त साबुन वाले किसी व्यक्ति ने इसे कहा, और अब यह यात्रा करता है।


5

मेरा शिक्षक मांग करता है कि मैं अपने सभी पहचानकर्ताओं (स्थिरांक सहित नहीं) को लोअरकेस अक्षरों के साथ शुरू करता हूं, जैसे myVariable

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


9
मेरे पास एक शिक्षक था जिसे कैमलकेज़ की आवश्यकता थी क्योंकि उसने जोर देकर कहा था कि लोग वास्तविक वर्ल्ड में क्या उपयोग करते हैं ... उसी समय मैं अपने काम में दो अलग-अलग समूहों में प्रोग्रामिंग कर रहा था - दोनों समूहों ने अंडरस्कोर पर जोर दिया। क्या मायने रखता है जो आपके समूह का उपयोग करता है। वह खुद को मुख्य प्रोग्रामर के रूप में परिभाषित कर सकता था और मेरी पुस्तक में सब ठीक रहा होगा - हम उसकी परंपराओं का पालन करते हैं - लेकिन वह हमेशा अपनी राय "वास्तविक दुनिया में जिस तरह से किया जाता है" के रूप में दे रहा था जैसे कि कोई अन्य मान्य नहीं था मार्ग।
xnine

@xnine मेरे पास इस साइट पर अभी तक आपकी टिप्पणी को रेट करने के लिए पर्याप्त प्रतिनिधि नहीं है, इसलिए मैं सिर्फ अनुमोदन की
अधिकतम दोपहर

5
कैमल केस (पहला अक्षर लोअरकेस) एक बहुत ही सामान्य सम्मेलन है और साथ ही पास्कल केस (हर शब्द का पहला अक्षर कैपिटल है)। अधिकांश भाषाओं में, CamelCase का उपयोग निजी / आंतरिक चर पर किया जाता है जहां PascalCase का उपयोग कक्षाओं, विधियों, गुणों, नाम स्थान, सार्वजनिक चर पर किया जाता है। यह उन परियोजनाओं के लिए तैयार होने के लिए एक बुरा अभ्यास नहीं है जो एक अलग नामकरण योजना का उपयोग कर सकते हैं।
इवान प्लाइस

2
सिर्फ एक FYI करें। कुछ भाषाओं का यह अर्थ है कि एक चर का पहला अक्षर पूंजी है या नहीं। इस तरह की एक भाषा में, यदि पहला अक्षर कैपिटल है, तो वेरिएबल को एक स्थिरांक के रूप में माना जाता है - इसे बदलने के किसी भी प्रयास में त्रुटि होगी।
बेरिन लोरिट्श

1
में जाओ , सार्वजनिक तरीकों और कक्षाओं में सदस्य एक अपर केस अक्षर के साथ शुरू; कम-केस पत्र के साथ निजी।
जोनाथन लेफ्लर

5

सिंगलटन का प्रयोग करें

जब आपको केवल किसी चीज का एक उदाहरण होना चाहिए। मैं इससे ज्यादा असहमत नहीं हूं । कभी भी एक सिंगलटन का उपयोग न करें और केवल एक बार इसे आवंटित करें और आवश्यक के रूप में पॉइंटर / ऑब्जेक्ट / संदर्भ के आसपास से गुजरें। ऐसा न करने का कोई कारण नहीं है।


2
यह नकारात्मकताओं का एक पूरा समूह है, जिसने मुझे एकल गीतों पर आपके वास्तविक रुख के बजाय भ्रमित कर दिया है।
पॉल बुचर

1
@Paul बुचर: मुझे सिंगलेट्स से नफरत है और इसका इस्तेमाल कभी नहीं किया जाना चाहिए

1
@rwong: व्यक्तिगत रूप से मुझे नहीं लगता कि कोई भी कारण एक वैध कारण है। बस इसे एक सामान्य वर्ग के रूप में लिखें। वास्तव में, एक सिंगलटन का उपयोग करने का कोई कारण नहीं है, फिर आलस्य और बुरी आदतों या डिजाइन को बढ़ावा देना।

6
कौन कहता है कि सिंगेलटन का उपयोग करना सबसे अच्छा अभ्यास है?
फिल मंडर

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

5

इटर्सेन्ट के रूप में अहस्ताक्षरित int का उपयोग करना

वे कब सीखेंगे कि हस्ताक्षरित इंट का उपयोग करना अधिक सुरक्षित और कम बग-प्रवण है। यह इतना महत्वपूर्ण क्यों है कि सरणी सूचकांक केवल सकारात्मक संख्या हो सकती है, कि हर कोई इस तथ्य को नजरअंदाज कर खुश है कि 4 - 5 4294967295 है?


ठीक है, अब मैं उत्सुक हूं- आप ऐसा क्यों कहते हैं? मैं थोड़ा बेवकूफ महसूस कर रहा हूं - क्या आप अपने बयानों का समर्थन करने के लिए कुछ कोड उदाहरण प्रदान कर सकते हैं?
पॉल नाथन

4
@Paul नाथन: जहाँ तक buggyness यहाँ जाता है के रूप में एक उदाहरण है: के लिए (अहस्ताक्षरित int मैं = 0; i <10; i ++) {int crash_here = my_array [अधिकतम (i-1,0)];}
AareP

@AareP: सुनिश्चित करने के लिए - मुझे लगता है कि आप इस तथ्य का संदर्भ दे रहे हैं कि जब एक अहस्ताक्षरित int 0द्वारा घटाया जाता है 1, तो आप वास्तव में अधिकतम सकारात्मक मान के साथ समाप्त होते हैं जो एक अहस्ताक्षरित int स्टोर कर सकता है?
एडम पेन्न्टर

1
@ अदम पयंटर: हाँ। यह c ++ प्रोग्रामर के लिए सामान्य लग सकता है, लेकिन चलो इसका सामना करते हैं, "अहस्ताक्षरित int" सकारात्मक-केवल-संख्याओं में से एक "कार्यान्वयन" खराब है।
aareP

छोटे एम्बेडेड मशीनों पर एक अच्छा विचार नहीं है - अक्सर अहस्ताक्षरित छोटे, तेज कोड उत्पन्न करेंगे। संकलक और प्रोसेसर पर निर्भर करता है।
जल्‍दी से जल्‍दी से जल्‍दी

4

विधियाँ एकल स्क्रीन से अधिक लंबी नहीं होनी चाहिए

मैं एकल-जिम्मेदारी के सिद्धांत से पूरी तरह सहमत हूं लेकिन लोग इसका मतलब यह क्यों समझते हैं कि "एक फ़ंक्शन / पद्धति के पास तार्किक ग्रैन्युलैरिटी के बेहतरीन स्तर पर एकल जिम्मेदारी से अधिक नहीं हो सकता है"?

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

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

यहाँ मेरा नियम है ...

कुछ पूरा करने के लिए कार्य / तरीके लिखें

यदि आप अपने आप को किसी कोड को कॉपी / पेस्ट करने के बारे में पाते हैं, तो अपने आप से पूछें कि क्या उस कोड के लिए फ़ंक्शन / विधि बनाना बेहतर होगा। यदि किसी फ़ंक्शन / विधि को केवल किसी अन्य फ़ंक्शन / विधि में एक बार कहा जाता है, तो क्या वास्तव में इसे पहली जगह में रखने का एक बिंदु है (क्या इसे भविष्य में अधिक बार कहा जाएगा)। डिबगिंग के दौरान कार्यों / विधियों में / अधिक कूद को जोड़ना मूल्यवान है (यानी, क्या अतिरिक्त कूद डिबगिंग को आसान या कठिन बनाता है)?

मैं पूरी तरह से सहमत हूं कि 200 से अधिक लाइनों के कार्यों / विधियों की जांच की जानी चाहिए, लेकिन कुछ कार्यों में केवल एक कार्य को कई लाइनों में पूरा किया जाता है और इसमें कोई उपयोगी भाग नहीं होता है जो परियोजना के बाकी हिस्सों में सार / उपयोग किया जा सकता है।

मैं इसे एपीआई देव के नजरिए से देखता हूं ... यदि कोई नया उपयोगकर्ता आपके कोड के वर्ग आरेख को देखता है, तो उस आरेख के कितने हिस्से परियोजना के अधिक से अधिक पूरे दायरे में समझ में आएंगे और कितने ही पूर्ण रूप से मौजूद होंगे परियोजना के लिए आंतरिक अन्य भागों के लिए सहायक।

अगर मुझे दो प्रोग्रामर के बीच चयन करना था: पहले में कार्य / तरीके लिखने की प्रवृत्ति है जो बहुत अधिक करने की कोशिश करते हैं; दूसरा हर फ़ंक्शन / विधि के हर हिस्से को दाने के बेहतरीन स्तर तक तोड़ता है; मैं पहले हाथों को नीचे चुनूंगा। पहला अधिक पूरा करेगा (यानी, आवेदन का अधिक मांस लिखें), उसका कोड डिबग करना आसान होगा (डिबगिंग के दौरान कार्यों / विधियों में कम कूदने के कारण), और वह व्यस्त काम को पूरा करने में कम समय बर्बाद करेगा। कोड बनाम संपूर्ण लगता है कि कोड कैसे काम करता है।

अनावश्यक सार को सीमित करें और स्वत: पूर्ण को प्रदूषित न करें।


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

3
मुझे लगता है कि इसका एक काउंटर तर्क यह है कि एक बड़ी विधि के पुर्ज़ों को अलग-अलग कॉल में पढ़ने से बड़ी विधि आसानी से पढ़ी जा सकती है। भले ही विधि केवल एक बार कहा जाता है।
जेरेमी हेइलर

1
@ जेरेमी कैसे? कैसे करता है, कोड के एक भाग को अमूर्त करने और इसे अपने तरीके से रखने से यह किसी भी अधिक पठनीय बनाता है कि कोड के शीर्ष पर केवल एक पंक्ति टिप्पणी रखने से यह वर्णन करता है कि यह क्या करता है? यह मानते हुए कि कोड का ब्लॉक कोड के उस अनुभाग में केवल एक बार उपयोग किया जाता है। यह वास्तव में है कि सबसे प्रोग्रामर कोड का काम कर रहे भागों विघटित जब वे इसे पढ़ा और / या जगह में कुछ एक-पंक्ति उन्हें याद दिलाने के लिए क्या यह अगर वे नहीं कर सकते करता है टिप्पणी के लिए मुश्किल?
इवान प्लाइस

4
@ इवान: प्रभावी रूप से कोड के टुकड़ों को कार्यों में डालना , उन्हें एक नाम देता है , उम्मीद है कि कोड का वह टुकड़ा क्या करता है। अब, जहाँ भी कोड के उस टुकड़े को कहा जाता है, आप उस कोड को विश्लेषण करने और समझने के बजाय कोड को क्या करते हैं , यह बताते हुए नाम देख सकते हैं । यदि अच्छी तरह से किया जाता है, तो यह कोड को जबरदस्त तरीके से पढ़ना और समझना आसान कर सकता है।
sbi

1
यदि मैं कर सकता था तो +1 और मैं अधिक दे दूँगा। सी कोड की एक गांठ के साथ सभी गलत कुछ भी नहीं है, एक ही फ़ंक्शन में 1000 लाइनें हैं (जैसे कि एक बड़े पैमाने पर स्विच के साथ एक पार्सर) () स्पष्ट रूप से मंशा स्पष्ट और सरल है। सभी छोटे टुकड़ों को तोड़ना और उन्हें कॉल करना बस बात को समझना कठिन हो जाता है। बेशक इस की भी सीमाएँ हैं .... समझदारीपूर्ण निर्णय सब कुछ है।
जल्‍दी से जल्‍दी से जल्‍द
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.