যখন কোনও সহানুভূতি না থাকে তখন কি অপরিবর্তনশীলতা খুব সার্থক?


53

দেখে মনে হয় যে থ্রেড-সুরক্ষা সর্বদা / প্রায়শই অপরিবর্তনীয় ধরণের এবং বিশেষত সংগ্রহগুলি ব্যবহারের প্রধান সুবিধা হিসাবে উল্লেখ করা হয়।

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

তবে আমি নিশ্চিত নই যে কোনও নতুন প্যাকেজের (মাইক্রোসফ্ট ইমিউটেবল কালেকশন) নির্ভরতা যুক্ত করা উপযুক্ত কিনা। পারফরম্যান্সও বড় বিষয় নয়।

সুতরাং আমি অনুমান করি যে আমার প্রশ্নটি হ'ল যখন শক্ত কর্ম সম্পাদনের প্রয়োজনীয়তা নেই এবং থ্রেড সুরক্ষা সংক্রান্ত কোনও সমস্যা নেই তখন কি অপরিবর্তনীয় সংগ্রহগুলি দৃ strongly ়ভাবে পরামর্শ দেওয়া হয়? সেই মান শব্দার্থবিজ্ঞানের কথা বিবেচনা করুন (আমার উদাহরণ হিসাবে) সম্ভবত প্রয়োজনও বা নাও হতে পারে।


1
একযোগে পরিবর্তনের অর্থ থ্রেডের দরকার নেই। কেবলমাত্র যথাযথভাবে নামকরণটি দেখুন ConcurrentModificationExceptionযা সাধারণত একই থ্রেডে সংগ্রহ একই রূপের সংগ্রহের foreachপরিবর্তে একই সংগ্রহের উপরে একটি লুপের শরীরে ঘটে ।

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

13
হতে পারে আপনার নিজের বিপরীত প্রশ্নও জিজ্ঞাসা করা উচিত: কখন পরিবর্তনের সার্থকতা রয়েছে?
জর্জিও

2
জাভাতে, যদি পরিবর্তনীয়তা প্রভাবিত হয় hashCode()বা equals(Object)ফলাফল পরিবর্তিত হয়, এটি ব্যবহার করার সময় ত্রুটি ঘটতে পারে Collections(উদাহরণস্বরূপ, HashSetকোনও বস্তুতে একটি "বালতি" সংরক্ষণ করা হয়েছিল এবং পরিবর্তনের পরে এটি অন্যটিতে যেতে হবে)।
এসজেউন 76

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

উত্তর:


101

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

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


23
+1 টি concurrency যুগপত পরিব্যক্তি, কিন্তু পরিব্যক্তি সময়ের ছড়িয়ে সম্পর্কে কারণ শুধু হার্ড হিসাবে হতে পারে
guillaume31

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

29
@ মেহরদাদ মানুষ কয়েক দশক ধরে সমাবেশে বিশাল কর্মসূচিও ছড়িয়ে দিয়েছিল। তারপরে আমরা কয়েক দশক সি এর কাজটি করেছি
ডোভাল

11
@ মেহরদাদ যখন বস্তু বড় হয় তখন পুরো বস্তুগুলি অনুলিপি করা ভাল বিকল্প নয়। আমি কেন দেখছি না কেন ক্রমটির ক্রমটি উন্নতির সাথে জড়িত। আপনি কেবল উত্পাদনশীলতায় 20% উন্নতি (দ্রষ্টব্য: স্বেচ্ছাসেবী সংখ্যা) সরিয়ে দেবেন কারণ এটি ট্রিপল-ডিজিটের উন্নতি হয়নি? অপরিচ্ছন্নতা একটি বুদ্ধিমান ডিফল্ট ; আপনি এটি থেকে বিপথগামী করতে পারেন , তবে আপনার একটি কারণ প্রয়োজন।
ডোভাল

9
@ জর্জিও স্কালা আমাকে বুঝতে পেরেছিল যে কতটা কম সময়ে আপনার এমনকি কোনও মানকে পরিবর্তনযোগ্যও করা দরকার। যখনই আমি এই ভাষাটি ব্যবহার করি, আমি সবকিছুকে একটি করে তুলি valএবং খুব খুব বিরল অনুষ্ঠানে আমি খুঁজে পাই যে আমার কোনও কিছুকে একটিতে রূপান্তর করা দরকার var। আমি প্রদত্ত যে কোনও ভাষাতে প্রচুর 'ভেরিয়েবল' সংজ্ঞায়িত করেছি সেখানে কেবল এমন একটি মান রাখতে হবে যা কিছু গণনার ফলাফল সংরক্ষণ করে, এবং আপডেট করার দরকার নেই।
কেচালাক্স

22

আপনার কোড আপনার উদ্দেশ্য প্রকাশ করা উচিত। আপনি যদি একবার তৈরি না করে কোনও বস্তুর সংশোধন করতে চান তবে এটি সংশোধন করা অসম্ভব করে দিন।

অপরিচ্ছন্নতার বিভিন্ন সুবিধা রয়েছে:

  • মূল লেখকের অভিপ্রায়টি আরও ভালভাবে প্রকাশ করা হয়।

    আপনি কীভাবে জানতে পারবেন যে নিম্নলিখিত কোডটিতে নাম পরিবর্তন করে অ্যাপ্লিকেশনটি পরে কোথাও একটি ব্যতিক্রম ঘটায়?

    public class Product
    {
        public string Name { get; set; }
    
        ...
    }
    
  • এটি নিশ্চিত করা আরও সহজ যে বিষয়টি অবৈধ অবস্থায় উপস্থিত হবে না।

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

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

  • Concurrency।

যাইহোক, আপনার ক্ষেত্রে, আপনার কোনও তৃতীয় পক্ষের প্যাকেজ দরকার নেই। .NET ফ্রেমওয়ার্ক ইতিমধ্যে একটি ReadOnlyDictionary<TKey, TValue>বর্গ অন্তর্ভুক্ত ।


1
+1, বিশেষত "আপনাকে এটি কোনও কনস্ট্রাক্টরে নিয়ন্ত্রণ করতে হবে এবং কেবল সেখানে।" আইএমও এটি একটি বিশাল সুবিধা।
জর্জিও

10
আরেকটি সুবিধা: কোনও বিষয় অনুলিপি করা বিনামূল্যে। শুধু একটি পয়েন্টার।
রবার্ট গ্রান্ট

1
@ মাইনমা ​​আপনার উত্তরের জন্য আপনাকে ধন্যবাদ, তবে যতদূর আমি বুঝতে পেরেছি ReadOnlyD शब्दकोয় কোনও গ্যারান্টি দেয় না যে অন্য কেউ অন্তর্নিহিত অভিধান পরিবর্তন করবেন না (এমনকি একমত না হয়েও আমি পদ্ধতিটির অন্তর্ভুক্ত মূল অভিধানের রেফারেন্সটি সংরক্ষণ করতে চাই পরে ব্যবহারের জন্য)। রিডঅনলিডিয়েশনারি এমনকি একটি অদ্ভুত নেমস্পেসে ঘোষণা করা হয়েছে: সিস্টেম.কলেশন.অবজেক্টমোডেল।
ডেন

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

2
... ফলাফলের মোড়ককে নিরাপদে অপরিবর্তনীয় বলে বিবেচনা করা যেতে পারে কি না তা কোডের পক্ষে জানা অসম্ভব করে দেয়।
ক্যাট

13

অপরিবর্তনীয়তা ব্যবহার করার জন্য অনেকগুলি একক থ্রেডযুক্ত কারণ রয়েছে। উদাহরণ স্বরূপ

অবজেক্ট এতে অবজেক্ট বি রয়েছে

বাহ্যিক কোড আপনার অবজেক্ট বি কে জিজ্ঞাসাবাদ করে এবং আপনি এটি ফিরিয়ে দেন।

এখন আপনার পক্ষে তিনটি সম্ভাব্য পরিস্থিতি রয়েছে:

  1. বি অপরিবর্তনীয়, কোনও সমস্যা নেই।
  2. বি পরিবর্তনযোগ্য, আপনি একটি প্রতিরক্ষামূলক অনুলিপি তৈরি করুন এবং এটি ফেরত দিন। পারফরম্যান্স হিট তবে ঝুঁকি নেই।
  3. বি পরিবর্তনীয়, আপনি এটি ফিরিয়ে দিন।

তৃতীয় ক্ষেত্রে ব্যবহারকারীর কোডটি আপনি কী করেছেন তা বুঝতে পারে না এবং এটিতে কোনও পরিবর্তন করতে পারে এবং এর ফলে আপনার অবজেক্টের অভ্যন্তরীণ ডেটা পরিবর্তন করে এটির কোনও নিয়ন্ত্রণ বা দৃশ্যমানতা নেই।


9

অপরিচ্ছন্নতা আবর্জনা সংগ্রহকারীদের প্রয়োগকে ব্যাপকভাবে সরল করতে পারে। থেকে GHC এর উইকি :

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

এটি আবর্জনা সংগ্রহ (জিসি) ব্যাপকভাবে সরল করে। যে কোনও সময় আমরা তৈরি করা সর্বশেষ মানগুলি স্ক্যান করতে পারি এবং সেগুলি মুক্ত করতে পারি যা একই সেট থেকে নির্দেশিত নয় (অবশ্যই, লাইভ মানগুলির স্তরক্রমের আসল মূলগুলি স্ট্যাকের মধ্যে লাইভ থাকে)। [...] সুতরাং এটির একটি পাল্টা স্বজ্ঞাত আচরণ রয়েছে: আপনার মানগুলির বৃহত্তর শতাংশ হ'ল আবর্জনা - এটি দ্রুত কাজ করে। [...]


5

কে চ্যালাক্স সংক্ষিপ্তসারটি কী খুব ভালভাবে ব্যাখ্যা করেছে ...

আদর্শভাবে, আপনার কাছে দুটি ধরণের ক্ষেত্র রয়েছে এবং তাই এগুলি ব্যবহার করে দুটি ধরণের কোড রয়েছে। হয় ক্ষেত্রগুলি অপরিবর্তনীয়, এবং কোডগুলিকে পরিবর্তনের বিষয়টি বিবেচনায় নিতে হবে না; বা ক্ষেত্রগুলি পরিবর্তনযোগ্য, এবং আমাদের কোড লিখতে হবে যা হয় একটি স্ন্যাপশট নেয় ( int x = p.x) অথবা কৌতূহলবশত এই পরিবর্তনগুলি পরিচালনা করে।

আমার অভিজ্ঞতায়, বেশিরভাগ কোড উভয়ের মধ্যেই পড়ে, আশাবাদী কোড: এটি মুক্তভাবে পরিবর্তনীয় ডেটা উল্লেখ করে, ধরে নেওয়া যে প্রথম কলটিতে p.xদ্বিতীয় কল হিসাবে একই ফলাফল হবে। এবং বেশিরভাগ সময়, এটি সত্য, কেবল যখন এটি পরিণত হয় তখন আর থাকে না except উফ।

সুতরাং, সত্যিই, এই প্রশ্নটি ঘুরিয়ে দিন: এই পরিবর্তনীয় করার জন্য আমার কারণগুলি কী ?

  • মেমরি বরাদ্দ / বিনামূল্যে হ্রাস?
  • প্রকৃতির দ্বারা পরিবর্তনযোগ্য? (যেমন কাউন্টার)
  • মডিফায়ারগুলিকে বাঁচায়, অনুভূমিক শব্দ? (Const / চূড়ান্ত)
  • কিছু কোড খাটো / সহজতর করে তোলে? (আরম্ভ ডিফল্ট, সম্ভবত পরে ওভাররাইট)

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


3

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

ভাষাগত ক্ষেত্রে এটি একটি সুপরিচিত ঘটনা যা কয়েকটি শব্দ প্রচুর পরিমাণে উপস্থিত হয়, অন্য প্রসঙ্গেও প্রদর্শিত হতে পারে। সুতরাং একাধিক Stringবস্তু তৈরির পরিবর্তে , আপনি একটি অপরিবর্তনীয় ব্যবহার করতে পারেন। তবে এই অপরিবর্তনীয় জিনিসগুলির যত্ন নিতে আপনার একটি পুলের পরিচালক রাখতে হবে।

এটি আপনার প্রচুর স্মৃতি সাশ্রয় করবে। এটি পড়ার জন্য একটি আকর্ষণীয় নিবন্ধ: http://en.wikedia.org/wiki/Zipf%27s_law


1

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

  1. এমন একটি অ্যারে যা কখনই সংশোধিত হবে না, বা কোনও সংশোধিত হতে পারে এমন কোনও কোডের সংস্পর্শে থাকবে না, তবে বাইরের রেফারেন্সের উপস্থিতি থাকতে পারে।

  2. এমন একটি অ্যারে যাতে বাইরের কোনও উল্লেখ নেই, তবে যা জর্জ অবাধে সংশোধন করতে পারে।

  3. একটি অ্যারে যা জর্জের মালিকানাধীন, তবে যার বাইরে বাইরের মতামত থাকতে পারে যা জর্জের বর্তমান রাষ্ট্রের প্রতিনিধিত্ব করার প্রত্যাশা করবে।

অতিরিক্তভাবে, ভেরিয়েবল, একটি অক্ষর অনুক্রম encapsulate পরিবর্তে, কিছু অন্যান্য অবজেক্টের মালিকানাধীন একটি অক্ষর ক্রম একটি লাইভ ভিউ encapsulate করতে পারে

charsবর্তমানে যদি চরিত্রের অনুক্রম [বায়ু] charsসজ্জিত করে এবং জর্জ চরিত্রের অনুক্রমকে [ভান্ড] সজ্জিত করতে চান, জর্জ কিছু কিছু করতে পারেন:

উ: অক্ষরগুলি [ভান্ড] সমেত একটি নতুন অ্যারে তৈরি করুন এবং charsসেই অ্যারেটিকে পুরানোটির পরিবর্তে সনাক্ত করতে পরিবর্তন করুন ।

খ। কোনওভাবে পূর্ব-বিদ্যমান অক্ষর অ্যারে চিহ্নিত করুন যা সর্বদা অক্ষরগুলি [ভন্ড] ধরে রাখবে এবং পুরানোটির charsপরিবর্তে সেই অ্যারে সনাক্ত করতে পরিবর্তিত হবে।

সি অ্যারের দ্বারা চিহ্নিত দ্বিতীয় চরিত্র পরিবর্তন charsএকটি থেকে a

ক্ষেত্রে 1, (এ) এবং (বি) পছন্দসই ফলাফল অর্জনের নিরাপদ উপায়। (২), (এ) এবং (সি) নিরাপদ থাকলেও (খ) তা হবেনা [এটি তাত্ক্ষণিক সমস্যার কারণ হবেনা, তবে যেহেতু জর্জ ধরে নিবে যে অ্যারের মালিকানা রয়েছে তাই এটি ধরে নেবে যে এটি ইচ্ছায় অ্যারে পরিবর্তন করতে পারে]। ক্ষেত্রে (3), পছন্দগুলি (এ) এবং (বি) বাইরের কোনও দৃষ্টিভঙ্গি ভঙ্গ করবে এবং সুতরাং কেবল পছন্দ (সি) সঠিক। সুতরাং, ক্ষেত্রটি দ্বারা encaps ক্যারেক্টার ক্রমটি পরিবর্তন করতে হয় তা জানার জন্য এটি কোন শব্দার্থক ধরণের ক্ষেত্র তা জেনে রাখা দরকার।

যদি char[]কোনও সম্ভাবনাময়-পরিবর্তনীয় চরিত্রের অনুক্রমকে আবদ্ধ করে এমন ধরণের ক্ষেত্রটি ব্যবহার না করে , কোডটিতে প্রকারটি ব্যবহার করা হয়েছে String, যা একটি অপরিবর্তনীয় চরিত্রের ক্রমকে আবদ্ধ করে, উপরের সমস্ত সমস্যা চলে যায়। প্রকারের সমস্ত ক্ষেত্র Stringশেরেবল অবজেক্ট ব্যবহার করে অক্ষরের ক্রমকে আবদ্ধ করে যা কখনই পরিবর্তন হয় না। ফলস্বরূপ, যদি কোনও প্রকারের ক্ষেত্রString"বাতাস" encapsulates, এটি "ভ্যান্ড" encapsulate করার একমাত্র উপায় হ'ল এটি বিভিন্ন বস্তু সনাক্ত করতে পারে - একটি যা "ছড়ি" ধারণ করে। কোডগুলিতে অবজেক্টের একমাত্র রেফারেন্স রয়েছে এমন ক্ষেত্রে, অবজেক্টটিকে রূপান্তর করা একটি নতুন তৈরি করার চেয়ে আরও কার্যকর হতে পারে তবে যে কোনও সময় কোনও শ্রেণি পরিবর্তনযোগ্য হয় এটি বিভিন্ন উপায়ে যার দ্বারা এটি মানকে আবদ্ধ করতে পারে তার মধ্যে পার্থক্য করা প্রয়োজন। ব্যক্তিগতভাবে আমি মনে করি এর জন্য অ্যাপস হাঙ্গেরিয়ান ব্যবহার করা উচিত ছিল (আমি চারটি ব্যবহারকে char[]শব্দার্থ-স্বতন্ত্র ধরণের হিসাবে বিবেচনা করব, যদিও টাইপ সিস্টেমটি অভিন্ন হিসাবে বিবেচনা করে - ঠিক ঠিক সেই ধরণের পরিস্থিতি যেখানে অ্যাপস হাঙ্গেরিয়ান জ্বলজ্বল করে) তবে যেহেতু এই ধরনের অস্পষ্টতা এড়ানোর সবচেয়ে সহজ উপায়টি হ'ল অপরিবর্তনীয় ধরণের ডিজাইন করা যা কেবলমাত্র এক উপায়ে মানকে আবদ্ধ করে।


এটি একটি যুক্তিসঙ্গত উত্তরের মতো দেখায়, তবে এটি পড়তে এবং বুঝতে খুব অসুবিধা হয়।
ডেন

1

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

এখানে চিত্র বর্ণনা লিখুন

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

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

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

সিস্টেম পূর্বাবস্থায় ফেরান

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

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

on user operation:
    copy entire application state to undo entry
    perform operation

on undo/redo:
    swap application state with undo entry

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

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

ব্যতিক্রম-নিরাপত্তা

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

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

অ-ধ্বংসাত্মক সম্পাদনা

এখানে চিত্র বর্ণনা লিখুন

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

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

পার্শ্ব প্রতিক্রিয়া হ্রাস

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

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

আপনার সিস্টেমে এই জাতীয় আরও কার্যকারিতা রয়েছে যা কোনও পার্শ্ব প্রতিক্রিয়া সৃষ্টি করে না, এটি অবশ্যই এর সঠিকতা সম্পর্কে তর্ক করার পাশাপাশি এর যথার্থতা পরীক্ষা করার পক্ষে সহজ করে তোলে।

সস্তা কপিগুলির সুবিধা

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

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


0

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

  1. স্ন্যাপশট শব্দার্থক, আপনাকে আপনার সংগ্রহগুলি এমনভাবে ভাগ করতে দেয় যাতে রিসিভার কখনই পরিবর্তন হয় না count

  2. বহু-থ্রেডযুক্ত অ্যাপ্লিকেশনগুলিতে অন্তর্নিহিত থ্রেড-সুরক্ষা (সংগ্রহগুলিতে অ্যাক্সেসের জন্য কোনও লকের প্রয়োজন নেই)।

  3. যে কোনও সময় আপনার কাছে কোনও শ্রেণীর সদস্য রয়েছে যা কোনও সংগ্রহের ধরণ গ্রহণ করে বা ফেরত দেয় এবং আপনি চুক্তিতে কেবল পঠনযোগ্য শব্দার্থকে অন্তর্ভুক্ত করতে চান।

  4. কার্যকরী প্রোগ্রামিং বন্ধুত্বপূর্ণ।

  5. মূল সংগ্রহটি পরিবর্তন হয় না তা নিশ্চিত করে গণনার সময় কোনও সংকলন পরিবর্তনের অনুমতি দিন।

  6. তারা একই আইআরএডঅনলি * ইন্টারফেস প্রয়োগ করে যা আপনার কোডটি ইতিমধ্যে মাইগ্রেশন সহকারে কার্যকর।

যদি কেউ আপনাকে একটি ReadOnly Colલેક્શન, একটি IReadOnlyList, বা একটি উল্লেখযোগ্য গ্যারান্টি দেয় তবে আপনি ডেটা পরিবর্তন করতে পারবেন না - এমন কোনও গ্যারান্টি নেই যে আপনাকে সংগ্রহটি হস্তান্তরিত ব্যক্তি এটি পরিবর্তন করবে না। তবুও, আপনার প্রায়শই কিছুটা আস্থা দরকার যে এটি পরিবর্তন হবে না। এই ধরণের ঘটনাগুলি যখন তাদের বিষয়বস্তু পরিবর্তন হয় আপনাকে অবহিত করার জন্য প্রস্তাব দেয় না এবং যদি সেগুলি পরিবর্তন হয় তবে সম্ভবত এটির বিষয়বস্তুগুলি গণনা করার সময় কোনও ভিন্ন থ্রেডে ঘটতে পারে? এই জাতীয় আচরণ আপনার অ্যাপ্লিকেশনটিতে ডেটা দুর্নীতি এবং / অথবা এলোমেলো ব্যতিক্রম ঘটায়।

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