একটি "শুরু", "রান" বা "চালানো" পদ্ধতিটি কি একটি ভাল অনুশীলন?


30

আমি বর্তমানে একটি কোড বেস নিয়ে কাজ করছি যার অনেক ক্লাস রয়েছে যা একটি স্টার্ট পদ্ধতি প্রয়োগ করে। এটি আমার কাছে দ্বি-পর্বের নির্মাণের মতো বলে মনে হয়, যা আমি সবসময় খারাপ অভ্যাস হিসাবে বিবেচনা করেছি। আমি এই এবং একটি নির্মাণকারীর মধ্যে পার্থক্য বলতে পারি না।

সাধারণ অবজেক্ট নির্মাণের পরিবর্তে শুরু করার পদ্ধতিটি ব্যবহার করা কখন উপযুক্ত?

আমি কখন কনস্ট্রাক্টর ব্যবহার করতে পছন্দ করব?

সম্পাদনা: আমি মনে করি না যে এটি প্রাসঙ্গিক তবে প্রোগ্রামিং ভাষাটি সি #, এটি জাভা বা সি ++ তে সমানভাবে প্রয়োগ হতে পারে


3
আপনি কি আরও কিছু প্রসঙ্গ যুক্ত করতে পারেন? ভাষা? থ্রেডড বনাম এক থ্রেড? startআর কনস্ট্রাক্টরের মধ্যে পার্থক্য ? ইত্যাদি ...

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

2
উদাহরণস্বরূপ @DaveHillier মধ্যে Perl এটা প্রমাণ অভ্যাস (এবং একটি ভাল এক) একজন থাকতে হয় initকিছু বাছাই বাহিরে পদ্ধতি newফাংশন - perldoc.perl.org/perlobj.html । একটি ভাষার আইডিয়মগুলি সেখানে অন্য ভাষাতে ভাল কাজ করতে পারে।

1
Startসাধারণ এপিআইতে পদ্ধতি সহ শ্রেণীর উদাহরণগুলির মধ্যে থ্রেড এবং স্টপওয়াচ অন্তর্ভুক্ত।
লুস্কুবাল

1
আপনি আসলে যা জিজ্ঞাসা করছেন তা বোঝার জন্য যাদের একটি কোডের নমুনা দরকার তাদের মধ্যে আমাকে গণনা করুন।
ব্যবহারকারী16764

উত্তর:


44

একটি Start()পদ্ধতি (মত Run(), Execute()বা অনুরূপ কিছু) উপযুক্ত যখন বস্তুর নির্মাণের খরচ কম, কিন্তু খরচ ব্যবহার এটা উচ্চ। উদাহরণস্বরূপ: একটি শ্রেণি যা সেরা-পাথ-অপটিমাইজেশন অ্যালগরিদমকে মোড়ক করে। এটি পরামিতিগুলির একটি সেট ( Xস্কোয়ার দ্বারা Yবর্গক্ষেত্র, সুচান্দসুক মূল্যায়ন পদ্ধতি সহ) সেট আপ করা তুচ্ছ , তবে এটি কার্যকর করতে কিছুটা সময় নিতে পারে। আপনি যদি এই 20 টি অবজেক্ট তৈরি করতে চান তবে সমস্তগুলি তৈরি না হওয়া পর্যন্ত আপনি কার্যকর করতে বিলম্ব করতে চাইতে পারেন - উদাহরণস্বরূপ, এগুলি আপনাকে আরও সহজ করে তুলতে দেয়।

বিকল্পভাবে, এটি কার্যকর হতে পারে যখন আপনি জানেন না যে কখন কখন অবজেক্টটি শুরু করা দরকার হবে - সম্ভবত কারণ এটি ব্যবহারকারীর ইনপুট বা যুক্তির উপর ভিত্তি করে যা সম্ভাবনার তালিকা থেকে বাছাই করে।

এটি অবশ্যই ধরে নিয়েছে যে Start()এটি বস্তুটির দরকারী পদ্ধতি এবং কোনও Initialize()পদ্ধতির সমতুল্য নয় । যদি এটি আরও পরামিতি সেট করার অতিরিক্ত উপায় হয় তবে এটির অস্তিত্ব থাকা উচিত নয়।


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

50

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

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


16
একটি ভাল উপমা। এটি লক্ষণীয় যে এটি Start()অন ​​/ অফ সুইচ (লাইটউইচের মতো) এর সাথে সামঞ্জস্য করতে পারে যা একটি Stop()বা একটি পুশ-বোতামের (একটি অনুলিপি মেশিনে প্রিন্ট বোতামের মতো) থাকা উচিত যেখানে এটি কিক করে এবং তারপরে শেষ না হওয়া পর্যন্ত চলে।
ববসন

3
+1 ভাল বলেছেন এবং পি.এসইতে স্বাগতম, এর মতো উত্তরগুলি দুর্দান্ত শুরু।
জিমি হোফা 16

14

আপনি অলস সূচনা ব্যবহার করতে পারেন

কম্পিউটার প্রোগ্রামিংয়ে, অলস সূচনাটি কোনও জিনিস তৈরিতে বিলম্ব করার কৌশল, একটি মান গণনা, বা অন্য কোনও ব্যয়বহুল প্রক্রিয়াটি প্রথমবারের প্রয়োজন হওয়া পর্যন্ত।

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

ব্যয়বহুল সূচনাটি প্রথম প্রয়োজন হওয়া পর্যন্ত বিলম্ব করুন ..

উদাহরণ:

public class FooClass{

    private ExpensiveResource resource;
    private CheapResource cheap;

    public  FooClass(String someParameter){
        // constructor: initialize CheapResource cheap 
            // but NOT ExpensiveResource resource
    }

    public ExpensiveResource getExpensiveResource(){
        if (resource == null) {
            this.initializeExpensiveResource();     
        }
        return this.resource
    }

    public String getExpensiveResourceName(){
        if (resource == null) {
            this.initializeExpensiveResource();     
        }
        return this.resource.getName();
    }   

    public CheapResource getCheapResource(){
        return this.cheap;
    }

    private initializeExpensiveResource(){
        // do expensive initialization of field "resource"
    }

}

public class Test{
    public static void main (String args[]){

        FooClass foo = new FooClass("some string");
        CheapResource cr = foo.getCheapResource();
        String s = foo.getExpensiveResourceName(); 
          // just now is the expensive resource initialized

    }
}

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

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