কোনও শ্রেণিতে গুণাবলীর প্রাক-প্রাথমিককরণ আরও ভাল অনুশীলন, বা সেগুলি যুক্ত করার জন্য?


11

আমি দুঃখিত যদি এটি একটি নিখুঁত পরিশীলিত প্রশ্ন, তবে আমি উত্সাহী যে সেখানে সর্বোত্তম অনুশীলনগুলি কী রয়েছে এবং গুগলে আমার কোনও ভাল উত্তর খুঁজে পাওয়া যায় না।

পাইথনে, আমি সাধারণত একটি সুপার-ক্যাচল ডেটা স্ট্রাকচার কনটেইনার (একটি জেএসওএন ফাইলের মতো সাজানো) হিসাবে খালি ক্লাস ব্যবহার করি এবং সেই সাথে বৈশিষ্ট্যগুলি যুক্ত করি:

class DataObj:
    "Catch-all data object"
    def __init__(self):
        pass

def processData(inputs):
    data = DataObj()
    data.a = 1
    data.b = "sym"
    data.c = [2,5,2,1]

এটি আমাকে প্রচুর পরিমাণে নমনীয়তা দেয়, কারণ ধারক বস্তু মূলত যে কোনও কিছু সঞ্চয় করতে পারে। সুতরাং যদি নতুন প্রয়োজনীয়তাগুলি ক্রপ হয়ে যায়, আমি কেবল এটি ডেটাবজ অবজেক্টের (যা আমি আমার কোডের মধ্যে দিয়ে যাচ্ছি) এর অন্য বৈশিষ্ট্য হিসাবে যুক্ত করব।

যাইহোক, সম্প্রতি আমার (এফপি প্রোগ্রামারদের দ্বারা) এটি প্রভাবিত করেছে যে এটি একটি ভয়াবহ অনুশীলন, কারণ কোডটি পড়া খুব কঠিন করে তোলে। ডেটাঅবজে আসলে কী কী বৈশিষ্ট্য রয়েছে তা নির্ধারণ করতে একটিকে সমস্ত কোড দিয়ে যেতে হবে।

প্রশ্ন : নমনীয়তা ত্যাগ না করে আমি কীভাবে বৃহত্তর রক্ষণাবেক্ষণের জন্য এটি পুনরায় লিখতে পারি?

আমি গ্রহণ করতে পারি যে কার্যকরী প্রোগ্রামিং থেকে কোন ধারণা আছে?

আমি সেখানে সেরা অনুশীলন খুঁজছি।

দ্রষ্টব্য : একটি ধারণা হ'ল শ্রেণীর প্রাক-ইনিশিয়াল করা সমস্ত বৈশিষ্ট্য যার সাথে একজনের মুখোমুখি হওয়ার প্রত্যাশা থাকে eg

class DataObj:
    "Catch-all data object"
    def __init__(self):
        data.a = 0
        data.b = ""
        data.c = []

def processData(inputs):
    data = DataObj()
    data.a = 1
    data.b = "sym"
    data.c = [2,5,2,1]

এটি কি আসলেই ভাল ধারণা? আমার বৈশিষ্ট্যগুলি কী আছে তা যদি আমি জানি না তবে কী হবে?


আপনার ডেটা স্ট্রাকচারগুলি এত পরিবর্তনযোগ্য যে আপনি তাদের রক্ষণাবেক্ষণের সাথে সংশ্লিষ্ট বলে মনে করছেন। আপনার প্রচুর অবসর সময়ে imm, পরিবর্তনীয় ডেটা মডেলগুলি সম্পর্কে এই নিবন্ধটি পড়ার চেষ্টা করুন । এটি ডেটা সম্পর্কে আপনার যুক্তির কারণটিকে পুরোপুরি পরিবর্তন করতে পারে।
9000

@ 9000 এর মতো একটি নিবন্ধ ইতিমধ্যে দৃ .়প্রত্যয়ীদের পুনরায় নিশ্চিত করেছে। আমার কাছে এটি কেন যেন তুলনামূলক বেশি মনে হয়েছিল (হ্যাঁ তালিকার তালিকা আসলেই বিশ্বাসযোগ্য নয় যতক্ষণ না আপনার মনে হয় আপনার সেই নির্দিষ্ট চাহিদা আছে)। আমার কাছে এটি কাউকে ভিবিতে চালান আপডেট করার বিষয়টি বোঝায় না যে তাদের চালানের অবজেক্টের ক্রমাগত নতুন কপি তৈরি করা অর্থবোধ করে (অর্থ প্রদান, নতুন চালান অবজেক্ট; অংশ যোগ করুন, নতুন চালান বস্তু)।
পল

উত্তর:


10

নমনীয়তা ত্যাগ না করে আমি কীভাবে বৃহত্তর রক্ষণাবেক্ষণের জন্য এটি আবার লিখতে পারি?

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

একটি ধারণা হ'ল যে সমস্ত গুণাবলীর মুখোমুখি হওয়ার প্রত্যাশা রয়েছে তার সাথে ক্লাসটি প্রাক-প্রাথমিককরণ initial

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

আমার বৈশিষ্ট্যগুলি কী আছে তা যদি আমি জানি না তবে কী হবে?

তারপরে আপনি যে কোনও ক্ষেত্রে ত্রুটিযুক্ত হন এবং হার্ডকোডিং বৈশিষ্ট্যের নামগুলির পরিবর্তে ডিক বা তালিকা ব্যবহার করা উচিত। তবে আমি এটি গ্রহণ করেছি আপনার অর্থ "... এমন সময় আমি ধারক শ্রেণি লিখি"। তারপরে উত্তরটি হ'ল: "আপনি লকস্টেপে ফাইলগুলি সম্পাদনা করতে পারেন, ডু"। একটি নতুন বৈশিষ্ট্য প্রয়োজন? ধারক শ্রেণিতে একটি ফ্রিগিং বৈশিষ্ট্য যুক্ত করুন। সেই শ্রেণিটি ব্যবহার করে আরও কোড রয়েছে এবং এর জন্য এট্রিবিউটটির প্রয়োজন নেই? জিনিসগুলিকে দুটি পৃথক শ্রেণিতে বিভক্ত করার বিষয়টি বিবেচনা করুন (ডিআরওয়াই থাকার জন্য মিক্সিন ব্যবহার করুন), সুতরাং এটি যদি বোধগম্য হয় তবে এটি optionচ্ছিক করুন।

আপনি যদি পুনরাবৃত্তিযোগ্য ধারক শ্রেণীর লেখাগুলি লিখতে ভয় পান: মেটাগ্রোগ্রামিংটি ন্যায়বিচারের সাথে প্রয়োগ করুন, বা collections.namedtupleতৈরির পরে সদস্যদের পরিবর্তন করার প্রয়োজন না হলে ব্যবহার করুন (আপনার এফপি বন্ধুরা সন্তুষ্ট হবে)।


7

আপনি সর্বদা অ্যালেক্স মার্তেলির গুচ্ছ শ্রেণি ব্যবহার করতে পারেন । তোমার ক্ষেত্রে:

class DataObj:
    "Catch-all data object"
    def __init__(self, **kwds):
        self.__dict__.update(kwds)

def processData(inputs):
    data = DataObj(a=1, b="sym", c=[2,5,2,1])

এইভাবে, পাঠকের পক্ষে কমপক্ষে এটি স্পষ্ট যে ডেটা কেবল একটি বোবা ডেটা স্টোর এবং কোনও তাত্ক্ষণিকভাবে দেখতে পাবে যে কোন মানটি কী নামে সঞ্চিত হয়, যেহেতু এটি সমস্ত এক লাইনে ঘটে।

এবং হ্যাঁ, জিনিসগুলি এইভাবে করা আসলে একটি ভাল ধারণা, কখনও কখনও।


1

আমি সম্ভবত দ্বিতীয় পদ্ধতিটি ব্যবহার করব, সম্ভবত Noneঅবৈধ ডেটা নির্দেশ করতে ব্যবহার করব । এটি সত্য যে আপনি পরে গুণাবলী যুক্ত করলে এটি পড়া / রক্ষণাবেক্ষণ করা কঠিন is যাইহোক, এই শ্রেণি / অবজেক্টের উদ্দেশ্য সম্পর্কে আরও তথ্য অন্তর্দৃষ্টি দেবে কেন প্রথম ধারণাটি একটি খারাপ নকশা: আপনার কোনও পদ্ধতি বা ডিফল্ট ডেটা না থাকলে আপনি কখনই একটি সম্পূর্ণ খালি শ্রেণি পাবেন? ক্লাসের কী কী বৈশিষ্ট্য রয়েছে তা আপনি কেন জানবেন না?

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

একটি প্রকৃত উদাহরণ দেওয়া, আপনি প্রশ্নটি কোডেরউভিউতে নেওয়ার বিষয়ে বিবেচনা করতে পারেন, যেখানে তারা কোডটি রিফ্যাক্টর করতে সহায়তা করতে পারে।

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