আমি কীভাবে একটি অপরিবর্তনীয় শ্রেণি তৈরি করব?


113

আমি একটি অপরিবর্তনীয় শ্রেণি তৈরির জন্য কাজ করছি।
আমি সমস্ত সম্পত্তি কেবল পঠনযোগ্য হিসাবে চিহ্নিত করেছি।

আমি ক্লাসে আইটেমের একটি তালিকা আছে।
যদিও সম্পত্তিটি কেবল পঠনযোগ্য হলে তালিকাটি সংশোধন করা যেতে পারে।

তালিকার আইনিউনামেবল এক্সপোজ করা এটিকে অনিবার্য করে তোলে।
আমি জানতে চেয়েছিলাম যে কোনও শ্রেণিটি অপরিবর্তনীয় করে তোলার জন্য একটি মৌলিক নিয়ম অনুসরণ করতে হবে?


2
আমি দৃ strongly ়ভাবে পরামর্শ দিচ্ছি যে আপনি অপরিবর্তনীয়তা সম্পর্কিত এরিক লিপার্টের ব্লগ সিরিজটি পড়ুন , বিশেষত "প্রকারের অপরিবর্তনীয়তা" এ এন্ট্রি । আপনার এই মন্তব্যটি যে "তালিকার মূল সংখ্যাটি প্রকাশের ফলে তা অপরিবর্তনীয় হয়ে যায়" আমার কাছে কিছুটা অদ্ভুত মনে হয়। এর অর্থ কি?
জন স্কিটি

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

1
এমএসডিএন এই ব্লগগুলি সংরক্ষণাগারভুক্ত করার সময় জোন স্কিটের এরিক লিপার্টের ব্লগ সিরিজের লিঙ্কগুলি ভেঙে গেছে। দয়া করে "প্রকারের অপরিবর্তনীয়তা" দেখুন । সিরিজের বাকি অংশগুলি বাম-হাতের প্যানেলে ২০০ 2007 সালের ডিসেম্বর + জানুয়ারী এর অধীনে বলে মনে হচ্ছে।
জন দো

দয়া করে কিভাবে মানুষ সাধারণভাবে পদ গুলান উপর এরিক Lippert এর ব্লগ সিরিজ atomicity, volatilityএবং immutability: পার্ট ওয়ান , পার্ট দুই , এবং পার্ট তিন । এগুলি তাঁর ব্যক্তিগত ব্লগ থেকে এবং, আমি বিশ্বাস করি, তাঁর এমএসডিএন পোস্টগুলির চেয়ে আরও নবজাতক-বান্ধব।
জন দো

উত্তর:


121

আমি মনে করি আপনি সঠিক পথে আছেন -

  • ক্লাসে ইনজেকশন করা সমস্ত তথ্য কনস্ট্রাক্টরে সরবরাহ করা উচিত
  • সমস্ত সম্পত্তি শুধুমাত্র getters হতে হবে
  • যদি কোনও সংগ্রহ (বা অ্যারে) কনস্ট্রাক্টরের কাছে পৌঁছে দেওয়া হয় তবে এটির পরে অনুলিপি করা থেকে কলারকে অনুলিপি করা উচিত
  • আপনি এটি আপনার সংগ্রহে ফিরে হয় (একটি কপি বা শুধুমাত্র-পঠনযোগ্য সংস্করণ আসতে উদাহরণস্বরূপ, ব্যবহার করতে যাচ্ছেন যদি ArrayList.ReadOnly বা অনুরূপ - আপনি পূর্ববর্তী বিন্দু সঙ্গে এই একত্রিত পারে এবং সংরক্ষণ একটি শুধুমাত্র-পঠনযোগ্য যখন ফেরত পাঠানো কপি কলাররা এটি অ্যাক্সেস করে), একজন গণককে ফিরিয়ে দিন বা অন্য কোনও পদ্ধতি / সম্পত্তি ব্যবহার করুন যা কেবলমাত্র সংগ্রহের মধ্যে পঠনযোগ্য অ্যাক্সেসের অনুমতি দেয়
  • মনে রাখবেন যে আপনার সদস্যদের মধ্যে কেউ যদি পরিবর্তনীয় হয় তবে আপনার এখনও একটি পরিবর্তনীয় শ্রেণির উপস্থিতি থাকতে পারে - যদি এটি হয় তবে আপনি যে অবস্থাটি ধরে রাখতে চান এবং পুরো পরিবর্তনীয় বস্তুগুলি ফিরিয়ে এড়াতে চান তা আপনি অনুলিপি করতে হবে, যদি না আপনি সেগুলি অনুলিপি করেন তাদের আহ্বানকারীকে ফিরিয়ে দেওয়ার আগে - আরেকটি বিকল্প হ'ল কেবল পরিবর্তনীয় অবজেক্টের অপরিবর্তনীয় "বিভাগগুলি" ফিরিয়ে দেওয়া - আমাকে এই পয়েন্টটি প্রসারিত করতে উত্সাহিত করার জন্য @ ব্রায়ান রাসমুসেনকে ধন্যবাদ

আমি কি একটি র‍্যাপার লুক প্রোপার্টি লিখব, যা আপনাকে কেবল চেহারাটিই দেয়? এবং উত্তরের জন্য ধন্যবাদ।
বিশ্বনাথ

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

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

@ ব্লেয়ার - ক্লাসে যদি আমার কাছে অভিধান থাকে যা আমি এটি সন্ধানের জন্য ব্যবহার করতে চাই। কেবলমাত্র পঠনযোগ্য সম্পত্তিটি যা ভালভাবে দেখা উচিত?
বিশ্বনাথ

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

18

অপরিবর্তনীয় হওয়ার জন্য, আপনার সমস্ত সম্পত্তি এবং ক্ষেত্রগুলি কেবল পঠনযোগ্য হওয়া উচিত। এবং যে কোনও তালিকার আইটেমগুলি নিজেরাই অপরিবর্তনীয়।

আপনি নিম্নরূপ পঠনযোগ্য তালিকা সম্পত্তি করতে পারেন:

public class MyClass
{
    public MyClass(..., IList<MyType> items)
    {
        ...
        _myReadOnlyList = new List<MyType>(items).AsReadOnly();
    }

    public IList<MyType> MyReadOnlyList
    {
        get { return _myReadOnlyList; }
    }
    private IList<MyType> _myReadOnlyList

}

1
আমি মনে করি ইমিউটেবললিস্ট আরও ভাল হবে।
কেভিন ওয়াং


আমি বিশ্বাস করছি না যে ImmutableList এই ব্যবহারের ক্ষেত্রে জন্য আপনি সুযোগ্য হল: basic rules to make a class (that contains a list) immutable। তালিকার অনুলিপিটিতে আইটেম যুক্ত করার সময় ইমট্যুয়ালিস্ট সিমেন্টিকগুলি আরও দক্ষ মেমরির ব্যবহার সক্ষম করে, তবে এটি আমার কাছে আরও নির্দিষ্ট ব্যবহারের ক্ষেত্রে বলে মনে হয়।
জো

11

এছাড়াও, মনে রাখবেন যে:

public readonly object[] MyObjects;

এটি কেবল পঠনযোগ্য কীওয়ার্ডের সাথে চিহ্নিত থাকলেও তা পরিবর্তনযোগ্য নয়। আপনি এখনও সূচক অ্যাক্সেসর দ্বারা পৃথক অ্যারে উল্লেখ / মান পরিবর্তন করতে পারেন।


5

ReadOnlyCollectionক্লাস ব্যবহার করুন । এটি System.Collections.ObjectModelনেমস্পেসে অবস্থিত ।

আপনার তালিকাটি (বা কনস্ট্রাক্টারে) ফেরত যে কোনও বিষয়ে, তালিকাটি কেবল পঠনযোগ্য সংগ্রহ হিসাবে সেট করুন।

using System.Collections.ObjectModel;

...

public MyClass(..., List<ListItemType> theList, ...)
{
    ...
    this.myListItemCollection= theList.AsReadOnly();
    ...
}

public ReadOnlyCollection<ListItemType> ListItems
{
     get { return this.myListItemCollection; }
}

1

অন্য বিকল্পটি হ'ল কোনও অভ্যন্তরীণ সংগ্রহগুলি একেবারে প্রকাশ করার পরিবর্তে দর্শনার্থীর প্যাটার্নটি ব্যবহার করা হবে।


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