क्या पायथन मिक्सिन्स एक एंटी-पैटर्न हैं?


34

मुझे पूरी तरह से पता है कि pylintऔर अन्य स्थैतिक विश्लेषण उपकरण सभी जानते नहीं हैं, और कभी-कभी उनकी सलाह की अवज्ञा की जानी चाहिए। (यह विभिन्न वर्गों के संदेशों के लिए लागू होता है, न कि सिर्फ conventionएस के लिए।)


अगर मेरे पास कक्षाएं हैं

class related_methods():

    def a_method(self):
        self.stack.function(self.my_var)

class more_methods():

    def b_method(self):
        self.otherfunc()

class implement_methods(related_methods, more_methods):

    def __init__(self):
        self.stack  = some()
        self.my_var = other()

    def otherfunc(self):
        self.a_method()

जाहिर है, यह विवादित है। यहां एक बेहतर उदाहरण है, यदि आप चाहें

मेरा मानना ​​है कि इस शैली को "मिक्सिन्स" का उपयोग करके कहा जाता है।

अन्य साधनों की तरह, pylintइस कोड को -21.67 / 10मुख्य रूप से रेट करता है क्योंकि यह सोचता है more_methodsऔर related_methodsउसके पास selfया विशेषताएँ नहीं हैं otherfunc, और stack, my_varक्योंकि कोड को चलाने के बिना, यह स्पष्ट रूप से नहीं देख सकता है related_methodsऔर more_methodsमिश्रित-में है implement_methods

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

स्थैतिक विश्लेषण उपकरण इस वैध (मुझे लगता है) OOP पैटर्न को अस्वीकार क्यों करते हैं?

कोई एक:

  1. वे विरासत की जांच करने की कोशिश भी नहीं करते हैं या

  2. मिश्रण मुहावरेदार, पठनीय पायथन में हतोत्साहित किया जाता है


# 1 स्पष्ट रूप से गलत है, क्योंकि अगर मैं pylintमुझे उस वर्ग के बारे में बताने के लिए कहूं जो unittest.TestCaseउस का उपयोग करता है self.assertEqual, (केवल कुछ में परिभाषित है unittest.TestCase), तो यह शिकायत नहीं करता है ।

क्या मिक्स अपच या हतोत्साहित हैं?


1
क्या यह एक बुरा सवाल है? ऑफ टॉपिक है? क्या यह अचूक है? मैं मूर्ख हूँ? लोग DV कर सकते हैं लेकिन वे इसे बेहतर बनाने में मदद नहीं करना चाहते हैं।
बिल्ली

1
कुछ लोग जो यह पूछते हैं कि "यह एक (विरोधी) पैटर्न है" या "यह (संयुक्त राष्ट्र) पायथोनिक" है, के थक जाने की संभावना है।

9
@MichaelT यह ठीक है। वे सवालों की समीक्षा करना बंद कर सकते हैं।
कटाना ३१४

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

@AaronHall मैं जानता हूं कि लोगों को उनके वोटों के साथ जो करना पसंद है उसे करने की अनुमति है, वास्तव में मैं नए उपयोगकर्ताओं को बताता हूं जो एक ही बात की शिकायत करते हैं।
बिल्ली

जवाबों:


16

मिश्रण केवल एक उपयोग का मामला नहीं है जिसे उपकरण द्वारा माना गया था। इसका मतलब यह नहीं है कि यह जरूरी एक बुरा मामला है, अजगर के लिए सिर्फ एक असामान्य है।

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


हाँ, यह एक ईश्वर की वस्तु है, मैं मानता हूँ। इस मामले में मैं तर्क देता हूं कि सीपीयू के लिए देव वस्तु होना ठीक है।
बिल्ली

15

मेरा मानना ​​है कि मिक्सिन्स बिल्कुल, पाइथोनिक हो सकते हैं। हालाँकि, आपके लिंटर को चुप कराने का और आपके मिक्सिंस की पठनीयता को सुधारने का मुहावरेदार तरीका - दोनों (1) अमूर्त विधियों को परिभाषित करते हैं जो कि मिक्सिन के बच्चों को लागू करने के लिए आवश्यक तरीकों को स्पष्ट रूप से परिभाषित करते हैं, और (2) पूर्व-परिभाषित करते हैं Noneमिक्सिन डेटा सदस्यों के लिए प्रचलित फ़ील्ड जो बच्चों को आरंभ करना चाहिए।

इस पैटर्न को अपने उदाहरण पर लागू करना:

from abc import ABC, abstractmethod


class related_methods():
    my_var = None
    stack = None

    def a_method(self):
        self.stack.function(self.my_var)


class more_methods(ABC):
    @abstractmethod
    def otherfunc(self):
        pass

    def b_method(self):
        self.otherfunc()


class implement_methods(related_methods, more_methods):
    def __init__(self):
        self.stack  = some()
        self.my_var = other()

    def otherfunc(self):
        self.a_method()

2
आपके उत्तर के लिए +1, हालाँकि यह abstract other(self): passबात मेरे लिए लिंटर के भ्रम को बढ़ाती है
बिल्ली

यह @abbridmethod के बिना और भी अधिक भ्रामक है ;-) मैंने जावा के साथ शुरुआत की है इसलिए यह मेरे लिए ठीक है।
क्रिस हुआंग-लीवर

9

मुझे लगता है कि मिश्रण अच्छे हो सकते हैं, लेकिन मुझे भी लगता है कि इस मामले में पाइलिंट सही है। अस्वीकरण: राय-आधारित सामान।

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

अघोषित उदाहरण सदस्यों (चर और विधियों) का जिक्र करना थोड़ा अजीब लगता है।

सही दृष्टिकोण बहुत अधिक हाथ में काम पर निर्भर करता है।

यह एक प्रासंगिक मिश्रण हो सकता है, जिसमें संबंधित राज्य रखा गया हो।

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

यह एक क्लास डेकोरेटर हो सकता है जो एक विधि या दो जोड़ता है; यह आमतौर पर समझ में आता है जब आपको विधि निर्माण को प्रभावित करने के लिए डेकोरेटर को कुछ तर्क देने पड़ते हैं।

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


6

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

linter_without_mixins linter2_with_mixin

मिश्रण खराब या अच्छे नहीं हैं, यह एक उपकरण है। आप उन्हें एक अच्छा उपयोग या एक बुरा उपयोग करते हैं।


2
यह एक टिप्पणी की तरह अधिक पढ़ता है, देखें कैसे उत्तर दें
gnat

2
यह एक मूल्यवान जवाब है क्योंकि मुझे नहीं लगता कि मैं कभी भी उस संकेत के बारे में जानता हूँ अन्यथा
बिल्ली

1

मिक्सी ठीक हैं?

क्या पायथन मिक्सिन्स एक एंटी-पैटर्न हैं?

मिश्रण को हतोत्साहित नहीं किया जाता है - वे कई विरासत के लिए एक अच्छा उपयोग-मामला हैं।

आपके लिंटर को शिकायत क्यों है?

Pylint स्पष्ट रूप से शिकायत कर रहा है, क्योंकि यह पता नहीं है जहां otherfunc, stackहै, औरmy_var से आ रही है।

तुच्छ?

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

201
202 class OpCore():
203     # nothing runs without these
204
205 class OpLogik(): 
206     # logic methods... 
207 
208 class OpString(): 
209     # string things
210 
211 
212 class Stack(OpCore, OpLogik, OpString): 
213 
214     "the mixin mixer of the above mixins" 

मिश्रण और शोर की लागत

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

निष्कर्ष

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


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

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

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