** কাওয়ারস কি একটি অ্যান্টিপ্যাটার্ন?


16

আমাদের অভ্যন্তরীণ কোডবেসে আমাদের প্রচুর কোড রয়েছে যা আমাদের লাইব্রেরিগুলিকে অভ্যন্তরীণভাবে কল করে - এই লাইব্রেরিতে প্রায়শই প্রচুর পরিমাণে তর্ক থাকে (ম্যাটপ্লটলিব মনে হয়) এবং আমাদের কোডটি প্রায়শই একটি নির্দিষ্ট কাজ করে থাকে এবং কেবলমাত্র **kwargsপরবর্তী ক্রিয়াকলাপটি পাস করে ।

উদাহরণ:

def our_method(dataframe, **kwargs):
    result = do_something_with_data(dataframe)
    external_module.draw(result, **kwargs)

**kwargsআমাদের পদ্ধতি ঘোষণার সমস্ত পরামিতিগুলি পুনরাবৃত্তি করা থেকে বিরত রাখার সময় , এটি কল করে দেওয়ার সময় কোনটি যুক্তি বৈধ হয় তা অত্যন্ত অস্বচ্ছ করে তোলে our_method- কোন পদ্ধতিটি বলা হয় তা আমাকে জানতে হবে, যা আমি প্রায়শই জানতে চাই না।

আপনার এই গ্রহণ কি?

উত্তর:


16

আপনার কোড কীভাবে বিকাশকারীরা ব্যবহার করছেন? অন্য কথায়, কোন যুক্তি ব্যবহার করা উচিত এবং কীভাবে তা নির্ধারণ করতে তারা ঠিক কী করে?

  • যদি তারা আপনার কোড থেকে স্বয়ংক্রিয়ভাবে উত্পন্ন উত্পন্ন ডকুমেন্টেশনের উপর নির্ভর করে এবং জেনারেটরের কী করণীয় তার কোনও **kwargsধারণা নেই তবে এটি অবশ্যই সমস্যাযুক্ত। ডকুমেন্টেশনে আর্গুমেন্টের তালিকা এবং তার অর্থ অনুসন্ধান করার পরিবর্তে তাদের কাছে অস্পষ্ট "এটি কিছু যুক্তি লাগে" ব্যতীত কোনও তথ্য নেই ।

    এই সমস্যাটি সম্ভবত ম্যানুয়ালি পদ্ধতিটি নথিবদ্ধ করে স্বয়ংক্রিয়ভাবে উত্পন্ন ডকুমেন্টেশনগুলি প্রতিস্থাপনের মাধ্যমে সমাধান করা যেতে পারে। এটি পদ্ধতির প্রয়োগকারী থেকে অতিরিক্ত কাজ করা প্রয়োজন, তবে মনে রাখবেন, কোড (এবং এর ডকুমেন্টেশন) এর চেয়ে অনেক বেশি বার বার পড়া হয়।

  • কোড যদি তাদের ডকুমেন্টেশন হয় তবে যে বিকাশকারী পদ্ধতিটি ব্যবহার করে **kwargsতাদের দুটি অতিরিক্ত পদক্ষেপের প্রয়োজন: কেবলমাত্র অন্য পদ্ধতিটি যেটি আহ্বান করে তা আবিষ্কার করার জন্য তাদের কেবল পদ্ধতির স্বাক্ষরটি নয়, এর বাস্তব প্রয়োগেরও প্রয়োজন। তারপরে, তারা যা খুঁজছিল তা শেষ পর্যন্ত তাদের এই অন্যান্য পদ্ধতিতে যেতে হবে।

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

আমার প্রস্তাবটি **kwargsকেবলমাত্র সেই পদ্ধতির জন্য নির্ভর করা যা এর সুযোগ কমিয়ে দেয়। _ক্লাসে কয়েকটি জায়গায় ব্যবহার করা হয় এমন বেসরকারী পদ্ধতি (এবং পাইথনের প্রসঙ্গে গোপনীয়তার অর্থ, শুরু করার পদ্ধতিগুলি ) অর্থ ভাল প্রার্থী, উদাহরণস্বরূপ। অন্যদিকে, কোড বেস জুড়ে কয়েক ডজন ক্লাস দ্বারা ব্যবহার করা পদ্ধতিগুলি খুব খারাপ প্রার্থী।

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

  • আপনার পদ্ধতির মধ্যে সুস্পষ্ট যুক্তি তৈরি করার জন্য প্রচুর পরিশ্রমের প্রয়োজন হয় না,

  • আপনি পরে আর্গুমেন্টগুলি যাচাই করতে চাইবেন (যদিও আপনি যদি যুক্তি সুস্পষ্ট করতে কেবল এই পয়েন্টের উপর নির্ভর করেন তবে আপনি YAGNI লঙ্ঘন করেছেন)।


আমি এই উত্তরটি সত্যিই পছন্দ করি এবং এটি একটি ভাল উত্তর বলে মনে করি। দুর্ভাগ্যক্রমে, আমাদের কোডগুলিতে প্রচলিত প্রচলিত পদ্ধতি রয়েছে এই প্যাটার্নটি ব্যবহার করে। তবে এখন আমার যুক্তি রয়েছে যে আমাদের এটিকে পরিবর্তন করা উচিত (এবং ম্যাটপ্লটলিবকে ফেলে দেওয়া, কোনও ক্র্যাপিয়ারকে "ইন্টারফেস" দেখেনি ..)
ক্রিশ্চিয়ান

3

যদি পরবর্তী স্তরের ফাংশনে একটি __ ডক__ থাকে, তবে আপনি কেবলমাত্র __ ডক__ আপনার নতুন ফাংশনে অনুলিপি করতে পারবেন।

উদাহরণ স্বরূপ:

def a(x):
    """This function takes one parameter, x, and does nothing with it!"""
    pass

def b(**kwargs):
    a(**kwargs)

b.__doc__=a.__doc__

এটি পুনরাবৃত্তির সাথে প্রযোজ্য হতে পারে এবং একটি ডেকরেটার দ্বারা প্রয়োগ করা যেতে পারে (যা আপনি যদি এখনও এগুলি বেশিরভাগ ক্ষেত্রে করছেন তবে কার্যকর হতে পারে)। শেষ পর্যন্ত আরও যুক্ত করতে __ডোক __ স্ট্রিংটিও খুব বেশি হেরফের করা যায়। এর অর্থ দেখানো প্যারামিটারগুলি এখনও কাওয়ার্গস হতে পারে তবে প্রকৃত পরামিতিগুলি বর্ণনা করতে সাহায্যে কমপক্ষে ডকুমেন্টেশন রয়েছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.