কোন পর্যায়ে অপরিবর্তনীয় শ্রেণি বোঝা হয়ে যায়?


16

যখন আমি পড়েছি আপনার ডেটা মডেলটি ধরে রাখার জন্য ক্লাসগুলি ডিজাইন করার সময় তা অপরিবর্তনীয় বস্তু তৈরি করা কার্যকর হতে পারে তবে কনস্ট্রাক্টর প্যারামিটারের তালিকা এবং গভীর কপিগুলির বোঝাটি কী পরিমাণে বেশি হয়ে যায় এবং আপনাকে অপরিবর্তনীয় বাধাটি পরিত্যাগ করতে হবে?

উদাহরণস্বরূপ, একটি নামকৃত জিনিসের প্রতিনিধিত্ব করার জন্য এখানে একটি অপরিবর্তনীয় শ্রেণি রয়েছে (আমি সি # সিনট্যাক্স ব্যবহার করছি তবে নীতিটি সমস্ত ওও ভাষার ক্ষেত্রে প্রযোজ্য)

class NamedThing
{
    private string _name;    
    public NamedThing(string name)
    {
        _name = name;
    }    
    public NamedThing(NamedThing other)
    {
         this._name = other._name;
    }
    public string Name
    {
        get { return _name; }
    }
}

নামযুক্ত জিনিসগুলি নতুন নতুন জিনিসগুলিতে তৈরি, অনুসন্ধান এবং অনুলিপি করা যেতে পারে তবে নামটি পরিবর্তন করা যায় না।

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

যদি ক্লাসে অন্যান্য জটিল ক্লাসগুলি সমন্বিত বৈশিষ্ট্য এবং সংগ্রহ থাকতে পারে তবে এটি আমার কাছে মনে হয় কনস্ট্রাক্টর প্যারামিটারের তালিকাটি একটি দুঃস্বপ্ন হয়ে উঠবে।

সুতরাং কোন মুহূর্তে কোন শ্রেণি অপরিবর্তনীয় হতে খুব জটিল হয়ে ওঠে ?


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

1
আপনি এই প্রশ্নে প্রস্তাবিত বিল্ডার প্যাটার্নটি দেখতে পারেন: stackoverflow.com/questions/1304154/…
পিঁপড়া

আপনি কি মেম্বারওয়াই ক্লোনকে দেখেছেন? আপনাকে প্রতিটি নতুন সদস্যের জন্য অনুলিপি নির্মাণকারীর আপডেট করতে হবে না।
কেভিন

3
@ টনি যদি আপনার সংগ্রহগুলি এবং সেগুলিতে থাকা সমস্ত কিছু অপরিবর্তনীয় হয় তবে আপনার গভীর অনুলিপি লাগবে না, অগভীর অনুলিপি যথেষ্ট।
mjcopple

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

উত্তর:


23

এগুলি কখন বোঝা হয়ে যায়? খুব দ্রুত (বিশেষত যদি আপনার পছন্দের ভাষা অপরিবর্তনীয়তার জন্য পর্যাপ্ত সিনট্যাকটিক সহায়তা সরবরাহ করে না))

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

ছোট অ-জটিল শ্রেণীর সমস্ত কিছুর মডেল করা সম্ভব নয় arily এত বড় ক্লাস এবং কাঠামো জন্য, আমরা কৃত্রিমভাবে তাদের পার্টিশন - না, কারণ যে আমাদের ডোমেইন মডেল জ্ঞান করে তোলে, কিন্তু তাদের জটিল ইনস্ট্যান্স এবং কোডে বিল্ডার সঙ্গে মোকাবিলা করার জন্য, কারণ আমরা আছে।

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

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

ছোট, সম্ভবত একক জিনিসগুলি পরিবর্তনহীন করা যায় can আরো জটিল ব্যাপার অপরিবর্তনীয় তৈরি করা যেতে পারে যখন এটা জ্ঞান করে তোলে । তবে অপরিবর্তনীয়তা রৌপ্য বুলেট নয়। ত্রুটিগুলি হ্রাস করার ক্ষমতা, স্কেলাবিলিটি এবং কর্মক্ষমতা বাড়ানোর ক্ষমতা, এগুলি অপরিবর্তনীয়তার একমাত্র কাজ নয়। এটি যথাযথ ইঞ্জিনিয়ারিং অনুশীলনের একটি ফাংশন । সর্বোপরি, লোকেরা অপরিবর্তনীয়তা ছাড়াই ভাল, স্কেলেবল সফ্টওয়্যার লিখেছিল।

অপ্রয়োজনীয়তা একটি ভারী হয়ে ওঠে সত্যিই দ্রুত (এটি দুর্ঘটনাজনিত জটিলতায় যোগ করে) যদি এটি কোনও কারণ ছাড়াই করা হয়, যখন এটি কোনও ডোমেন মডেলের প্রসঙ্গে বিবেচনা করে তা বোঝায়।

আমি, একের জন্য, এটি এড়াতে চেষ্টা করি (যদি না আমি এর জন্য ভাল সিনট্যাকটিক সমর্থন সহ একটি প্রোগ্রামিং ভাষায় কাজ করি না working)


6
লুইস, আপনি কী খেয়াল করেছেন যে সরল অথচ সাউন্ড ইঞ্জিনিয়ারিং নীতিগুলির ব্যাখ্যা দিয়ে ভালভাবে লেখা, বাস্তবিকভাবে সঠিক উত্তরগুলি কীভাবে স্টেট-অফ-দ্য আর্ট কোডিং ফ্যাডগুলি ব্যবহার করে তার বেশি ভোট পাবে না? এটি একটি দুর্দান্ত, দুর্দান্ত উত্তর।
হুপার্নিকেটেস

3
ধন্যবাদ :) আমি রেপ ট্রেন্ডগুলি নিজেই লক্ষ্য করেছি, কিন্তু ঠিক আছে। ফ্যাড ফ্যানবয়েস মন্থন কোড যা আমরা পরে আরও ভাল প্রতি ঘন্টার হারে মেরামত করতে পারি,
হাহাহ

4
রুপালি বুলেট? কোন। সি # / জাভাতে কিছুটা বিশ্রী লাগবে না (এটি আসলে এতটা খারাপ নয়)? একেবারে। এছাড়াও, অপরিবর্তনীয়তায় মাল্টিকোরের ভূমিকাটি বেশ সামান্য ... আসল উপকারটি যুক্তি স্বাচ্ছন্দ্য।
মৌরিসিও শেফার

@ মৌরিসিও - আপনি যদি তাই বলেন (জাভাতে অপরিবর্তনীয়তা এতটা খারাপ নয়)। ১৯৯৯ সাল থেকে ২০১১ সাল পর্যন্ত জাভাতে কাজ করার পরে, আমি আলাদা হতে অনুরোধ করব, এটি সাধারণ কোড বেসগুলিতে তুচ্ছ ছাড় নয়। তবে, লোকদের বিভিন্ন অভিজ্ঞতা রয়েছে এবং আমি স্বীকার করি যে আমার পিওভ সাবজেক্টিভিটি থেকে মুক্ত নয়। সুতরাং দুঃখিত, সেখানে একমত হতে পারে না। অপরিবর্তনীয়তার বিষয়টি যখন আসে তখন আমি যুক্তিটির সহজতাকে সবচেয়ে গুরুত্বপূর্ণ বিষয় বলে সম্মত করি না।
luis.espinal

13

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

অবশেষে আমি সেই নীতিটি পরিবর্তনযোগ্য অবজেক্টগুলিতে অপরিবর্তনীয় ইন্টারফেসের সাথে প্রতিস্থাপন করেছি।

class NamedThing : INamedThing
{
    private string _name;    
    public NamedThing(string name)
    {
        _name = name;
    }    

    public NamedThing(NamedThing other)
    {
        this._name = other._name;
    }

    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }
}

interface INamedThing
{
    string Name { get; }
}

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


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

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

1
@ অ্যারোনট: একইভাবে IComparable<T>গ্যারান্টি দেয় যে যদি X.CompareTo(Y)>0এবং তবে Y.CompareTo(Z)>0, তবে X.CompareTo(Z)>0ইন্টারফেসে চুক্তি রয়েছে । যদি চুক্তিটি IImmutableList<T>নির্দিষ্ট করে যে কোনও জিনিস বাইরের বিশ্বের সামনে প্রকাশের আগে সমস্ত আইটেম এবং বৈশিষ্ট্যের মানগুলি "পাথরের মধ্যে সেট" করা আবশ্যক, তবে সমস্ত বৈধ বাস্তবায়ন তা করবে। কিছুই IComparableবাস্তবায়নের লঙ্ঘন থেকে কোনও প্রয়োগকে বাধা দেয় না , তবে এর মাধ্যমে বাস্তবায়ন অবৈধ। যদি SortedDictionaryকোনও অবৈধ দেওয়া হলে কোনও ত্রুটি হয় IComparable...,
সুপারক্যাট

1
@Aaronaught: আমি কেন বিশ্বাস করা উচিত যে বাস্তবায়নের IReadOnlyList<T>অপরিবর্তনীয় থাকবে প্রদত্ত যে (1) কোন ধরনের প্রয়োজন ইন্টারফেস ডকুমেন্টেশনে (2) সবচেয়ে সাধারণ বাস্তবায়ন বলা, এবং, List<T>, শুধুমাত্র পাঠযোগ্য এমনকি নয় ? আমি আমার শর্তাবলী সম্পর্কে দ্ব্যর্থক কি স্পষ্ট তা নয়: এর মধ্যে থাকা ডেটা পড়তে পারলে একটি সংগ্রহ পাঠযোগ্য। এটি কেবলমাত্র পঠনযোগ্য যদি এটি প্রতিশ্রুতি দিতে পারে যে উপস্থিত কোনও ডেটা পরিবর্তন করা যাবে না যদি না কোনও বাহ্যিক রেফারেন্স কোড দ্বারা রাখা হয় যা এটি পরিবর্তন করবে। এটি পরিবর্তনযোগ্য যদি এটি গ্যারান্টি দিতে পারে যে এটি পর্যায়ক্রমে পরিবর্তন করা যায় না।
সুপারক্যাট

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

8

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

নোট করুন যে খুব জটিল শ্রেণি বা একটি দীর্ঘ পদ্ধতির প্যারামিটার তালিকা হ'ল অপরিবর্তনীয়তা নির্বিশেষে ডিজাইনের গন্ধগুলি se

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


5

যদি আপনি আপনার অনির্বচনীয় ক্ষেত্রগুলি একটি অভ্যন্তরে সংরক্ষণ করেন তবে অনুলিপি সমস্যাটি এড়াতে পারবেন struct। এটি মূলত স্মৃতিসৌধের এক ধরণের পরিবর্তন ation তারপরে আপনি যখন একটি অনুলিপি তৈরি করতে চান, কেবল স্মৃতিচিহ্নটি অনুলিপি করুন:

class MyClass
{
    struct Memento
    {
        public int field1;
        public string field2;
    }

    private readonly Memento memento;

    public MyClass(int field1, string field2)
    {
        this.memento = new Memento()
            {
                field1 = field1,
                field2 = field2
            };
    }

    private MyClass(Memento memento) // for copying
    {
        this.memento = memento;
    }

    public int Field1 { get { return this.memento.field1; } }
    public string Field2 { get { return this.memento.field2; } }

    public MyClass WithNewField1(int newField1)
    {
        Memento newMemento = this.memento;
        newMemento.field1 = newField1;
        return new MyClass(newMemento);
    }
}

আমি মনে করি অভ্যন্তরীণ কাঠামো প্রয়োজনীয় নয়। এটি মেম্বারওয়াই ক্লোন করার আরও একটি উপায়।
কোডিজম

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

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

... এটি পরিবর্তনীয় ডেটা হোল্ডারদের পক্ষে খুব কার্যকর হতে পারে। পদ্ধতির "সমান্তরাল" পরিবর্তনযোগ্য এবং অপরিবর্তনীয় শ্রেণিগুলি (একটি বিমূর্ত "পাঠযোগ্য" বেস থেকে প্রাপ্ত) এবং তাদের নির্মাতারা একে অপরের থেকে ডেটা অনুলিপি করতে সক্ষম হওয়া খুব সহজ করে তোলে।
সুপারক্যাট

3

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

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

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

myList = lists:append([[1,2,3], [4,5,6]])
% myList is now [1,2,3,4,5,6]

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


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

0

যদি আপনার একাধিক চূড়ান্ত শ্রেণীর সদস্য থাকে এবং না চান যে এগুলি তৈরি করতে হবে এমন সমস্ত বস্তুর সংস্পর্শে আসে, আপনি বিল্ডার প্যাটার্নটি ব্যবহার করতে পারেন:

class NamedThing
{
    private string _name;    
    private string _value;
    private NamedThing(string name, string value)
    {
        _name = name;
        _value = value;
    }    
    public NamedThing(NamedThing other)
    {
        this._name = other._name;
        this._value = other._value;
    }
    public string Name
    {
        get { return _name; }
    }

    public static class Builder {
        string _name;
        string _value;

        public void setValue(string value) {
            _value = value;
        }
        public void setName(string name) {
            _name = name;
        }
        public NamedThing newObject() {
            return new NamedThing(_name, _value);
        }
    }
}

সুবিধাটি হ'ল আপনি সহজেই একটি পৃথক নামের পৃথক মান সহ একটি নতুন অবজেক্ট তৈরি করতে পারেন।


আমি মনে করি যে আপনার নির্মাতা স্থির হওয়া সঠিক নয়। আপনি সেট করার পরে অন্য থ্রেড স্থির নাম বা স্থির মান পরিবর্তন করতে পারে তবে আপনি কল করার আগে newObject
এরিক

শুধুমাত্র বিল্ডার শ্রেণি স্থির, তবে এর সদস্যরা নয়। এর অর্থ হ'ল আপনি যে প্রতিটি বিল্ডার তৈরি করেন তাদের পক্ষে তাদের নিজস্ব সেট রয়েছে যার সাথে মান রয়েছে। শ্রেণিটি স্থিতিশীল হওয়া দরকার যাতে এটি ব্যবহার করে NamedThing
ধারণক্ষম

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

1
@ স্যালান্দুর সি # তে অন্তর্বর্তী ক্লাস সবসময় জাভা অভ্যন্তরীণ বোধে "স্থিতিশীল" থাকে।
সেবাস্তিয়ান রেডল

0

সুতরাং কোন মুহূর্তে কোন শ্রেণি অপরিবর্তনীয় হতে খুব জটিল হয়ে ওঠে?

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

ধারাবাহিক ডেটা স্ট্রাকচারস

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

সস্তা কপি

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

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

বোঝা

বোঝা হিসাবে, আমার ক্ষেত্রে অন্তত একটি তাত্ক্ষণিক আছে। আমার দরকার সেই বিল্ডাররা লোকেদের সম্পর্কে বা "স্থানান্তরকারীদের" কথা বলছে কারণ আমি তাদের বলি যে এটি বিশালভাবে ডেটা স্ট্রাকচারকে স্পর্শ না করেই কার্যকরভাবে রূপান্তর প্রকাশ করতে সক্ষম হতে। এর মতো কোড:

void transform_stuff(MutList<Stuff>& stuff, int first, int last)
{
     // Transform stuff in the range, [first, last).
     for (; first != last; ++first)
          transform(stuff[first]);
}

... তাহলে এভাবে লিখতে হবে:

ImmList<Stuff> transform_stuff(ImmList<Stuff> stuff, int first, int last)
{
     // Grab a "transient" (builder) list we can modify:
     TransientList<Stuff> transient(stuff);

     // Transform stuff in the range, [first, last)
     // for the transient list.
     for (; first != last; ++first)
          transform(transient[first]);

     // Commit the modifications to get and return a new
     // immutable list.
     return stuff.commit(transient);
}

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

ব্যতিক্রম-সুরক্ষা বা ত্রুটি পুনরুদ্ধার

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

আপনি যদি আসল মিউটেশন ফাংশনটি ব্যতিক্রম-নিরাপদ করতে চান তবে তার জন্য রোলব্যাক যুক্তি প্রয়োজন, যার জন্য সহজতম বাস্তবায়নের জন্য পুরো তালিকাটি অনুলিপি করা দরকার :

void transform_stuff(MutList<Stuff>& stuff, int first, int last)
{
    // Make a copy of the whole massive gigabyte-sized list 
    // in case we encounter an exception and need to rollback
    // changes.
    MutList<Stuff> old_stuff = stuff;

    try
    {
         // Transform stuff in the range, [first, last).
         for (; first != last; ++first)
             transform(stuff[first]);
    }
    catch (...)
    {
         // If the operation failed and ran into an exception,
         // swap the original list with the one we modified
         // to "undo" our changes.
         stuff.swap(old_stuff);
         throw;
    }
}

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

আপনি যখন ব্যতিক্রম-নিরাপদ থাকতে চান এবং আপনার অ্যাপ্লিকেশনটি ক্রাশ এবং জ্বলিত না করে নিখুঁতভাবে ত্রুটিগুলি থেকে পুনরুদ্ধার করতে চান, তখন আপনাকে কোনও ত্রুটি / ব্যতিক্রম ঘটলে কোনও ক্রিয়াকলাপ ঘটাতে পারে এমন কোনও পার্শ্ব প্রতিক্রিয়াগুলি পূর্বাবস্থায়িত / পূর্বাবস্থায় ফিরিয়ে আনতে হবে। এবং সেখানে নির্মাতা আসলে কম্পিউটারের সময় সহ তার চেয়ে বেশি প্রোগ্রামার সময় বাঁচাতে পারে কারণ: ...

কোনও ফাংশনে পিছনে পার্শ্ব প্রতিক্রিয়াগুলি ঘূর্ণায়মান হওয়ার বিষয়ে আপনাকে চিন্তা করার দরকার নেই!

সুতরাং ফিরে মূল প্রশ্ন:

কোন পর্যায়ে অপরিবর্তনীয় শ্রেণি বোঝা হয়ে যায়?

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

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

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