এখানে বেশ কয়েকটি সুন্দর উদাহরণ রয়েছে তবে আমি এমন কিছু ব্যক্তিগত ব্যক্তির সাথে ঝাঁপিয়ে পড়তে চেয়েছিলাম যেখানে অস্থিরতা এক টনে সহায়তা করেছিল। আমার ক্ষেত্রে, আমি মূলত ওভারল্যাপিং পড়া এবং লেখার সমান্তরালে কোডটি আত্মবিশ্বাসের সাথে চালাতে সক্ষম হয়েছি এবং জাতিগত অবস্থার বিষয়ে চিন্তা না করার আশ্বাস দিয়ে একটি অপরিবর্তনীয় সমবর্তী ডেটা স্ট্রাকচার ডিজাইন করা শুরু করেছি। জন কারম্যাক এমন একটি কথাবার্তা বলেছিল যেখানে তিনি এই জাতীয় ধারণা সম্পর্কে কথা বলেছেন সেখানে তা করতে আমাকে অনুপ্রাণিত করেছিল। এটির মতো বাস্তবায়নের জন্য এটি একটি সুন্দর বেসিক কাঠামো এবং বেশ তুচ্ছ:
অবশ্যই আরও কয়েকটি ঘণ্টা এবং শিসের সাথে এটি স্থির সময়ে উপাদানগুলি সরিয়ে ফেলতে সক্ষম হয় এবং পিছনে পুনরুদ্ধারযোগ্য ছিদ্রগুলি ছেড়ে দেয় এবং যদি কোনও প্রদত্ত অযোগ্য উদাহরণের জন্য খালি হয়ে যায় এবং সম্ভাব্যভাবে মুক্ত হয় তবে ব্লকগুলি অবরুদ্ধ হয়ে যায়। তবে মূলত কাঠামোটি সংশোধন করার জন্য, আপনি একটি "ক্ষণস্থায়ী" সংস্করণটি সংশোধন করুন এবং পুরনোটির সাথে স্পর্শ না করে এমন একটি নতুন প্রতিরক্ষা অনুলিপি পাওয়ার জন্য এটিতে আপনার পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ করুন, নতুন সংস্করণটি কেবলমাত্র ব্লকগুলির নতুন কপি তৈরি করবে যা অপ্রকাশিত অনুলিপি এবং রেফারেন্স গণনা করার সময় অনন্য করতে হবে।
যাইহোক, আমি খুঁজে পাইনি তা না করেমাল্টিথ্রেডিংয়ের উদ্দেশ্যে কার্যকর। সর্বোপরি, এখনও ধারণাগত সমস্যা রয়েছে যেখানে, বলুন যে কোনও পদার্থবিজ্ঞান সিস্টেম একযোগে পদার্থবিজ্ঞানের প্রয়োগ করে যখন কোনও খেলোয়াড় বিশ্বের বিভিন্ন উপাদানকে ঘুরিয়ে দেওয়ার চেষ্টা করে। আপনি যে রূপান্তরিত ডেটার সাথে যাচ্ছেন, সেই খেলোয়াড়ের রূপান্তরিত বা পদার্থবিজ্ঞানের সিস্টেমটি রূপান্তরিত হয়েছে? সুতরাং আমি এই বুনিয়াদি ধারণাগত সমস্যার সঠিক এবং সহজ সমাধানটি খুঁজে পেলাম না পরিবর্তে পরিবর্তনশীল ডেটা স্ট্রাকচারগুলি যা কেবলমাত্র একটি চৌকস উপায়ে লক করে এবং ওভারল্যাপিংকে হতাশ করে এবং স্টাফিং থ্রেডগুলি এড়ানোর জন্য বাফারের একই বিভাগে লেখেন 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
আপনার সিস্টেমে এই জাতীয় আরও কার্যকারিতা রয়েছে যা কোনও পার্শ্ব প্রতিক্রিয়া সৃষ্টি করে না, এটি অবশ্যই এর সঠিকতা সম্পর্কে তর্ক করার পাশাপাশি এর যথার্থতা পরীক্ষা করার পক্ষে সহজ করে তোলে।
সস্তা কপিগুলির সুবিধা
যাইহোক, এগুলি সেই জায়গাগুলি যেখানে আমি অপরিবর্তনীয় ডেটা স্ট্রাকচার (বা ধ্রুবক ডেটা স্ট্রাকচার) এর মধ্যে সর্বাধিক ব্যবহার খুঁজে পেয়েছি। আমি প্রথমে কিছুটা অত্যধিক জ্বালানী পেয়েছিলাম এবং একটি অবিচ্ছিন্ন গাছ এবং অপরিবর্তনীয় লিঙ্ক তালিকা এবং অপরিবর্তনীয় হ্যাশ টেবিল তৈরি করেছিলাম, তবে সময়ের সাথে সাথে আমি খুব কমই এর জন্য খুব বেশি ব্যবহার খুঁজে পেয়েছি। আমি মূলত উপরের চিত্রটিতে চুনকি অবিচ্ছেদ্য অ্যারে-জাতীয় ধারকটির সর্বাধিক ব্যবহার খুঁজে পেয়েছি।
আমার এখনও পরিবর্তনীয়দের সাথে কাজ করার প্রচুর কোড রয়েছে (এটি কমপক্ষে নিম্ন-স্তরের কোডের জন্য ব্যবহারিক প্রয়োজনীয়তা সন্ধান করুন), তবে মূল অ্যাপ্লিকেশন রাষ্ট্রটি একটি অপরিবর্তনীয় স্তরবিন্যাস, এটি তার অভ্যন্তরের অপরিবর্তনীয় উপাদানগুলিতে ড্রিল করে। কিছু সস্তা উপাদান এখনও সম্পূর্ণ অনুলিপি করা হয়েছে, তবে মেস এবং চিত্রগুলির মতো সর্বাধিক ব্যয়বহুল উপাদানগুলি কেবলমাত্র সেই অংশগুলির আংশিক সস্তা অনুলিপিগুলিকে রূপান্তরিত করার জন্য অনুমতি হিসাবে পরিবর্তনীয় কাঠামো ব্যবহার করে।
ConcurrentModificationException
যা সাধারণত একই থ্রেডে সংগ্রহ একই রূপের সংগ্রহেরforeach
পরিবর্তে একই সংগ্রহের উপরে একটি লুপের শরীরে ঘটে ।