পাইথন কি একটি অ্যান্টি-প্যাটার্ন মিশ্রিত করে?


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, annd my_varকারণ কোড চলমান ছাড়া, এটা আপাতদৃষ্টিতে দেখতে পারে না related_methodsএবং more_methodsমিশ্র-ইন করতে হয় implement_methods

সংকলক এবং স্থিতিশীল বিশ্লেষণ সরঞ্জামগুলি সর্বদা হোল্টিং সমস্যার সমাধান করতে পারে না , তবে আমি অনুভব করি এটি অবশ্যই একটি ক্ষেত্রে যার উত্তরাধিকার সূত্রে প্রাপ্ত বিষয়গুলি অনুসন্ধান করা implement_methodsএকে পুরোপুরি বৈধ এবং এটি করার পক্ষে খুব সহজ জিনিস হবে thing

স্থির বিশ্লেষণ সরঞ্জামগুলি কেন এই বৈধ (আমার মনে হয়) ওওপি প্যাটার্নটিকে প্রত্যাখ্যান করে?

উভয় ক্ষেত্রেই:

  1. এমনকি তারা উত্তরাধিকার পরীক্ষা করার চেষ্টা করে না বা

  2. মিক্সিনগুলি মূর্খ, পাঠযোগ্য পাইথনগুলিতে নিরুৎসাহিত হয়


# 1 স্পষ্টতই ভুল কারণ আমি যদি pylintআমার এমন এক শ্রেণীর সম্পর্কে বলতে বলি যা উত্তরাধিকার সূত্রে unittest.TestCaseব্যবহার করে self.assertEqual(কেবলমাত্র এতে সংজ্ঞায়িত কিছু হয় unittest.TestCase) তবে এটি অভিযোগ করে না

মিশ্রণগুলি কি অযৌক্তিক বা নিরুৎসাহিত হয়?


1
এটা কি খারাপ প্রশ্ন? অফ-টপিক কি? এটা কি অযোগ্য? আমি কি বোকা? লোকেরা ডিভি করতে পারে তবে তারা এটির উন্নতিতে সহায়তা করতে চায় না।
বিড়াল

1
কিছু লোকেরা সম্ভবত জিজ্ঞাসা করতে করতে ক্লান্ত হয়ে পড়েছেন "এটি কি এটি (বিরোধী) ধরণ" বা "এটি (আন) পাইথোনিক"?

9
@ মিশেলটি এটি ভাল। তারা তখন প্রশ্নগুলির পর্যালোচনা বন্ধ করতে পারে।
কাতানা 314

2
@ ট্যাক লোকেরা বিভিন্ন কারণে ডাউনভিট করবে, তবে কখনই তা বলার দরকার পড়েনি - ডাউনভোট বোতামটির একটি সরঞ্জাম-টিপ রয়েছে যা বলে যে "এই প্রশ্নটি কোনও গবেষণার প্রচেষ্টা দেখায় না; এটি অস্পষ্ট বা দরকারী নয়" - একটি অস্পষ্ট, যদি গ্রহণযোগ্য উত্তর। 8 ও 1 ডাউন ডাউন আসলে বেশ ভাল, বিশেষত এমন একটি প্রশ্নে যেখানে ডাউনভোটগুলি বিনামূল্যে। এটি আপনাকে নামতে দেবেন না। চিয়ার্স।
অ্যারন হল

@ অ্যারোনহেল আমি সচেতন লোকেরা তাদের ভোট দিয়ে যা পছন্দ করে তা করার অনুমতি দেওয়া হয়, আমি সত্যই আমি নতুন ব্যবহারকারীদের বলি যারা একই জিনিস অভিযোগ করে।
বিড়াল

উত্তর:


16

মিশিনগুলি কেবল কোনও ব্যবহারের ক্ষেত্রে নয় যা সরঞ্জামটি বিবেচনা করে। এর অর্থ এই নয় যে এটি অগত্যা খারাপ ব্যবহারের মামলা, অজগরটির জন্য কেবল একটি অস্বাভাবিক one

কোনও নির্দিষ্ট ক্ষেত্রে মিক্সিনগুলি যথাযথভাবে ব্যবহৃত হচ্ছে কিনা তা অন্য বিষয়। আমি মিক্সিন অ্যান্টি-প্যাটার্নটি প্রায়শই দেখতে পাই মিক্সিনগুলি ব্যবহার করা হয় যখন কেবল কোনও মিশ্রণ মিশ্রিত হওয়ার উদ্দেশ্যে থাকে। এটি কোনও godশ্বর শ্রেণিকে আড়াল করার এক চক্রাকার পথ। আপনি যদি এখনই কোনও কারণটি ভাবতে না পারেন বা কোনও একটি মিশ্রণটি সরিয়ে আউট করতে বা ছেড়ে দিতে পারেন তবে এটি মিক্সিন হওয়া উচিত নয়।


হ্যাঁ, এটি একটি godশ্বরের বস্তু, আমি স্বীকার করি। এই ক্ষেত্রে আমি যুক্তি দিই যে সিপিইউকে aশ্বর অবজেক্ট হওয়া ঠিক হবে।
বিড়াল

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জিনিসটি আমার জন্য লটারের বিভ্রান্তিকে বাণিজ্য করে
বিড়াল

এটি @ অবস্ট্রাকমেডোড ;-) ছাড়াই আরও বিভ্রান্তিকর আমি প্রথম জাভা দিয়ে শুরু করেছি যাতে এটি আমার পক্ষে ঠিক fine
ক্রিস হুয়াং-লিভার

9

আমি মনে করি মিক্সিনগুলি ভাল হতে পারে তবে আমি মনে করি এই ক্ষেত্রে পাইলটটি সঠিক। দাবি অস্বীকার: মতামত ভিত্তিক স্টাফ অনুসরণ।

একটি ভাল বর্গ, মিশ্রণ অন্তর্ভুক্ত, এর একটি পরিষ্কার দায়িত্ব রয়েছে। আদর্শভাবে, একটি মিশ্রিনটি সমস্ত রাজ্য যেখানে এটি অ্যাক্সেস করতে চলেছে এবং এটি পরিচালনা করার জন্য যুক্তি বহন করবে। যেমন একটি ভাল মিশ্রণ last_updatedএকটি ওআরএম মডেল শ্রেণিতে একটি ক্ষেত্র যুক্ত করতে পারে, এটি সেট করার জন্য যুক্তি সরবরাহ করতে পারে এবং সবচেয়ে পুরানো / সর্বাধিক রেকর্ড অনুসন্ধানের পদ্ধতিগুলি।

অঘোষিত দৃষ্টান্তের সদস্যদের (ভেরিয়েবল এবং পদ্ধতি) উল্লেখ করা কিছুটা অদ্ভুত দেখাচ্ছে।

সঠিক পদ্ধতির হাতের কাজটির উপর নির্ভর করে।

এটি এতে রাখা প্রাসঙ্গিক বিটটির সাথে মিশ্রণ হতে পারে।

এটি ভিন্ন শ্রেণীর শ্রেণিবিন্যাস হতে পারে যেখানে আপনি বর্তমানে মিক্সিনের মাধ্যমে যে পদ্ধতিগুলি বিতরণ করেন সেগুলি একটি বেস শ্রেণিতে থাকে, যখন নিম্ন স্তরের প্রয়োগের পার্থক্যগুলি সাবক্লাসের অন্তর্গত। এটি স্ট্যাক অপারেশনগুলির সাথে আপনার ক্ষেত্রে সবচেয়ে উপযুক্ত বলে মনে হচ্ছে।

এটি কোনও শ্রেণি সাজসজ্জা হতে পারে যা একটি বা দুটি পদ্ধতি যুক্ত করে; পদ্ধতিটি প্রজন্মের উপর প্রভাব ফেলতে আপনাকে ডেকরেটারের কাছে কিছু যুক্তি দিতে হবে যখন এটি সাধারণত বোধগম্য হয়।

আপনার সমস্যাটি বর্ণনা করুন, আপনার বৃহত্তর ডিজাইনের উদ্বেগগুলি ব্যাখ্যা করুন, তারপরে যদি আপনার ক্ষেত্রে কোনও বিষয় অ্যান্টি-প্যাটার্ন হয় তবে আমরা তর্ক করতে পারি।


6

এই লিটারটি সচেতন নয় যে আপনি একটি ক্লিনিকে মিক্সিন হিসাবে ব্যবহার করেন। পাইলিন্ট সচেতন যে আপনি ক্লাসের নামের শেষে 'মিক্সিন' বা 'মিক্সিন' প্রত্যয় যুক্ত করলে আপনি মিশ্রণটি ব্যবহার করেন তবে লিটারটি অভিযোগ করা বন্ধ করে দেয়।

linter_without_mixins linter2_with_mixin

মিক্সিনগুলি প্রতি সেজে খারাপ বা ভাল হয় না, এটি কেবল একটি সরঞ্জাম। আপনি তাদের একটি ভাল ব্যবহার বা খারাপ ব্যবহার করুন।


2
এটি আরো একটি মন্তব্য দেখে মনে পড়লো, দেখুন উত্তর কিভাবে
মশা

2
এটি একটি মূল্যবান উত্তর কারণ আমি মনে করি না আমি অন্যথায় that ইঙ্গিতটি সম্পর্কে কখনও জানতাম না
বিড়াল

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" 

মিশ্রণ এবং গোলমাল খরচ

আপনি যা করছেন তার ব্যয়গুলি আপনার লিন্টার প্রতিবেদনে গোলমাল করছে। এই শব্দটি আপনার কোডের সাথে আরও গুরুত্বপূর্ণ সমস্যাগুলিকে অস্পষ্ট করতে পারে। এটি ওজনের একটি গুরুত্বপূর্ণ ব্যয়। আরেকটি ব্যয় হ'ল আপনি নিজের আন্তঃসংযুক্ত কোডটি বিভিন্ন নাম-স্পেসে পৃথক করছেন যা প্রোগ্রামারদের অর্থ আবিষ্কার করা আরও কঠিন করে তুলতে পারে।

উপসংহার

উত্তরাধিকার কোড পুনরায় ব্যবহারের অনুমতি দেয়। আপনি যদি আপনার মিশ্রণগুলির সাথে কোডের পুনরায় ব্যবহার পান তবে দুর্দান্ত, তারা আপনার জন্য এমন মান তৈরি করেছে যা সম্ভবত অন্যান্য সম্ভাব্য ব্যয়ের চেয়ে বেশি। আপনি যদি কোডের লাইনগুলির কোড পুনরায় ব্যবহার / প্রতিলিপি না পেয়ে থাকেন তবে আপনি সম্ভবত আপনার মিক্সিনগুলির জন্য খুব বেশি মূল্য পাচ্ছেন না, এবং এই মুহুর্তে, আমি মনে করি যে গোলমালের ব্যয়গুলি সুবিধার চেয়ে বেশি।


এগুলি সংযুক্ত, অযৌক্তিক উদাহরণে বিভক্ত করার একটি ভাল কারণ আছে - যখন আমার কাছে গণিত প্রয়োগ করে এমন একটি পূর্ণাঙ্গ শ্রেণীর একটি ভগ্নাংশ থাকে, অন্যটি স্ট্রিং প্রয়োগ করে, এবং আপনি তাদের একসাথে মিশ্রিত করেন তখন আমার কোডটি সংগঠিত করা আমার পক্ষে সহজ and ফোর্থ স্যুপ পেতে।
বিড়াল

"আরেকটি ব্যয় হ'ল আপনি নিজের কোডটি আলাদা আলাদা নামের জায়গাগুলিতে আলাদা করছেন যা প্রোগ্রামারদের পক্ষে এটির অর্থ খুঁজে পাওয়া আরও কঠিন করে তুলতে পারে" - না, এটি মোটেও তেমন নয়। শ্রেণীর নেমস্পেসগুলি একদল পদ্ধতি কী করে তা বলা সহজ করে তোলে এবং যখন কেউ স্ট্যাকটি ব্যবহার করতে চায়, তাদের পৃথক উপাদানগুলি নয়, ফোর্থ স্যুপটি কল করা / বাস্তবায়ন করা উচিত
বিড়াল

@ কেট সম্ভবত এ কারণেই তারা চুক্তিযুক্ত এবং সত্যিকারের বড় প্রকল্পে ব্যবহৃত হচ্ছে না, উদাহরণস্বরূপ উদাহরণগুলি মিক্সিন ব্যবহারের আপনার পয়েন্টগুলিকে সত্যিই সমর্থন করে না। উভয়ই কেবল একবারে মিশ্রিনটি ব্যবহৃত হয় তা দেখায়, এক্ষেত্রে কেবল প্রয়োগকে এক জায়গায় স্থাপন করা আরও ভাল স্টাইল এবং সংগঠন। এখন আপনি যদি এমন কোনও কেস দেখাতে পারেন যেখানে আপনি ক্লাস জুড়ে সাধারণ বৈশিষ্ট্যগুলি চান তবে একটি সাধারণ বেস শ্রেণি চান না, সেখানে আপনি মিক্সিন ব্যবহার করবেন। যা আপনার প্রবণতা প্রশ্নের পাশে (আল্ট্রাবার্ড এটি ভাল উত্তর দিয়েছিল)। তবে এটি সাধারণত মেশিন প্রয়োগের ক্ষেত্রে আপনার প্রশ্নের উত্তর দেয়।
dlamblin
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.