কীভাবে কনস্ট্রাক্টর লিখবেন যা কোনও অবজেক্টকে সঠিকভাবে ইনস্ট্যান্ট করতে ব্যর্থ হতে পারে


12

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

obj = new Object("/home/user/foo_file")

যতক্ষণ পাথ কোনও উপযুক্ত ফাইলের দিকে নির্দেশ করে ততক্ষণ সবকিছু ঠিক আছে। তবে স্ট্রিংটি যদি বৈধ পাথ না হয় তবে জিনিসগুলি ভাঙা উচিত। কিন্তু কিভাবে?

আপনি করতে পারেন:

  1. একটি ব্যতিক্রম নিক্ষেপ
  2. নাল অবজেক্ট রিটার্ন করুন (যদি আপনার প্রোগ্রামিং ল্যাঙ্গুয়েজ কনস্ট্রাক্টরকে মান ফিরিয়ে দিতে দেয়)
  3. একটি বৈধ অবজেক্ট ফিরিয়ে দিন তবে একটি পতাকা সহ ইঙ্গিত করে যে এর পথটি সঠিকভাবে সেট করা হয়নি (উগ)
  4. অন্যান্য?

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

আপনার পছন্দসই প্রোগ্রামিং ভাষায় আপনি কীভাবে এই সমস্যাটি পরিচালনা করবেন এবং কীভাবে ব্যাখ্যা করবেন তা দেখাতে পারেন?


1
জাভা ব্যতিক্রমগুলি এটিকে পরিচালনা করার এক উপায়।
মাহমুদ হোসাম

সি ++ কনস্ট্রাক্টররা ফিরে না void- তারা কোনও বস্তু ফেরত দেয়।
গ্যাবলিন

6
@ গ্যাবলিন: আসলে, এটিও কঠোরভাবে সত্য নয়। মেমরি বরাদ্দ newকল operator new, তারপরে এটি পূরণের জন্য নির্মাণকারী। কনস্ট্রাক্টর কিছুই ফিরিয়ে দেয় না এবং newযে পয়েন্টারটি পেয়েছিল তা ফেরত দেয় operator newvoidযদিও " কিছু" প্রত্যাবর্তন করে না "বোঝায়" রিটার্নগুলি "গ্র্যাবস-এর জন্য রয়েছে।
জন পুর্ডি

@ জন পুরী: এইচএম, যুক্তিসঙ্গত মনে হচ্ছে। ভাল কল.
গ্যাবলিন

উত্তর:


8

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

উদাহরণস্বরূপ (সি # তে):

public Sprite
{
    public Sprite(string filename)
    {
    }
}

যদি ব্যবহারকারী সরাসরি ফাইলটি লোড করতে না চান তবে কী হবে? তারা যদি ফাইলটি অন-ডিমান্ড ক্যাশে করতে চান তবে কী হবে? তারা পারে না। আপনি bool loadFileকনস্ট্রাক্টারে একটি যুক্তি রাখার কথা ভাবতে পারেন তবে ফাইলটি লোড করার জন্য আপনার এখনও একটি Load()পদ্ধতির প্রয়োজন হওয়ায় এটি এই অগোছালো হয়ে পড়ে ।

বর্তমান দৃশ্যের পরিপ্রেক্ষিতে ক্লাসের ব্যবহারকারীদের এটি করার জন্য এটি আরও নমনীয় এবং পরিষ্কার হতে চলেছে:

Sprite sprite = new Sprite();
sprite.Load("mario.png");

অথবা বিকল্পভাবে (সংস্থার মতো কোনও কিছুর জন্য):

Sprite sprite = new Sprite();
sprite.Source = "mario.png";
sprite.Cache();

// On demand caching of file contents.
public void Cache()
{
     if (image == null)
     {
         try
         {
             image = new Image.FromFile(Source);
         }
         catch(...)
         {
         }
     }
}

আপনার ক্ষেত্রে যদি লোড (..) ব্যর্থ হয়, আমাদের সম্পূর্ণ অকেজো বস্তু রয়েছে। আমি নিশ্চিত নই যে আমি কোনও স্প্রিট ছাড়াই স্প্রিট চাই ... তবে প্রশ্নটি সত্যিকারের প্রশ্নের চেয়ে পবিত্র উপাস্যর মতো মনে হচ্ছে :)
অ্যাভটোমেটন

7

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

স্কালায়, আপনি একটি কারখানা পদ্ধতি থেকে একটি বিকল্প [ফু] ফিরিয়ে দিতে পারেন। এটি জাভাতেও কাজ করবে, তবে আরও জটিল হবে।


। নেট ভাষায়ও ব্যতিক্রম বা কারখানা ব্যবহার করা Using
বেথ হোয়াইটেল

3

একটি ব্যতিক্রম নিক্ষেপ।

আপনি যদি এটি ফিরিয়ে দিতে পারেন তবে নালকে পরীক্ষা করা দরকার (এবং এটির জন্য এটি পরীক্ষা করা হবে না)

এটি যাচাই করা ব্যতিক্রমগুলি। আপনি জানেন যে এটি ব্যর্থ হতে পারে। কলকারীদের এটি পরিচালনা করতে হবে।


3

ইন সি ++ , কনস্ট্রাকটর ক্লাসের / আরম্ভ সদস্যদের তৈরি করতে ব্যবহার করা হয়।

এই প্রশ্নের সঠিক উত্তর নেই । তবে আমি এখন পর্যন্ত যা পর্যবেক্ষণ করেছি তা হ'ল বেশিরভাগ সময় হ'ল ক্লায়েন্ট (বা যে কেউ আপনার এপিআই ব্যবহার করতে চলেছে) যারা আপনাকে এই জিনিসগুলি কীভাবে পরিচালনা করতে হবে তা চয়ন করে।

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

যদি আচরণটি বেছে নেওয়ার বিষয়টি আপনার উপর নির্ভর করে তবে ব্যতিক্রমগুলি হ্যান্ডল করার জন্য ব্যতিক্রমগুলি হ'ল ডিফল্ট সি ++ উপায় এবং আপনি যখন পারেন তখন এগুলি ব্যবহার করা উচিত।


1

আপনি কোনও পরামিতি ছাড়াই বা কেবলমাত্র পরামিতিগুলি যা কখনই ব্যর্থ হয় না তা দিয়ে ইনস্ট্যান্ট করতে পারেন এবং তারপরে আপনি একটি সূচনা ফাংশন বা পদ্ধতি ব্যবহার করেন যা থেকে আপনি নিরাপদে কোনও ব্যতিক্রম ছুঁড়ে ফেলতে পারেন বা যা ইচ্ছা তা করতে পারেন।


6
আমি মনে করি যে একটি অব্যর্থ অবজেক্টের জন্য প্রত্যাবর্তন করা দরকার যা আরও প্রাথমিককরণ প্রয়োজন সবচেয়ে খারাপ পছন্দ। এখন আপনার কাছে একাধিক-লাইনের খণ্ড রয়েছে যা ক্লাসটি ব্যবহার করার সাথে সাথে অনুলিপি করতে হবে বা কোনও নতুন পদ্ধতিতে ফ্যাক্টর করা উচিত। আপনার পাশাপাশি কন্সট্রাক্টর সমস্ত কাজ করতে পারেন এবং যদি অবজেক্টটি নির্মাণ না করা যায় তবে একটি ব্যতিক্রম ছুঁড়ে ফেলতে পারেন।
কেভিন ক্লিন

2
@ কেভিন: অবজেক্টের উপর নির্ভর করে। ব্যর্থতা সম্ভবত বাহ্যিক সংস্থার কারণে হবে যাতে কোনও সত্তা অভিপ্রায়টি (যেমন ফাইলের নাম) নিবন্ধিত করতে পারে তবে পুনরাবৃত্তি প্রচেষ্টা সম্পূর্ণরূপে আরম্ভ করার অনুমতি দেয়। একটি মান অবজেক্টের জন্য আমি সম্ভবত কোনও ত্রুটিটি অন্তর্নিহিত ত্রুটি ক্যাপচার করতে পারে এমন প্রতিবেদনের দিকে ঝুঁকছি, সুতরাং সম্ভবত একটি (মোড়ানো?) ব্যতিক্রম ছোঁড়া।
ডেভ

-4

আমি কনস্ট্রাক্টরের কোনও ক্লাস বা তালিকা আরম্ভ না করাকে পছন্দ করি। আপনার যখনই প্রয়োজন বর্গ বা তালিকা শুরু করুন। যেমন।

public class Test
{
    List<Employee> test = null;
}

এটি করবেন না

public class Test
{
    List<Employee> test = null;

    public Test()
    {
        test = new List<Employee>();
    }
}

পরিবর্তে যখন প্রয়োজন উদয় সূচনা।

public class Test
{
    List<Employee> emp = null;

    public Test()
    { 
    }

    public void SomeFunction()
    {
         emp = new List<Employee>();
    }
}

1
এটি খারাপ পরামর্শ। আপনার অবজেক্টগুলিকে অবৈধ অবস্থায় থাকতে দেওয়া উচিত নয়। কনস্ট্রাক্টর এর জন্য এটি। আপনার যদি জটিল যুক্তি প্রয়োজন তবে কারখানার প্যাটার্নটি ব্যবহার করুন।
অ্যালেক্সফক্সগিল

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