क्या यह एक कोड गंध है यदि आप अक्सर एक विधि बना रहे हैं बस उस पर एक विधि को कॉल करें


14

मुझे एक कोड आधार विरासत में मिला है जहाँ बहुत से कोड हैं जो कुछ इस तरह से जाते हैं:

SomeDataAdapter sda = new SomeDataAdapter();
sda.UpdateData(DataTable updateData);

और फिर सोडा का उपयोग फिर कभी नहीं किया जाता है।

क्या यह एक कोड गंध है जो इंगित करता है कि उन तरीकों को वास्तव में इसके बजाय स्थिर वर्ग तरीके होना चाहिए?


क्या ये वर्ग किसी भी इंटरफेस को लागू करते हैं?
रिएक्टगुलर

7
जिस दिन आप स्टैटिक मेथड के लिए रिफ्लेक्टर करेंगे, वह दिन होगा जब आप अपने डेटा एडॉप्टर के नकली संस्करण के साथ यूनिट टेस्ट चलाना चाहते हैं।
माइक

22
@ माइक: आपको कभी स्थैतिक पद्धति का मजाक उड़ाने की आवश्यकता क्यों होगी? मैं इस भयावह तर्क से भयभीत हो रहा हूं कि स्थिर विधियां परीक्षण योग्य नहीं हैं। यदि आपकी स्टेटिक विधियां राज्य को धारण कर रही हैं या साइड इफेक्ट्स पैदा कर रही हैं, तो यह आपकी गलती है, न कि आपकी परीक्षण पद्धति की गलती।
रॉबर्ट हार्वे

9
मेरी राय में, यह "सब कुछ एक वर्ग होना चाहिए" विश्लेषण की कमजोरी दिखाने वाली भाषा की गंध है।
बेन

7
@RobertHarvey: आपको उसी स्थैतिक विधि का मजाक उड़ाना पड़ सकता है, उसी कारण से जब आप किसी अन्य विधि का मजाक उड़ाते हैं: इकाई-परीक्षण के दौरान कॉल करना बहुत महंगा है।
केविन क्लाइन

जवाबों:


1

मैं इसे उस आर्किटेक्चर गंध पर विचार करूंगा जो कि अपडेटडाटा में शायद 'सेवा' वर्ग से संबंधित होना चाहिए।

जहां डेटा एक Apple है। जहां AppleAdapter सेवा / व्यवसाय-बुद्धि वर्ग है। जहां AppleService AppleAdapter के लिए एक सिंगलटन संदर्भ है जो वर्तमान पद्धति के बाहर मौजूद है।

private static volatile AppleAdapter _appleService = null;
private static object _appleServiceLock = new object();
private AppleAdapter AppleService
{
    get
    {
        if (_appleService == null)
        {
            lock (_appleServiceLock)
            {
                if (_appleService == null)
                    _appleService = new AppleAdapter();
            }
        }
        return _appleService;
    }
}

public SomeAppleRelatedMethod(Apple apple)
{
    AppleService.UpdateData(apple);
}

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

आपको पता है कि? अगर SomeDataAdapter एक ADO IDbDataAdapter है (जो यह लगभग निश्चित रूप से है), इस पूरी प्रतिक्रिया की उपेक्षा करें!

: पी

मुझे मूल प्रश्न पर टिप्पणी जोड़ने की अनुमति नहीं है, लेकिन यदि आप यह निर्दिष्ट कर सकते हैं कि यह कोड कहाँ मौजूद है।

अगर यह कोड एक IDbDataAdapter के कस्टम कार्यान्वयन का प्रतिनिधित्व करता है, और UpdateData एक IDbConnection, IDbCommand बना रहा है, और इसे सभी दृश्यों के पीछे वायरिंग कर रहा है, तो कोई भी मुझे नहीं लगेगा कि एक कोड गंध क्योंकि अब धाराओं और अन्य के बारे में बात कर रहा है उन चीजों का निपटान करने की आवश्यकता होती है जब हम उनका उपयोग करते हैं।


12
मदद! मैं सॉफ्टवेयर पैटर्न में डूब रहा हूं।
रॉबर्ट हार्वे

4
... या एक निर्भरता के रूप में इंजेक्शन। ;)
रॉब

12
एक साधारण फंक्शन / प्रक्रिया के बराबर कुछ पाने के लिए सिंगलटन और डबल-चेक्ड लॉकिंग के साथ मेसिंग करना मेरे लिए एक बड़ी कूट गंध है!
बेन

3

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


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

1

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

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


इसका अर्थ यह भी हो सकता है कि आप जिस वस्तु को पास कर रहे हैं उसका संशोधित संस्करण (या संशोधित प्रति) वापस करना चाहते हैं।
रॉबर्ट हार्वे

2
"यदि आप प्रथम श्रेणी के कार्यों के बिना किसी भाषा में फंस गए हैं": केवल एक विधि और प्रथम श्रेणी के कार्य (या प्रथम श्रेणी के समापन) के साथ किसी वस्तु में कोई अंतर नहीं है: वे केवल एक ही के दो अलग-अलग विचार हैं चीज़।
जियोर्जियो

4
@ जियोर्जियो सैद्धांतिक रूप से, नहीं। अभ्यास में, यदि अपनी भाषा नहीं है कम से कम इसके लिए एक वाक्य रचना चीनी है, यह के बीच का अंतर है fn x => x + 1और new Function<Integer, Integer>() { public Integer eval(Integer x) { return x + 1; }};या कुछ हार्ड-कोडेड और सूक्ष्म रूप से उपयोगी कार्यों के लिए अपने आप को सीमित।
डोभाल

क्यों के fn x => x + 1लिए कृत्रिम चीनी नहीं हो सकता है new Function<Integer, Integer>() { public Integer eval(Integer x) { return x + 1; }}? ठीक है, शायद आपका मतलब है कि अगर कोई इस तरह की सिंथैटिक चीनी के बिना एक भाषा में फंस गया है।
जियोर्जियो

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

0

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


0

परिभाषित करें "अक्सर।" आप कितनी बार ऑब्जेक्ट को इंस्टेंट करते हैं? बहुत - शायद नहीं?

आपके सिस्टम में चिंता करने की बड़ी समस्याएं हैं। स्टेटिक जाने से प्रोग्रामर को और अधिक स्पष्ट रूप से संवाद होगा कि ऑब्जेक्ट की आंतरिक स्थिति - महान नहीं बदल रही है।

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

हाँ यह एक कोड गंध है, बस एक छोटा सा।


0

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


0

यहाँ गंध यह है कि यह वस्तुओं में लिपटा हुआ (न्यूनतम) प्रक्रियात्मक कोड है।

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

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

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

BTW किसी भी समय आप प्रोग्राम को समस्या की जगह मॉडलिंग करते हुए देखते हैं । यह संकेत है कि डिज़ाइन अधिक विचार से लाभान्वित हो सकता है। दूसरे शब्दों में, "xAdaptor" और "xHandler" और "xUtility" सभी वर्गों के लिए देखें, और आमतौर पर एनेमिक डोमेन मॉडल से बंधा हुआ है । इसका मतलब है कि कोई व्यक्ति सुविधा के लिए कोड को बंडल कर रहा है, जैसा कि वास्तव में उन अवधारणाओं को मॉडलिंग करना है जो वे लागू करना चाहते हैं।

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