ওওপি কোডিং শৈলী: কনস্ট্রাক্টরের সমস্ত কিছুর সূচনা?


14

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

class MyClass1 {
public:
    Myclass1(type1 arg1, type2 arg2, type3 arg3);
    initMyClass1();
private:
    type1 param1;
    type2 param2;
    type3 param3;
    type4 anotherParam1;
};

// Only the direct assignments from the input arguments are done in the constructor
MyClass1::myClass1(type1 arg1, type2 arg2, type3 arg3)
    : param1(arg1)
    , param2(arg2)
    , param3(arg3)
    {}

// Any other procedure is done in a separate initialization function 
MyClass1::initMyClass1() {
    // Validate input arguments before calculations
    if (checkInputs()) {
    // Do some calculations here to figure out the value of anotherParam1
        anotherParam1 = someCalculation();
    } else {
        printf("Something went wrong!\n");
        ASSERT(FALSE)
    }
}

(বা, অজগর সমতুল্য)

class MyClass1:

    def __init__(self, arg1, arg2, arg3):
        self.arg1 = arg1
        self.arg2 = arg2
        self.arg3 = arg3
        #optional
        self.anotherParam1 = None

    def initMyClass1():
        if checkInputs():
            anotherParam1 = someCalculation()
        else:
            raise "Something went wrong!"

এই পদ্ধতির সম্পর্কে আপনার মতামত কি? আমি কি আরম্ভের প্রক্রিয়াটি বিভক্ত করা থেকে বিরত থাকব? প্রশ্নটি কেবলমাত্র সি ++ এবং পাইথনের মধ্যে সীমাবদ্ধ নয়, এবং অন্যান্য ভাষার উত্তরগুলিরও প্রশংসা করা হয়।




1
এবং পাইথনের জন্য: স্ট্যাকওভারফ্লো.com
ডক ব্রাউন

আপনি সাধারণত এটি করেন কেন? অভ্যাস? আপনি কি কখনও এটি করার কারণ দেওয়া হয়েছিল?
জেফো

এমএফসি লাইব্রেরির সাথে জিইউআই তৈরির জন্য কাজ করার সময় @ জেফো আমার এই অভ্যাসটি পেয়েছিল। বেশিরভাগ ইউআই-সম্পর্কিত ক্লাস যেমন সিএপপি, সিউইন্ডো, সিডিএলজি এবং আরও অনেক কিছুতে একটি ওনআইনিট () ফাংশন রয়েছে যার সাহায্যে আপনি ওভাররাইট করতে পারেন, যা তাদের Cooresponding বার্তায় সাড়া দেয়।
ক্যালাদবোলগেল

উত্তর:


28

যদিও এটি কখনও কখনও সমস্যাযুক্ত হয় তবে কনস্ট্রাক্টরের সমস্ত কিছু শুরু করার অনেক সুবিধা রয়েছে:

  1. যদি কোনও ত্রুটি হতে চলেছে তবে এটি যত তাড়াতাড়ি সম্ভব ঘটে এবং এটি নির্ণয় করা সবচেয়ে সহজ। উদাহরণস্বরূপ, যদি নালটি একটি অবৈধ আর্গুমেন্ট মান হয় তবে পরীক্ষকটি পরীক্ষা করুন এবং কনস্ট্রাক্টরে ব্যর্থ।
  2. অবজেক্টটি সর্বদা একটি বৈধ অবস্থায় থাকে। সহকর্মী ভুল করতে পারে না এবং কল করতে ভুলে যায় initMyClass1()কারণ এটি সেখানে নেই"সবচেয়ে সস্তা, দ্রুত এবং সবচেয়ে নির্ভরযোগ্য উপাদানগুলি সেগুলি নেই যা সেখানে নেই" "
  3. যদি এটি উপলব্ধি করে তবে অবজেক্টটিকে স্থাবর করে তোলা যায় যার প্রচুর সুবিধা রয়েছে advant

2

আপনি আপনার ব্যবহারকারীদের যে বিমূর্ততা সরবরাহ করছেন সে সম্পর্কে ভাবুন।

কেন এমন কিছু ভাগ করা যা একটি শটে দুটি করে ভাগ করা যায়?

অতিরিক্ত সূত্রপাত হ'ল আপনার এপিআই স্মরণে রাখতে প্রোগ্রামারদের জন্য অতিরিক্ত অতিরিক্ত কিছু, এবং যদি তারা এটি সঠিকভাবে না করে তবে ভুল হতে আরও বেশি সরবরাহ করে, তবে এই অতিরিক্ত বোঝার জন্য তাদের কী মূল্য?

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


1

বড় ডেটা অঞ্চল বাদে সবকিছু শুরু করুন। স্থিতিশীল বিশ্লেষণ সরঞ্জামগুলি ফিল্ডগুলিকে নির্মাণকারীর মধ্যে আরম্ভ না করা হবে will যাইহোক, সর্বাধিক উত্পাদনশীল / নিরাপদ উপায় হ'ল ডিফল্ট কনস্ট্রাক্টর সহ সমস্ত সদস্য ভেরিয়েবল এবং স্পষ্টভাবে কেবল অ-ডিফল্ট প্রাথমিককরণের প্রয়োজন হয় এমনগুলি সূচনা করা।


0

এমন কিছু ঘটনা রয়েছে যেখানে অবজেক্টটির প্রচুর সূচনা হয় যা দুটি বিভাগে বিভক্ত হতে পারে:

  1. এমন বৈশিষ্ট্য যা হয় অপরিবর্তনীয় বা পুনরায় সেট করার দরকার নেই।

  2. যে বৈশিষ্ট্যগুলিকে তাদের কাজ শেষ করার পরে কিছু শর্তের ভিত্তিতে মূল মানগুলিতে (বা টেম্পলেটাইজড মানগুলি) ফিরে যেতে প্রয়োজন হতে পারে, ধরণের নরম পুনরায় সেট করুন। যেমন একটি সংযোগ-পুলে সংযোগ।

এখানে আরম্ভের দ্বিতীয় অংশটি একটি পৃথক ফাংশনে রাখা হচ্ছে, বলে ইনারাইজিশনবজেক্ট (), কর্টারে ডেকে আনা যেতে পারে।

যদি কোনও সফট রিসেট প্রয়োজন হয় তবে অবজেক্টটি বাতিল এবং পুনরায় তৈরি না করে একই ফাংশনটি পরে ডাকা যেতে পারে।


0

অন্যরা যেমন বলেছে, সাধারণত কনস্ট্রাক্টরের সূচনা করা ভাল ধারণা।

তবে, নির্দিষ্ট ক্ষেত্রে প্রয়োগ হতে পারে বা নাও পারে তার কারণ রয়েছে।

শিল্প খাত

অনেকগুলি ভাষায়, কোনও নির্মাণকারীর মধ্যে ত্রুটি সংকেত দেওয়ার একমাত্র উপায় ব্যতিক্রম বাড়াতে হয়।

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

যদি প্রকল্প / সাংগঠনিক মান ব্যতিক্রমগুলি স্যুইচ করতে হয় তবে সম্ভবত এর সর্বাধিক সাধারণ উদাহরণ সি ++ এ রয়েছে।

রাষ্ট্রযন্ত্র

এটি এমন ক্ষেত্রে যেখানে আপনি কোনও অবজেক্টকে মডেলিং করছেন যেখানে সুস্পষ্ট রাষ্ট্রীয় রূপান্তর রয়েছে। উদাহরণস্বরূপ, একটি ফাইল বা সকেট যা খোলা এবং বন্ধ করা যেতে পারে।

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

সুবিধাগুলি ত্রুটি পরিচালনা করতে যেমন উপরের হিসাবে রয়েছে তবে নির্মাণটি আরম্ভের থেকে পৃথক করার ক্ষেত্রেও একটি মামলা থাকতে পারে (বলুন যে আপনি ফাইলগুলির একটি ভেক্টর তৈরি করেন এবং এগুলি অবিচ্ছিন্নভাবে খুলুন)।

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

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