রিসোর্স অ্যাকুইজিশন বলতে ইনিশিয়ালাইজেশন (আরআইআইআই) বলতে কী বোঝায়?


283

রিসোর্স অ্যাকুইজিশন বলতে ইনিশিয়ালাইজেশন (আরআইআইআই) বলতে কী বোঝায়?



13
এটি আমার জন্য এটি বাড়িতে চালিত করে। stroustrup.com/bs_faq2.html#finally
হাল ক্যানারি

2
মাইক্রোসফ্ট রেফারেন্স 3 বাক্য এবং 2 উদাহরণ সহ এখনও খুব স্পষ্ট! msdn.microsoft.com/en-us/library/hh438480.aspx
গ্যাব 好人 好人

উত্তর:


374

এটি অবিশ্বাস্যভাবে শক্তিশালী ধারণার জন্য একটি সত্যই ভয়ঙ্কর নাম এবং সম্ভবত সি ++ বিকাশকারীরা অন্যান্য ভাষাগুলিতে স্যুইচ করার সময় সেই 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();

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


2
@ থাই_মান্ড্রিল: আমি এই প্রোগ্রামটি আইডিয়োনেট 1 / জেজেউচ চেষ্টা করেছি। তবে কোনও বিধিবদ্ধ কল নেই call Tomdalling.com/blog/software-design/… বলছেন যে সি ++ গ্যারান্টি দেয় যে স্ট্যাকের উপর অবজেক্টগুলির ধ্বংসকারীকে ডাকা হবে, এমনকি যদি কোনও ব্যতিক্রম ছুঁড়ে দেওয়া হয়। সুতরাং, কেন ডেস্ট্রাক্টর এখানে মৃত্যুদন্ড কার্যকর করেনি? আমার সংস্থান ফাঁস হয়েছে বা এটি কখনই মুক্তি বা মুক্তি দেওয়া হবে না?
ডেস্ট্রাক্টর

8
একটি ব্যতিক্রম নিক্ষেপ করা হয়েছে, কিন্তু আপনি এটি ধরছেন না, সুতরাং অ্যাপ্লিকেশনটি সমাপ্ত হবে। যদি আপনি চেষ্টা করে}} ক্যাচ () { w দিয়ে
মুড়িয়ে

2
Scope-Boundস্টোরেজ ক্লাস স্পেসিফায়াররা এক সত্ত্বার সঞ্চয়স্থানের সময়কাল নির্ধারণ করার সাথে সাথে এখানে সেরা নাম পছন্দ কিনা তা পুরোপুরি নিশ্চিত নয় । স্কোপ-
বাউন্ডে

125

এটি একটি প্রোগ্রামিং আইডিয়ম যার সংক্ষিপ্তর অর্থ হল আপনি

  • একটি সংস্থায় একটি সংস্থান সংস্থান করে (যার নির্মাণকারী সাধারণত - তবে প্রয়োজনীয়ভাবে নয় ** - সংস্থানটি অর্জন করে এবং এর ডেস্ট্রাক্টর সর্বদা এটি প্রকাশ করে)
  • ক্লাসের স্থানীয় উদাহরণের মাধ্যমে রিসোর্সটি ব্যবহার করুন *
  • অবজেক্টটি সুযোগের বাইরে চলে গেলে সংস্থানটি স্বয়ংক্রিয়ভাবে মুক্ত হয়

এটি গ্যারান্টি দেয় যে রিসোর্সটি ব্যবহারের সময় যা কিছু ঘটুক না কেন, শেষ পর্যন্ত এটি মুক্তি পাবে (স্বাভাবিক প্রত্যাবর্তনের কারণে, ধারণকৃত বস্তুর ধ্বংস হওয়া বা একটি ব্যতিক্রম ছোঁড়া হোক)।

এটি সি ++ এ ব্যাপকভাবে ব্যবহৃত ভাল অনুশীলন, কারণ সংস্থানগুলি মোকাবেলা করার নিরাপদ উপায় ছাড়াও এটি আপনার কোডকে আরও পরিস্কার করে তোলে কারণ আপনাকে মূল কার্যকারিতার সাথে ত্রুটি পরিচালনা করার কোডটি মিশ্রিত করতে হবে না।

* আপডেট: "স্থানীয়" এর অর্থ স্থানীয় ভেরিয়েবল বা শ্রেণীর ননস্ট্যাটিক সদস্য ভেরিয়েবল হতে পারে। পরবর্তী ক্ষেত্রে সদস্য ভেরিয়েবলটি তার মালিক অবজেক্টের সাহায্যে আরম্ভ করা হয় এবং ধ্বংস হয়।

** আপডেট 2: @ এসবিআই হিসাবে উল্লেখ করা হয়েছে, উত্স - যদিও প্রায়শই নির্মাণকারীর ভিতরে বরাদ্দ দেওয়া হয় - এছাড়াও বাইরে বরাদ্দ করা যেতে পারে এবং প্যারামিটার হিসাবে পাস করা যেতে পারে।


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

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

এটি সংক্ষিপ্ত বিবরণ নয়, এটি একটি সংক্ষেপণ। আইআইআরসি বেশিরভাগ লোকেরা এটিকে "আর এযে অ্যায়" বলে উচ্চারণ করে তাই এটি ডারপা বলতে উচ্চারণের পরিবর্তে DARPA হিসাবে উচ্চারণ করা উচ্চারণ হিসাবে সত্যই যোগ্যতা অর্জন করে না। এছাড়াও, আমি বলতে চাই যে RAII নিছক মূর্খতার চেয়ে একটি দৃষ্টান্ত।
dtech

@ পিটার টরোক: আমি এই প্রোগ্রামটি আইডোন / ডটকম / জাজুকের চেষ্টা করেছি । তবে কোনও বিধিবদ্ধ কল নেই call Tomdalling.com/blog/software-design/... বলছেন যে সি ++ গ্যারান্টী যে স্ট্যাক বস্তুর বিনাশকারী বলা হবে, এমনকি যদি একটি ব্যতিক্রম ফেলে দেওয়া হয়। সুতরাং, কেন ডেস্ট্রাক্টর এখানে মৃত্যুদন্ড কার্যকর করেনি? আমার সংস্থান ফাঁস হয়েছে বা এটি কখনই মুক্তি বা মুক্তি দেওয়া হবে না?
ডেস্ট্রাক্টর

50

"আরআইআইআই" এর অর্থ "রিসোর্স অ্যাকুইজিশন ইনিশিয়ালাইজেশন" এবং আসলে এটি একটি ভুল গানের বিষয়, যেহেতু এটি সম্পদ অধিগ্রহণ নয় (এবং কোনও বস্তুর সূচনা) এটি সম্পর্কিত তবে সংস্থানটি প্রকাশ করে ( কোনও বস্তুর ধ্বংসের মাধ্যমে) )।
তবে 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 যা এক ধরণের মুভ-সিমান্টিকস প্রয়োগ করে: কোনও বস্তুর মালিকানা কেবল একটি পয়েন্টারের, এবং কোনও বিষয় অনুলিপি করার চেষ্টা করার ফলে ফলাফলটির (সিনট্যাক্স হ্যাকারির মাধ্যমে) অনুলিপি অপারেশনের লক্ষ্যে স্থানান্তরিত হবে।


4
std::auto_ptrএর অপ্রচলিত সংস্করণ std::unique_ptrstd::auto_ptrসি ++ 98 তে যতটা সম্ভব সিমুলেটেড মুভ সিমানটিকস std::unique_ptrব্যবহার করা হয়েছিল, সি ++ 11 এর নতুন মুভ শব্দার্থবিদ্যা ব্যবহার করে। নতুন শ্রেণি তৈরি করা হয়েছিল কারণ সি ++ 11 এর সরানো শব্দার্থবিজ্ঞানগুলি আরও স্পষ্টত ( std::moveঅস্থায়ী ব্যতীত আবশ্যক ) যখন অন-কনস্ট্যান্টের কোনও অনুলিপিটির জন্য এটি ডিফল্ট হয়েছিল std::auto_ptr
জান হুডেক

@ জিয়াহাওকাই: বহু বছর আগে (ইউজনেটে) একবার, স্ট্রস্ট্রপ নিজেই তা বলেছিলেন।
এসবিআই

21

একটি বস্তুর জীবনকাল তার সুযোগ দ্বারা নির্ধারিত হয়। যাইহোক, কখনও কখনও আমাদের প্রয়োজন হয়, বা এটি দরকারী, এমন একটি অবজেক্ট তৈরি করতে যা এটি তৈরি করা হয়েছে এমন সুযোগের থেকে স্বাধীনভাবে বাস করে। সি ++ এ অপারেটরটি 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

এই কৌশলটির আর একটি নাম এসবিআরএম , স্কোপ-বাউন্ড রিসোর্স ম্যানেজমেন্টের জন্য সংক্ষিপ্ত ।


1
"এসবিআরএম" আমার কাছে আরও অনেক কিছু বোঝায়। আমি এই প্রশ্নে এসেছি কারণ আমি ভেবেছিলাম আমি আরআইআই বুঝতে পেরেছি কিন্তু নামটি আমাকে ফেলে দিচ্ছে, এটি "স্কোপ-বাউন্ড রিসোর্স ম্যানেজমেন্ট" হিসাবে বর্ণিত শুনে আমি তাত্ক্ষণিকভাবে বুঝতে পেরেছিলাম যে আমি সত্যিই ধারণাটি বুঝতে পেরেছি।
জেস্টরহাউস

আমি নিশ্চিত নই কেন এটি কেন এই প্রশ্নের উত্তর হিসাবে চিহ্নিত করা হয়নি। এটি একটি খুব পুঙ্খানুপুঙ্খ এবং ভালো করে লেখা উত্তর, ধন্যবাদ @elmiomar
Abdelrahman Shoman

13

সি ++ প্রোগ্রামিং উইথ ডিজাইন প্যাটার্নস প্রকাশিত বইটি আরআইআই-কে বর্ণনা করেছে:

  1. সমস্ত সম্পদ অর্জন
  2. সংস্থান ব্যবহার করা
  3. রিসোর্স রিলিজ

কোথায়

  • সংস্থানগুলি ক্লাস হিসাবে প্রয়োগ করা হয়, এবং সমস্ত পয়েন্টারগুলির চারপাশে শ্রেণি মোড়ক থাকে (তাদের স্মার্ট পয়েন্টার বানানো)।

  • সংস্থাগুলি তাদের নির্মাতাদের ডাক দিয়ে সম্পদ অর্জন করা হয় এবং তাদের ডেস্ট্রাক্টরদের সাহায্যে স্পষ্টভাবে (অধিগ্রহণের বিপরীত ক্রমে) প্রকাশ করা হয়।


1
@ ব্র্যান্ডিন আমি আমার পোস্টটি সম্পাদনা করেছি যাতে পাঠকরা ন্যায্য ব্যবহারের বিষয়টি কীভাবে কপিরাইট আইনের ধূসর অঞ্চল নিয়ে বিতর্ক না করে গুরুত্বপূর্ণ বিষয়বস্তুতে ফোকাস করবে।
ডেনিস

7

একটি RAII শ্রেণীর তিনটি অংশ রয়েছে:

  1. সংস্থানকারীগুলিতে সম্পদটি ত্যাগ করা হয়
  2. শ্রেণীর উদাহরণ বরাদ্দ করা হয়
  3. সংস্থানটি কনস্ট্রাক্টরে অর্জিত হয়। এই অংশটি alচ্ছিক তবে সাধারণ।

আরআইআই'র অর্থ দাঁড়ায় "রিসোর্স অ্যাকুইজিশন ইনিশিয়েশন" আরআইআইআইয়ের "রিসোর্স অধিগ্রহণ" অংশটি যেখানে আপনি এমন কিছু শুরু করেন যা পরে শেষ করা উচিত, যেমন:

  1. একটি ফাইল খোলার
  2. কিছু স্মৃতি বরাদ্দ করা হচ্ছে
  3. একটি লক অর্জন

"ইনিশিয়ালাইজেশন" অংশটির অর্থ হ'ল অধিগ্রহণটি কোনও শ্রেণীর নির্মাতার ভিতরে ঘটে happens

https://www.tomdalling.com/blog/software-design/resource-acquisition-is-initialisation-raii-explained/


5

ম্যানুয়াল মেমরি ম্যানেজমেন্ট হ'ল একটি দুঃস্বপ্ন যা সংকলক আবিষ্কারের পরে প্রোগ্রামাররা এড়ানোর উপায়গুলি আবিষ্কার করে। আবর্জনা সংগ্রহকারীদের সাথে প্রোগ্রামিংয়ের ভাষাগুলি জীবনকে সহজ করে তোলে তবে কার্য সম্পাদনের ব্যয়ে। এই নিবন্ধে - আবর্জনা সংগ্রাহক নির্মূল: আরএআইআই ওয়ে , টপটাল ইঞ্জিনিয়ার পিটার গুডস্পিড-নিক্লাউস আমাদের আবর্জনা সংগ্রহকারীদের ইতিহাসের এক ঝলক দেয় এবং ব্যাখ্যা করেন যে কীভাবে মালিকানা এবং orrowণ নেওয়ার ধারণাগুলি তাদের সুরক্ষা গ্যারান্টির সাথে আপস না করে আবর্জনা সংগ্রহকারীদের নির্মূল করতে সহায়তা করতে পারে।

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