क्या आत्म-संदर्भात्मक पद्धति के लिए कोई वास्तविक कमियां हैं?


14

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

किसी भी तरह, यह मुझे यह सोचकर मिला कि शायद मैं हमेशा "वापसी" करके बुरे व्यवहार में आ सकता हूं, जो कि कुछ भी वापस करने के लिए नहीं है (जैसे सेटर)।

मेरा सवाल है: पिछले सम्मेलन को लागू करने को बुरा व्यवहार या दुरुपयोग माना जा सकता है? क्यों? मुझे नहीं लगता कि कोई प्रदर्शन कमियां हैं, या हैं।


2
एक अच्छा चर्चा प्रोग्रामर
stackexchange.com/questions/48419/…

@KeesDijk धन्यवाद, मैंने अपना प्रश्न थोड़ा सा संपादित किया है, इसलिए यह उस के समान नहीं है, क्योंकि मैं एक ही कक्षा से तरीकों को आगे
बढ़ाने

1
SO पर, उन्होंने मुझे बताया, कि चेनिंग C ++ के लिए नहीं है - stackoverflow.com/questions/5760551/… - आप इसके बारे में क्या सोचते हैं?
कगली-सान

1
@mhambra ऐसा लगता है कि आपको केवल उस समय सावधानी बरतने की आवश्यकता होगी जब विधि को लागू करना और उसके लिए स्पष्ट मानकों को परिभाषित करना।
dukeofgaming

जवाबों:


10

नहीं

जैसा कि केंट बेक बताते हैं, कोड को जितना लिखा जाता है उससे कहीं अधिक बार पढ़ा जाता है।

यदि विधि जंजीरिंग आपके कोड को अधिक पठनीय बनाता है, तो विधि जंजीर का उपयोग करें।


1
महान पुस्तक .. +1
रीन हेनरिक

5
लेकिन , क्या होगा यदि आपकी एकमात्र खोज विधि अधिक पठनीय है? यदि यह किसी भी प्रकार की समस्या का मामला है, तो आप कोडिंग सम्मेलनों के एक सेट से चिपके रहेंगे: इसका मतलब है, निरंतरता के लिए मौजूदा कोड के समान फैशन में लिखना।
coredump

@coredump ऐसा लगता है कि ओपी के पहले से ही ऐसा करने के लिए कहा गया है, लेकिन मुझे लगता है कि स्टीवन सिर्फ यह कह रहा था कि अगर विधि का पालन करना इसे और अधिक पठनीय बनाता है।
पैंजरक्रिस

1
@Panzercrisis ओपी को सुविधा बनाम शब्दार्थ के कारण विधि का उपयोग करने से बचना बताया गया है। स्टीवन का उत्तर मूल रूप से "इसे वैसे भी करें" कहता है और टीम की राय या स्थिरता पर विचार किए बिना केवल ओपी के कोड की पठनीयता पर विचार करता है। क्या होगा यदि ओपी परियोजना में हर मौजूदा वर्ग को फिर से लिखना चाहता है ताकि यह कोड पठनीयता के बारे में उसके स्वाद के अनुरूप हो? यह है कि मैं सुविधा / शब्दार्थ तर्क को कैसे समझता हूं: विधि का उपयोग करने के लिए "तकनीकी" कारण होना चाहिए (btw, यह तर्क भी लगता है जैसे कि दूसरा व्यक्ति अपनी पसंद का बहाना बना रहा है)
coredump

9

हां, कमियां हैं

कोड जो पढ़ने में आसान है वह अच्छा है, लेकिन यह भी बताएं कि कोड क्या संचार करता है। जब किसी वस्तु के तरीके हमेशा वस्तु को लौटाते हैं, तो यह कुछ चीजों का संचार करता है:

  1. मुझे उन्नत कॉन्फ़िगरेशन की आवश्यकता है जो जरूरी नहीं है कि किस क्रम में चीजें सेट या कॉन्फ़िगर की जानी चाहिए
  2. प्रत्येक बाद की विधि कॉल अंतिम पर बनती है

मान्य उपयोग मामला: तदर्थ डेटाबेस प्रश्न

क्लास लाइब्रेरी अधिकांश हर भाषा में मौजूद होती है जो आपको हार्ड कोडेड SQL का सहारा लिए बिना डेटाबेस को क्वेरी करने की अनुमति देती है। उदाहरण के लिए .NET के लिए एंटिटी फ्रेमवर्क लें:

DBContext db = new DBContext();
List<Post> posts = db.Posts
    .Where(post => post.Title.Contains("Test"))
    .OrderBy(post => post.DateCreated)
    .ToList();

यह एक धाराप्रवाह इंटरफ़ेस है जहां प्रत्येक बाद की विधि कॉल पिछले एक पर बनाता है। इन कॉलों को पढ़ना तार्किक रूप से डेटाबेस को क्वेरी करने के संदर्भ में समझ में आता है।

अमान्य उपयोग मामला: गुण स्थापित करने के लिए सिंथेटिक चीनी

अब Postकक्षा के साथ समान पैटर्न का उपयोग करते हैं :

public class Post
{
    public string Title { get; set; }
    public DateTime DateCreated { get; set; }
    public string Body { get; set; }

    public Post SetTitle(string title)
    {
        Title = title;

        return this;
    }

    public Post SetDateCreated(DateTime created)
    {
        DateCreated = created;

        return this;
    }

    public Post SetBody(string body)
    {
        Body = body;

        return this;
    }
}

अब देखते हैं कि आप इस वर्ग का उपयोग कैसे करेंगे:

Post post = new Post()
    .SetTitle("Test")
    .SetDateCreated(DateTime.Now)
    .SetBody("Just a test");

जब मैं इस कोड को देखता हूं, तो मैं तुरंत यह प्रश्न पूछता हूं: "कॉल करने के बाद SetBody, क्या यह डेटाबेस को क्वेरी करता है? क्या मुझे 'मैं कर रहा हूं?' कहने के लिए किसी अन्य विधि को कॉल करने की आवश्यकता है?

कक्षा का उपयोग करके जंजीर पद्धति कॉल कोड से क्या संवाद करती है Post?

  1. मेरे पास एक जटिल सेटअप है
  2. प्रत्येक विधि कॉल पिछले एक पर बनाता है

क्या यह वास्तव में सच है? नहीं। Postकक्षा में एक जटिल सेटअप नहीं है। शीर्षक, दिनांक बनाया गया है और शरीर एक दूसरे पर अधिक जटिल अंत लक्ष्य के लिए नहीं बनाते हैं। आपने एक गोल छेद में एक वर्ग खूंटे को मसला है।

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

जब आपके सहकर्मियों ने कहा:

धाराप्रवाह इंटरफेस केवल सुविधा के लिए लागू नहीं किया जाना चाहिए, लेकिन शब्दार्थ के लिए

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


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

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

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

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

1
When an object's methods always return the object, it communicates a couple of things- मुझे लगता है कि यह एक व्यक्तिगत राय है; यह दावा करना कठिन है कि जंजीर विधियों को देखने वाला हर व्यक्ति समान चीजों को ग्रहण करेगा।
सैम ड्यूफेल

1

मुख्य दोष स्पष्टता का नुकसान है। उदाहरण के लिए:

x.foo();
x.bar();
x.baz();

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

x.foo()
 .bar()
 .baz();

सबसे पहले, यह स्पष्ट है कि नहीं कर रहा है barऔर bazके रूप में एक ही प्रकार की वस्तुओं पर कार्य करते हैं x, जब तक आप एक तथ्य यह है कि के लिए पता है xकी वर्ग उन तरीकों के साथ ही वर्ग है। यहां तक ​​कि अगर यह मामला है, तो यह स्पष्ट नहीं है कि कौन सी विधियां संचालित होती हैं x, या नई वस्तुएं।

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


0

प्रोग्रामिंग भाषाओं के सभी शैलीगत तत्वों पर विचार करें (हाथ से कोडिंग मशीन की भाषा के विपरीत), और यह "शब्दार्थ नहीं सुविधा" तर्क को कमजोर करता है।

इंजीनियरों के रूप में हम जो कुछ करते हैं उसका एक पूरा भाग शब्दार्थ के आसपास सुविधा प्रदान कर रहा है।

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