एक सहायक क्या है? क्या यह एक डिजाइन पैटर्न है? क्या यह एक एल्गोरिथ्म है?


40

हो सकता है कि थोड़ा-सा जीभ-गाल, लेकिन जैसा कि मुझे यह उत्तर Google के माध्यम से कहीं भी नहीं मिल रहा है, इसलिए यह सुनिश्चित करने के लिए सॉफ्टवेयर इंजीनियरिंग का जवाब है:

एक सहायक क्या है?

मैंने हर जगह (मॉड्यूल नाम, वर्ग के नाम, विधि के नाम) का उपयोग किया जाने वाला नाम देखा है, जैसे कि शब्दार्थ गहरा और सार्थक था, लेकिन कंप्यूटर विज्ञान के संदर्भ में (हालांकि मेरे पास इसमें कोई डिग्री नहीं है), मैं ' कहीं भी एक विवरण या परिभाषा नहीं देखा है!

क्या यह एक डिजाइन पैटर्न है? क्या यह एक एल्गोरिथ्म है? मैंने एक बार एक प्रोग्राम पर काम किया था जिसमें मॉड्यूल और क्लास दोनों को somethingsomethinghelper कहा जाता था (जहाँ somethingsomething काफी सामान्य भी था) और मैंने झट से इसका नाम बदलकर कुछ इस तरह रख दिया जिससे मुझे समझ आ गया, लेकिन मुझे ऐसा लग रहा है कि मैं यहाँ गायब हूँ!


9
हेल्पर वह है जिसे आप कुछ कहते हैं जब आप नहीं जानते कि इसे क्या कहा जाए लेकिन आप इसके एक दोस्त को जानते हैं। हारून की जगह आपको 'जैक का दोस्त' कहने की तरह। डबल प्लस ungood।
david.pfx

एक सहायक कोई भी निजी सदस्य है, जो आइसोमोर्फिज्म तक है।
थॉमस ईडिंग

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

जवाबों:


63

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

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

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


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

10
@ रोबर्टहवे - एनह, मैंने जिन लोगों को देखा है उनमें से अधिकांश का नाम रखा गया है SomethingSomethingHelper। नरक, मैं एक वर्ग अभी नामित पर देख रहा हूँ HelperMethodsमें <company>.Helpersनाम स्थान। मेरे लिए, एक Helperवर्ग के रूप में एक ही बाल्टी में है *Manager
तेलस्टीन

8
@ टेलस्टाइन: शायद यह एक अनुभव की बात है, फिर। मैंने अपने वर्तमान प्रोजेक्ट में सहायक वर्गों के माध्यम से देखा है (कई हैं), और वे सभी सार्थक नाम हैं। केवल एक ही ऐसा है जिसके साथ प्रत्यय दिया गया है Helper, और मुझे लगता है कि इसे एक ही नाम वाले .NET फ्रेमवर्क में एक वर्ग से अलग करना है। *Helperअगर *कुछ सार्थक होता तो मैं स्वीकार्य मानता । HelperMethodsकेवल कल्पना की विफलता है; कम से कम विशिष्ट वैचारिक बाल्टी होना चाहिए।
रॉबर्ट हार्वे

4
@ रोबर्टहवे - आप शायद सही हैं। आधुनिक भाषाओं का उपयोग कर मेरा सारा करियर ट्रेन के मलबों को साफ कर रहा है।
तेलस्टीन

1
इनका एक उपसमूह है, जिसे "सहायक कार्य" कहा जाता है, जो वास्तव में उपयोगी और एक अच्छा पैटर्न है। उदाहरण के लिए, लाइनों का एक सामान्य सेट जिसे किसी फ़ंक्शन के भीतर दोहराया जाना चाहिए - जहां वे दिखाते हैं, इसका एक उदाहरण है जब आपको do..whileपायथन में एक लूप की आवश्यकता होती है , जिसे भाषा समर्थन नहीं करती है ( यहां दूसरा उदाहरण देखें )। एक और होगा अगर एक / elif /... / अन्यथा संरचना, लेकिन ऊपर और नीचे एक मामले को दोहराने की जरूरत है। यदि संभव हो तो उन्हें उस फ़ंक्शन के लिए स्थानीय बनाया जाना चाहिए, हालांकि, और आमतौर पर "सहायक" नहीं कहा जाता है।
इजाकाता

5

एक सहायक एक हानिरहित अतिरिक्त वर्ग या विधि है, जब तक यह बाहरी घटक को पूरक करता है। जब यह विपरीत होता है, तो यह खराब डिज़ाइन को इंगित करता है क्योंकि कोड को इसके प्राधिकरण से बाहर रखा गया है, अगर कोई भी प्राधिकरण है।

यहां एक हानिरहित सहायक का एक उदाहरण है, मैं एक विधि का उपयोग करता हूं जिसे कहा जाता है FindRepकि अग्रणी शून्य की संख्या गिना जाता है।

digits = digits.Remove(0, TextHelper.FindRep('0', digits, 0, digits.Length - 2));

सहायक विधि बहुत सरल है, लेकिन चारों ओर कॉपी-पेस्ट करने के लिए बहुत असुविधाजनक है और रूपरेखा कोई समाधान प्रदान नहीं करती है।

public static int FindRep(char chr, string str, int beginPos, int endPos)
{
    int pos;

    for (pos = beginPos; pos <= endPos; pos++)
    {
        if (str[pos] != chr)
        {
            break;
        }
    }

    return pos - beginPos;
}

और यहाँ एक खराब सहायक का उदाहरण दिया गया है:

public static class DutchZipcodeHelper
{
    public static bool Validate(string s)
    {
        return Regex.IsMatch(s, @"^[1-9][0-9]{3}[A-Z]{2}$", RegexOptions.IgnoreCase);
    }
}

public class DutchZipcode
{
    private string value;

    public DutchZipcode(string value)
    {
        if (!DutchZipcodeHelper.Validate(value))
        {
            throw new ArgumentException();
        }

        this.value = value;
    }

    public string Value
    {
        get { return value; }
    }
}

-1

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

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

एक महान उदाहरण नहीं है, लेकिन आपको यह विचार मिलता है।

s = CompanyName.PersonHelper.GetPerson()
s = CompanyName.Person.GetPerson()

मैं यह नहीं कह रहा हूं कि हेल्पर नामकरण सम्मेलन का उपयोग करना सही समाधान है, लेकिन इसने कुछ वर्षों तक हमारे लिए काम किया।


2
आपने समझाया क्यों नहीं।
रॉबर्ट हार्वे

2
हां, मैं वह स्पष्टीकरण भी चाहूंगा।
एरन हॉल

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