ठोस सिद्धांतों का उपयोग करते समय डेवलपर्स के लिए खोजशीलता एक समस्या है?


10

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

"जिस तरह से हम इसे करने के लिए उपयोग करते हैं, कर्मचारी के पास वे सभी चीजें होंगी जो आप संभवतः एक कर्मचारी के साथ कर सकते हैं।" और यह सच था। उस एक "क्लास" में कोड की हजारों लाइनें थीं और एक कर्मचारी के साथ आप जो कुछ भी कर सकते थे, वह था। या, इससे भी बदतर, कर्मचारी डेटा की एक तालिका थी और प्रत्येक डेवलपर को यह पता लगाना था कि इवेंट हैंडलर में वे कैसे करना चाहते हैं।

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

हां, बहुत डुप्लिकेट कोड था। हाँ यह बहुत भंगुर कोड था। हां, परीक्षण करना आवश्यक से अधिक कठिन था। हां कार्यक्षमता में परिवर्तन भय उत्पन्न करने वाला था और दृष्टिकोण के कारण कॉपी पेस्ट स्वाभाविक था।

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

मैंने गुगली की है / binged और यहाँ तक कि yahoo! D लेकिन मुझे इस समस्या की कोई पावती नहीं मिली है।

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

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

क्या एक बेहतर तरीका है कि मध्य स्तरीय के अंतरंग ज्ञान की आवश्यकता नहीं है जहां SOLID का वास्तविक कार्यान्वयन होता है?

मूल रूप से मैं जो पूछ रहा हूं, वहाँ एक तरीका है जिससे CRUD प्रकार के डेवलपर्स बहुत जटिल प्रणाली में CRUD डेवलपर्स बने रहें


8
हो सकता है कि आपके डेवलपर्स ने पूरी तरह से खोज के लिए IntelliSense (या समतुल्य) पर निर्भर नहीं किया हो। अच्छी तरह से नाम बताएं। चीजों को अच्छी तरह से प्रलेखित करें। यह एक संचार समस्या है, न कि तकनीकी समस्या।
रीन हेनरिक 20

हममम। किंडा। जितना अधिक मैं इसके बारे में सोचता हूं, उतना ही मुझे विश्वास होता है कि एक व्यापार अवसर है जिसके बारे में गुप्त है।
ElGringoGrande

2
@ReinHenrichs: यदि डेवलपर को प्रलेखन पढ़ने की आवश्यकता है, तो उन्हें समय लगेगा और उत्पादकता को नुकसान होगा। इसलिए यह महत्वपूर्ण है कि वे यह पता लगाएं कि उन्हें दिए गए कार्य के लिए क्या जल्दी चाहिए। इसे इंटेलीजेंस पर भरोसा करने की ज़रूरत नहीं है, लेकिन यह बेहतर होना आसान है। इसे आसान बनाना निश्चित रूप से एक तकनीकी समस्या है।
Jan Hudec

@ जानहुडेक: नहीं, यह नामकरण, लेआउट और व्हाट्सएप के लिए उचित सम्मेलनों का उपयोग करने की एक तकनीकी लेकिन संगठनात्मक समस्या नहीं है। सम्मेलनों का नाम लिए बिना, आपको नहीं पता होगा कि क्या खोजना है। सुसंगत नामकरण के बिना, आपको सब कुछ नहीं मिलेगा और / या बहुत कठिन समय है सब कुछ वापस पता लगाने के लिए। लगातार लेआउट और व्हाट्सएप के उपयोग के बिना (विशेष रूप से प्रकार की घोषणाओं में) आपको आधे ऐसे उदाहरण नहीं मिलेंगे जिनकी आपको आवश्यकता है। हाँ एक बेहतर रेगेक्स मदद कर सकता है, लेकिन मैं रेगेक्स सीखना नहीं चाहता, केवल यह जानने के लिए कि एक क्लास का उपयोग कहाँ किया जाता है।
मार्जन वेनेमा

@JanHudec यह "नहीं" है लेकिन "जब" है। डेवलपर्स को प्रलेखन पढ़ने की आवश्यकता होगी। यदि आप चाहते हैं कि उन्हें "यह पता चले कि उन्हें दिए गए कार्य के लिए क्या आवश्यक है", तो आपका सबसे अच्छा शर्त यह है कि दस्तावेज़ को प्रभावी बनाने पर ध्यान केंद्रित किया जाए। तकनीकी समाधान के साथ लोगों की समस्या (जैसे संचार) को हल करने का प्रयास न करें। यह। कर देता है। नहीं। काम।
हेन हेनरिक्स

जवाबों:


4

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

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

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

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

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

BEGIN_COMMAND_MAP()
    COMMAND_ENTRY( CChangeDeviceState )
    COMMAND_ENTRY( CSetConfiguration )
    ....
END_COMMAND_MAP()

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

आप Facade (GoF) पैटर्न के उपयोग का भी पता लगा सकते हैं। अपने CRUD इंजीनियरों को 1000+ कक्षाएं उजागर करने के बजाय। एक ही वर्ग के पीछे उन सभी को छिपाएं जो केवल उस चीज को उजागर करता है जिसकी आवश्यकता है। मैं अभी भी प्रत्येक "कार्रवाई" करने के लिए अपने स्वयं के वर्ग होगा, लेकिन आपके चेहरे वर्ग में ऐसे तरीके हो सकते हैं जो आपके प्रत्येक कार्य को तुरंत रोक दें और फिर से, Intellisense के साथ वे तुरंत देखें कि क्या उपलब्ध है। या मुखौटा के पास वास्तविक तरीके हैं, लेकिन आंतरिक रूप से उन्हें तात्कालिक आदेश बनाते हैं, उन्हें कतारबद्ध करते हैं और प्रतिक्रियाओं की प्रतीक्षा करते हैं। फिर वापस लौटें जैसे कि एक नियमित विधि कॉल किया गया था।

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


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

0

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

समस्या को आसान बनाने के लिए नेमस्पेस (C #) या पैकेज (जावा), या आपकी भाषा में जो भी समान अवधारणा है (मैं उन सभी को नामस्थान के रूप में संदर्भित करूंगा) का उपयोग करने की कोशिश करता हूं।

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

यदि आप यह अधिकार करते हैं, तो आप बहुत खोज योग्य वस्तुओं के साथ समाप्त हो जाएंगे।

आपका उदाहरण लेने के लिए, यदि मैं उपयोगकर्ता सत्यापन चाहता हूं, तो मैं "MyCo" टाइप करता हूं। और यह मुझे एप्लिकेशन नामस्थानों की एक सूची देता है। मुझे पता है कि उपयोगकर्ता डेटाबेस का उपयोग हमारे सभी ऐप में किया जाता है, इसलिए मैं "कोर" टाइप करता हूं। तब मुझे कार्यक्षमता के प्रकारों की एक सूची मिलती है। उनमें से एक "मान्यता" है ताकि एक स्पष्ट पसंद की तरह लगता है। और वहाँ, सत्यापन के भीतर, इसकी सभी कार्यक्षमता के साथ "UserValidator" है।

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

लेकिन जिन चीज़ों को मैं याद नहीं रख सकता, उन्हें ढूंढना अभी भी बहुत आसान है। और जब मैं करता हूं, तो मैं नामस्थान उपसर्ग को हटा सकता हूं।


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

0

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

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

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


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

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