রিসোর্স অ্যাকুইজিশন বলতে ইনিশিয়ালাইজেশন (আরআইআইআই) বলতে কী বোঝায়?
রিসোর্স অ্যাকুইজিশন বলতে ইনিশিয়ালাইজেশন (আরআইআইআই) বলতে কী বোঝায়?
উত্তর:
এটি অবিশ্বাস্যভাবে শক্তিশালী ধারণার জন্য একটি সত্যই ভয়ঙ্কর নাম এবং সম্ভবত সি ++ বিকাশকারীরা অন্যান্য ভাষাগুলিতে স্যুইচ করার সময় সেই 1 নম্বর জিনিসগুলির মধ্যে একটি মিস করে। এই ধারণাটি Scop-Bound Resource Management হিসাবে নামকরণের চেষ্টা করার জন্য কিছুটা আন্দোলন শুরু হয়েছে , যদিও এটি এখনও ধরা পড়ে না বলে মনে হয়।
যখন আমরা 'রিসোর্স' বলি আমরা কেবল মেমোরিই বোঝাতে পারি না - এটি ফাইল হ্যান্ডলগুলি, নেটওয়ার্ক সকেট, ডাটাবেস হ্যান্ডেলগুলি, জিডিআই অবজেক্ট হতে পারে ... সংক্ষেপে, আমাদের সীমাবদ্ধ সরবরাহ রয়েছে এমন জিনিসগুলি এবং তাই আমাদের সক্ষম হতে হবে তাদের ব্যবহার নিয়ন্ত্রণ করুন। 'স্কোপ-বেউন্ড' দিকটির অর্থ হ'ল বস্তুর আজীবন কোনও ভেরিয়েবলের স্কোপ এর সাথে আবদ্ধ থাকে, সুতরাং যখন ভেরিয়েবল সুযোগের বাইরে চলে যায় তখন ডেস্ট্রাক্টর রিসোর্সটি প্রকাশ করে। এর একটি খুব দরকারী সম্পত্তি হ'ল এটি বৃহত্তর ব্যতিক্রম-সুরক্ষার জন্য করে। উদাহরণস্বরূপ, এটি তুলনা করুন:
RawResourceHandle* handle=createNewResource();
handle->performInvalidOperation(); // Oops, throws exception
...
deleteResource(handle); // oh dear, never gets called so the resource leaks
আরএআইআই এর সাথে একটি
class ManagedResourceHandle {
public:
ManagedResourceHandle(RawResourceHandle* rawHandle_) : rawHandle(rawHandle_) {};
~ManagedResourceHandle() {delete rawHandle; }
... // omitted operator*, etc
private:
RawResourceHandle* rawHandle;
};
ManagedResourceHandle handle(createNewResource());
handle->performInvalidOperation();
এই পরবর্তী ক্ষেত্রে, যখন ব্যতিক্রম নিক্ষেপ করা হয় এবং স্ট্যাকটি অযাচিত হয়, স্থানীয় ভেরিয়েবলগুলি ধ্বংস হয়ে যায় যা আমাদের রিসোর্স পরিষ্কার হয়ে যায় এবং লিক হয় না তা নিশ্চিত করে।
Scope-Boundস্টোরেজ ক্লাস স্পেসিফায়াররা এক সত্ত্বার সঞ্চয়স্থানের সময়কাল নির্ধারণ করার সাথে সাথে এখানে সেরা নাম পছন্দ কিনা তা পুরোপুরি নিশ্চিত নয় । স্কোপ-
এটি একটি প্রোগ্রামিং আইডিয়ম যার সংক্ষিপ্তর অর্থ হল আপনি
এটি গ্যারান্টি দেয় যে রিসোর্সটি ব্যবহারের সময় যা কিছু ঘটুক না কেন, শেষ পর্যন্ত এটি মুক্তি পাবে (স্বাভাবিক প্রত্যাবর্তনের কারণে, ধারণকৃত বস্তুর ধ্বংস হওয়া বা একটি ব্যতিক্রম ছোঁড়া হোক)।
এটি সি ++ এ ব্যাপকভাবে ব্যবহৃত ভাল অনুশীলন, কারণ সংস্থানগুলি মোকাবেলা করার নিরাপদ উপায় ছাড়াও এটি আপনার কোডকে আরও পরিস্কার করে তোলে কারণ আপনাকে মূল কার্যকারিতার সাথে ত্রুটি পরিচালনা করার কোডটি মিশ্রিত করতে হবে না।
* আপডেট: "স্থানীয়" এর অর্থ স্থানীয় ভেরিয়েবল বা শ্রেণীর ননস্ট্যাটিক সদস্য ভেরিয়েবল হতে পারে। পরবর্তী ক্ষেত্রে সদস্য ভেরিয়েবলটি তার মালিক অবজেক্টের সাহায্যে আরম্ভ করা হয় এবং ধ্বংস হয়।
** আপডেট 2: @ এসবিআই হিসাবে উল্লেখ করা হয়েছে, উত্স - যদিও প্রায়শই নির্মাণকারীর ভিতরে বরাদ্দ দেওয়া হয় - এছাড়াও বাইরে বরাদ্দ করা যেতে পারে এবং প্যারামিটার হিসাবে পাস করা যেতে পারে।
open()/ close()পদ্ধতি নেই , কেবল নির্মাতা এবং ডেস্ট্রাক্টর, সুতরাং উত্সটির 'হোল্ডিং' কেবল অবজেক্টের আজীবন, কোনও বিষয় নয় যে সেই জীবনকালটি যদি হয় তবে প্রসঙ্গ (স্ট্যাক) বা স্পষ্টতই (গতিশীল বরাদ্দ) দ্বারা পরিচালিত
"আরআইআইআই" এর অর্থ "রিসোর্স অ্যাকুইজিশন ইনিশিয়ালাইজেশন" এবং আসলে এটি একটি ভুল গানের বিষয়, যেহেতু এটি সম্পদ অধিগ্রহণ নয় (এবং কোনও বস্তুর সূচনা) এটি সম্পর্কিত তবে সংস্থানটি প্রকাশ করে ( কোনও বস্তুর ধ্বংসের মাধ্যমে) )।
তবে RAII নামটি আমরা পেয়েছি এবং এটি আটকে যায়।
একেবারে হৃদয়ে, আইডিয়মটি স্থানীয়, স্বয়ংক্রিয় বস্তুগুলিতে এনক্যাপসুলেটিং সংস্থান (মেমরির অংশ, উন্মুক্ত ফাইল, আনলকড মিউটেক্সগুলি, আপনার নাম-এটি) বৈশিষ্ট্যযুক্ত করে এবং যখন অবজেক্টটি ধ্বংস করা হয় তখন সেই বস্তুর ধ্বংসকারী সংস্থানটি রিলিজ করে থাকে এটি যে ক্ষেত্রের অন্তর্গত তার শেষ:
{
raii obj(acquire_resource());
// ...
} // obj's dtor will call release_resource()
অবশ্যই, অবজেক্টগুলি সর্বদা স্থানীয় নয়, স্বয়ংক্রিয় বস্তু। তারা একটি শ্রেণীর সদস্যও হতে পারে:
class something {
private:
raii obj_; // will live and die with instances of the class
// ...
};
যদি এই জাতীয় অবজেক্টগুলি মেমরি পরিচালনা করে তবে তাদের প্রায়ই "স্মার্ট পয়েন্টার" বলা হয়।
এর বিভিন্ন প্রকরণ রয়েছে। উদাহরণস্বরূপ, প্রথম কোড স্নিপেটে প্রশ্ন উত্থাপিত হয় যদি কেউ অনুলিপি করতে চান তবে কী হবে obj। সবচেয়ে সহজ উপায় হ'ল অনুলিপি অনুলিপি করা। std::unique_ptr<>, পরবর্তী সি ++ স্ট্যান্ডার্ড দ্বারা বৈশিষ্ট্যযুক্ত স্ট্যান্ডার্ড লাইব্রেরির অংশ হওয়ার জন্য একটি স্মার্ট পয়েন্টার, এটি করে।
এই জাতীয় আর একটি স্মার্ট পয়েন্টার, std::shared_ptrএটি ধারণ করে এমন সংস্থানটির (অংশীদারিভাবে বরাদ্দকৃত বস্তু) "ভাগ করে নেওয়া মালিকানা" বৈশিষ্ট্যযুক্ত। এটি হ'ল এটি অবাধে অনুলিপি করা যেতে পারে এবং সমস্ত অনুলিপি একই জিনিসকে বোঝায়। স্মার্ট পয়েন্টারটি একই কপির জন্য কয়টি অনুলিপি উল্লেখ করে এবং সর্বশেষটি নষ্ট হয়ে যাওয়ার পরে এটি মুছবে তা ট্র্যাক করে।
তৃতীয় রূপটি বৈশিষ্ট্যযুক্তstd::auto_ptr যা এক ধরণের মুভ-সিমান্টিকস প্রয়োগ করে: কোনও বস্তুর মালিকানা কেবল একটি পয়েন্টারের, এবং কোনও বিষয় অনুলিপি করার চেষ্টা করার ফলে ফলাফলটির (সিনট্যাক্স হ্যাকারির মাধ্যমে) অনুলিপি অপারেশনের লক্ষ্যে স্থানান্তরিত হবে।
std::auto_ptrএর অপ্রচলিত সংস্করণ std::unique_ptr। std::auto_ptrসি ++ 98 তে যতটা সম্ভব সিমুলেটেড মুভ সিমানটিকস std::unique_ptrব্যবহার করা হয়েছিল, সি ++ 11 এর নতুন মুভ শব্দার্থবিদ্যা ব্যবহার করে। নতুন শ্রেণি তৈরি করা হয়েছিল কারণ সি ++ 11 এর সরানো শব্দার্থবিজ্ঞানগুলি আরও স্পষ্টত ( std::moveঅস্থায়ী ব্যতীত আবশ্যক ) যখন অন-কনস্ট্যান্টের কোনও অনুলিপিটির জন্য এটি ডিফল্ট হয়েছিল std::auto_ptr।
একটি বস্তুর জীবনকাল তার সুযোগ দ্বারা নির্ধারিত হয়। যাইহোক, কখনও কখনও আমাদের প্রয়োজন হয়, বা এটি দরকারী, এমন একটি অবজেক্ট তৈরি করতে যা এটি তৈরি করা হয়েছে এমন সুযোগের থেকে স্বাধীনভাবে বাস করে। সি ++ এ অপারেটরটি newএ জাতীয় অবজেক্ট তৈরি করতে ব্যবহৃত হয়। এবং অবজেক্টটি ধ্বংস deleteকরতে অপারেটরটি ব্যবহার করা যেতে পারে। অপারেটর দ্বারা নির্মিত বস্তুগুলি newগতিশীলভাবে বরাদ্দ করা হয়, অর্থাত্ গতিশীল মেমোরিতে বরাদ্দ (এটি হিপ বা ফ্রি স্টোরও বলে )। সুতরাং, কোনও বস্তু যা দ্বারা তৈরি হয়েছিল newতা ব্যবহার করে স্পষ্টভাবে ধ্বংস না হওয়া অবধি বিদ্যমান থাকবে delete।
কিছু ভুল যা ব্যবহার করার সময় ঘটতে পারে newএবং deleteসেগুলি হ'ল :
newকোনও বস্তুকে বরাদ্দ করতে deleteএবং অবজেক্টটিকে ভুলে যেতে ।deleteএবং তারপরে অন্য পয়েন্টারটি ব্যবহার করুন।deleteদুবার কোনও বস্তুর চেষ্টা করা ।সাধারণত, স্কোপড ভেরিয়েবলগুলি অগ্রাধিকার দেওয়া হয়। যাইহোক, আরআইআইআই এর বিকল্প হিসাবে newএবং deleteকোনও বস্তুকে তার পরিধি থেকে স্বতন্ত্রভাবে লাইভ করার জন্য ব্যবহার করা যেতে পারে । এই ধরনের একটি কৌশল বস্তু গাদা বরাদ্দ হয়েছিল পয়েন্টার গ্রহণ এবং একটি এটা স্থাপন নিয়ে গঠিত হাতল / ম্যানেজার বস্তুর । পরেরটির একটি ডেস্ট্রাক্টর রয়েছে যা অবজেক্টটি ধ্বংস করার যত্ন নেবে। এটি গ্যারান্টি দেবে যে অবজেক্টটি যে কোনও ক্রিয়াকলাপে অ্যাক্সেস পেতে চায় তা উপলভ্য এবং হ্যান্ডেল অবজেক্টের জীবনকাল শেষ হয়ে গেলে , পরিষ্কার পরিষ্কারের প্রয়োজন ছাড়াই অবজেক্টটি ধ্বংস হয়ে যায় ।
C ++ স্ট্যান্ডার্ডের লাইব্রেরি থেকে উদাহরণ ব্যবহার করুন RAII আছে std::stringএবং std::vector।
কোডের এই অংশটি বিবেচনা করুন:
void fn(const std::string& str)
{
std::vector<char> vec;
for (auto c : str)
vec.push_back(c);
// do something
}
যখন আপনি কোনও ভেক্টর তৈরি করেন এবং আপনি এতে উপাদানগুলিকে ধাক্কা দেন, আপনি এই জাতীয় উপাদান বরাদ্দ করা এবং হ্রাস করার বিষয়ে চিন্তা করেন না। ভেক্টর newগাদা তার উপাদানগুলির জন্য স্থান বরাদ্দ deleteকরতে এবং সেই স্থানটি মুক্ত করতে ব্যবহার করে। আপনি ভেক্টরের একজন ব্যবহারকারী হিসাবে আপনি প্রয়োগের বিশদটি সম্পর্কে চিন্তা করেন না এবং ভেক্টরটি ফুটো না হওয়ার বিষয়ে বিশ্বাস করবেন। এই ক্ষেত্রে, ভেক্টর হ্যান্ডেল অবজেক্ট তার উপাদানগুলির ।
মান লাইব্রেরি থেকে অন্যান্য উদাহরণ ব্যবহারের RAII হয় std::shared_ptr, std::unique_ptrএবং std::lock_guard।
এই কৌশলটির আর একটি নাম এসবিআরএম , স্কোপ-বাউন্ড রিসোর্স ম্যানেজমেন্টের জন্য সংক্ষিপ্ত ।
সি ++ প্রোগ্রামিং উইথ ডিজাইন প্যাটার্নস প্রকাশিত বইটি আরআইআই-কে বর্ণনা করেছে:
কোথায়
সংস্থানগুলি ক্লাস হিসাবে প্রয়োগ করা হয়, এবং সমস্ত পয়েন্টারগুলির চারপাশে শ্রেণি মোড়ক থাকে (তাদের স্মার্ট পয়েন্টার বানানো)।
সংস্থাগুলি তাদের নির্মাতাদের ডাক দিয়ে সম্পদ অর্জন করা হয় এবং তাদের ডেস্ট্রাক্টরদের সাহায্যে স্পষ্টভাবে (অধিগ্রহণের বিপরীত ক্রমে) প্রকাশ করা হয়।
একটি RAII শ্রেণীর তিনটি অংশ রয়েছে:
আরআইআই'র অর্থ দাঁড়ায় "রিসোর্স অ্যাকুইজিশন ইনিশিয়েশন" আরআইআইআইয়ের "রিসোর্স অধিগ্রহণ" অংশটি যেখানে আপনি এমন কিছু শুরু করেন যা পরে শেষ করা উচিত, যেমন:
"ইনিশিয়ালাইজেশন" অংশটির অর্থ হ'ল অধিগ্রহণটি কোনও শ্রেণীর নির্মাতার ভিতরে ঘটে happens
ম্যানুয়াল মেমরি ম্যানেজমেন্ট হ'ল একটি দুঃস্বপ্ন যা সংকলক আবিষ্কারের পরে প্রোগ্রামাররা এড়ানোর উপায়গুলি আবিষ্কার করে। আবর্জনা সংগ্রহকারীদের সাথে প্রোগ্রামিংয়ের ভাষাগুলি জীবনকে সহজ করে তোলে তবে কার্য সম্পাদনের ব্যয়ে। এই নিবন্ধে - আবর্জনা সংগ্রাহক নির্মূল: আরএআইআই ওয়ে , টপটাল ইঞ্জিনিয়ার পিটার গুডস্পিড-নিক্লাউস আমাদের আবর্জনা সংগ্রহকারীদের ইতিহাসের এক ঝলক দেয় এবং ব্যাখ্যা করেন যে কীভাবে মালিকানা এবং orrowণ নেওয়ার ধারণাগুলি তাদের সুরক্ষা গ্যারান্টির সাথে আপস না করে আবর্জনা সংগ্রহকারীদের নির্মূল করতে সহায়তা করতে পারে।