সেখানে দুর্দান্ত উত্তর আছে, তাই আমি কিছু ভুলে যাওয়া জিনিস যুক্ত করছি।
0. RAII স্কোপগুলি সম্পর্কে
আরআইআই উভয় সম্পর্কে:
- কনস্ট্রাক্টরে রিসোর্স (কোনও রিসোর্স যাই হোক না কেন) অর্জন করা এবং ডিস্ট্রাক্টরটিতে এটি অ-অধিগ্রহণ করা।
- ভেরিয়েবল ঘোষণার সময় কনস্ট্রাক্টরকে মৃত্যুদন্ড কার্যকর করা এবং ভেরিয়েবল সুযোগের বাইরে চলে গেলে ডেস্ট্রাক্টর স্বয়ংক্রিয়ভাবে কার্যকর করা হয়।
অন্যরা ইতিমধ্যে এর সম্পর্কে উত্তর দিয়েছিল, তাই আমি বিস্তারিত জানাব না।
1. জাভা বা সি # তে কোডিং করার সময় আপনি ইতিমধ্যে RAII ব্যবহার করেন ...
মনসির জুরডাইন: কি! যখন আমি বলি, "নিকোল, আমার চপ্পল নিয়ে এস এবং আমার নাইটক্যাপটি দাও" গদ্যটি কি?
ফিলোসফি মাস্টার: হ্যাঁ স্যার।
মনসিউর জুরডেইন: চল্লিশ বছরেরও বেশি সময় ধরে আমি এ সম্পর্কে কিছুই না জেনে গদ্যের কথা বলছি এবং আমাকে তা শিখিয়ে দেওয়ার জন্য আমি আপনার কাছে অনেক বাধ্য।
- মলিয়ার: মধ্যবিত্ত ভদ্রলোক, আইন 2, দৃশ্য 4
মনসিয়র জর্দাইন যেমন গদ্য দিয়েছিলেন, সি # এবং এমনকি জাভা লোকেরা ইতিমধ্যে RAII ব্যবহার করে তবে লুকানো উপায়ে। উদাহরণস্বরূপ, নিম্নলিখিত জাভা কোড (যা প্রতিস্থাপনের synchronized
মাধ্যমে সি # তে একইভাবে লেখা আছে lock
):
void foo()
{
// etc.
synchronized(someObject)
{
// if something throws here, the lock on someObject will
// be unlocked
}
// etc.
}
... ইতিমধ্যে RAII ব্যবহার করছে: শব্দটি ( synchronized
বা lock
) শব্দটিতে মিটেক্স অধিগ্রহণটি সম্পন্ন হয় এবং সুযোগ ছাড়ার সময় আন-অধিগ্রহণ করা হবে।
এটি এর স্বরলিপিতে এতটাই স্বাভাবিক যে এমনকি আরআইআইআই সম্পর্কে কখনও শোনেনি এমন লোকদের জন্য এটি প্রায় কোনও ব্যাখ্যা প্রয়োজন।
জাভা এবং সি # এর উপরে সি ++ এর সুবিধাটি হ'ল RAII ব্যবহার করে যে কোনও কিছু তৈরি করা যায়। উদাহরণস্বরূপ, সি ++ এর সাথে সরাসরি কোনও বিল্ড-ইন সমতুল্য synchronized
নেই lock
, তবে আমরা সেগুলি এখনও পেতে পারি।
সি ++ তে এটি লেখা হবে:
void foo()
{
// etc.
{
Lock lock(someObject) ; // lock is an object of type Lock whose
// constructor acquires a mutex on
// someObject and whose destructor will
// un-acquire it
// if something throws here, the lock on someObject will
// be unlocked
}
// etc.
}
যা সহজেই জাভা / সি # উপায়ে (সি ++ ম্যাক্রোগুলি ব্যবহার করে) লেখা যেতে পারে:
void foo()
{
// etc.
LOCK(someObject)
{
// if something throws here, the lock on someObject will
// be unlocked
}
// etc.
}
২.আরআইআই এর বিকল্প ব্যবহার রয়েছে
হোয়াইট র্যাবিট: [গান গাওয়া] আমি দেরী / খুব দেরিতে / খুব গুরুত্বপূর্ণ তারিখের জন্য। / "হ্যালো" বলার সময় নেই। / বিদায়। / আমি দেরি করছি, আমি দেরি করেছি, দেরি করেছি।
- এলিস ইন ওয়ান্ডারল্যান্ড (ডিজনি সংস্করণ, 1951)
আপনি কী জানেন কখন কন্সট্রাক্টরকে ডাকা হবে (অবজেক্ট ডিক্লেয়ারেশনে), এবং আপনি জানেন যে এর সাথে সম্পর্কিত ডস্ট্রাক্টর কখন ডাকা হবে (স্কোপটি থেকে প্রস্থান করার সময়), সুতরাং আপনি একটি লাইনের সাথে প্রায় জাদুকরী কোড লিখতে পারবেন। C ++ আশ্চর্যজনক দেশটিতে স্বাগতম (কমপক্ষে, C ++ বিকাশকারীর দৃষ্টিকোণ থেকে)।
উদাহরণস্বরূপ, আপনি একটি পাল্টা অবজেক্ট লিখতে পারেন (আমি এটি একটি অনুশীলন হিসাবে দিই) এবং উপরে এটির লক অবজেক্টটি যেমন ব্যবহার করা হয়েছিল ঠিক তেমন তার পরিবর্তনশীল ঘোষণা করে এটি ব্যবহার করতে পারে:
void foo()
{
double timeElapsed = 0 ;
{
Counter counter(timeElapsed) ;
// do something lengthy
}
// now, the timeElapsed variable contain the time elapsed
// from the Counter's declaration till the scope exit
}
অবশ্যই কোনটি আবার, ম্যাক্রো ব্যবহার করে জাভা / সি # উপায়ে লেখা যায়:
void foo()
{
double timeElapsed = 0 ;
COUNTER(timeElapsed)
{
// do something lengthy
}
// now, the timeElapsed variable contain the time elapsed
// from the Counter's declaration till the scope exit
}
৩. সি ++ এর অভাব কেন finally
?
[শোটিং] এটি চূড়ান্ত গণনা!
- ইউরোপ: ফাইনাল কাউন্টডাউন (দুঃখিত, আমি উদ্ধৃতিগুলি বাইরে ছিলাম, এখানে ... :-)
finally
স্কোপটি প্রস্থান করার ক্ষেত্রে রিসোর্স ডিসপ্লে পরিচালনা করতে (# হয় return
বা নিক্ষিপ্ত ব্যতিক্রমের মাধ্যমে) এই ধারাটি সি # / জাভাতে ব্যবহৃত হয় ।
চমত্কার স্পেসিফিকেশন পাঠকদের লক্ষ্য করা হবে যে সি ++ এর শেষ অবধি নেই। এবং এটি ত্রুটি নয়, কারণ সি ++ এর এটির প্রয়োজন নেই, যেমন RAII ইতিমধ্যে সম্পদ নিষ্পত্তি পরিচালনা করে। (এবং আমার বিশ্বাস করুন, সি ++ ডিস্ট্রাক্টর লেখার জন্য জাভা সঠিকভাবে অবধি, এমনকি সি-র সঠিক নিষ্পত্তি পদ্ধতিও লেখার চেয়ে প্রসার সহজ)।
তবুও, কখনও কখনও, একটি finally
ধারাটি শীতল হবে। আমরা কি এটি সি ++ এ করতে পারি? হ্যাঁ আমরা পারি! এবং আবার RAII এর বিকল্প ব্যবহার সহ।
উপসংহার: আরআইআই সি ++ তে দর্শনের চেয়ে অনেক বেশি: এটি সি ++
RAII? এটি সি ++ !!!
- সি ++ বিকাশকারীর ক্ষোভজনক মন্তব্য, নির্লজ্জভাবে স্পার্টার একজন অস্পষ্ট রাজা এবং তার 300 বন্ধুরা অনুলিপি করেছেন
আপনি যখন সি ++ এর কিছু স্তরের অভিজ্ঞতার পর্যায়ে পৌঁছান, আপনি আরএআইআই এর শর্তে, কনস্ট্র্রটর এবং ডেস্ট্রাক্টরদের স্বয়ংক্রিয় প্রয়োগের ক্ষেত্রে বিবেচনা শুরু করেন ।
আপনি স্কোপের পরিপ্রেক্ষিতে চিন্তাভাবনা শুরু করেন {
এবং এবং কোডগুলি}
আপনার কোডে সর্বাধিক গুরুত্বপূর্ণ হয়ে ওঠে।
এবং প্রায় সমস্ত কিছুই RAII- র শর্তাবলী অনুসারে যথাযথভাবে খাপ খায়: ব্যতিক্রমী সুরক্ষা, মিটেক্সেস, ডাটাবেস সংযোগ, ডাটাবেস অনুরোধ, সার্ভার সংযোগ, ঘড়ি, ওএস হ্যান্ডলগুলি, ইত্যাদি, এবং শেষ, তবে কমপক্ষে নয় memory
ডাটাবেসের অংশটি নগণ্য নয়, কারণ, আপনি যদি দামটি দিতে স্বীকার করেন, আপনি এমনকি " লেনদেনের প্রোগ্রামিং " স্টাইলে লিখতে পারেন , সিদ্ধান্ত নেওয়ার আগ পর্যন্ত কোডের লাইন এবং কোডগুলি লাইন করতে পারেন, যদি আপনি সমস্ত পরিবর্তন করতে চান , বা সম্ভব না হলে সমস্ত পরিবর্তন ফিরিয়ে দেওয়া (যতক্ষণ না প্রতিটি লাইন কমপক্ষে দৃ Ex় ব্যতিক্রমী গ্যারান্টিটি পূরণ করে)। ( লেনদেনের প্রোগ্রামিংয়ের জন্য এই হার্বের সুটার নিবন্ধের দ্বিতীয় অংশটি দেখুন )।
এবং ধাঁধা মত, সব ফিট করে।
RAII C ++ এর অনেক অংশ, সি ++ এটি ছাড়া সি ++ হতে পারে না।
এটি ব্যাখ্যা করে যে অভিজ্ঞ সি ++ বিকাশকারীরা কেন আরআইআই-এর প্রতি এত বেশি আকৃষ্ট হয় এবং অন্য ভাষার চেষ্টা করার সময় কেন রাইআইআই তারা প্রথম জিনিস অনুসন্ধান করে।
এবং এটি ব্যাখ্যা করে যে কেন আবর্জনা সংগ্রাহক, যদিও নিজের মধ্যে প্রযুক্তির একটি দুর্দান্ত অংশ, একটি সি ++ বিকাশকারীর দৃষ্টিকোণ থেকে এতটা চিত্তাকর্ষক নয়:
- আরআইআইআই ইতিমধ্যে জিসি দ্বারা পরিচালিত বেশিরভাগ মামলা পরিচালনা করে
- খাঁটি পরিচালিত অবজেক্টের উপর বিজ্ঞপ্তি রেফারেন্স সহ একটি জিসি আরআইআই এর চেয়ে ভাল আচরণ করে (দুর্বল পয়েন্টারগুলির স্মার্ট ব্যবহার দ্বারা প্রশমিত)
- এখনও একটি জিসি মেমরির মধ্যে সীমাবদ্ধ, আরআইআইআই যে কোনও ধরণের সংস্থান পরিচালনা করতে পারে।
- উপরে বর্ণিত হিসাবে, আরআইআই আরও অনেক কিছু করতে পারে ...