আরআইআইআই কি? উদাহরণ?


19

সর্বদা যখন RAII শব্দটি ব্যবহৃত হয় তখন লোকে প্রকৃতপক্ষে আরম্ভের পরিবর্তে ডিকনস্ট্রাকশন সম্পর্কে কথা হয়। আমি মনে করি এটির অর্থ কী হতে পারে আমার কাছে একটি প্রাথমিক বোঝাপড়া আছে তবে আমি যথেষ্ট নিশ্চিত নই। এছাড়াও: সি ++ কি একমাত্র RAII ভাষা? জাভা বা সি # /। নেট সম্পর্কে কী হবে?

উত্তর:


25

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

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

RAII ভাল ব্যবহার করার অর্থ আপনার প্রয়োজন নেই finally। অবশ্যই এটি নির্বিচারক ধ্বংসের উপর নির্ভর করে যা আপনার জাভাতে থাকতে পারে না। আপনি সি # এবং ভিবি.এনইটি এর সাথে এক ধরণের নিরঙ্কুশ ধ্বংস পেতে পারেন using


4
আমি মনে করি আপনি যা পেয়ে যাচ্ছেন এটিই, তবে আপনি সম্ভবত যুক্ত করতে চাইতে পারেন যে জাভা এবং সি # আরআইআই সমর্থন করে না কারণ এটি আবর্জনা সংগ্রহকারী। সি ++ এ, কোনও স্থানীয় অবজেক্ট সুযোগের বাইরে যাওয়ার সাথে সাথে তা ধ্বংস হয়ে যাবে। জাভা / সি # তে এটি সত্য নয়।
জেসন বেকার

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

1
@ জেসন এটাই আমি "নির্বিচারবাদী ধ্বংস" বলতে চাইছিলাম - একজন সি ++ প্রোগ্রামার জানেন যে ধ্বংসকারী কখন চালাবেন।
কেট গ্রেগরি

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

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

4

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

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

তবে যদি কোনও কনস্ট্রাক্টরের মধ্যে ব্যতিক্রম নিক্ষেপ ঘটে তবে কী হবে?

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

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

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

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