অ-নির্ধারিত রিসোর্স-পরিচালনা কি একটি ফাঁস বিমূর্ততা?


9

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

নতুন ভাষাগুলি পরবর্তীকালের পক্ষে বেছে নেবে বলে মনে হয়, সম্ভবত অ-রেফারেন্স-গণনা বিভিন্নতার আবর্জনা সংগ্রহের সিস্টেম ব্যবহারের পার্শ্ব-প্রতিক্রিয়া হিসাবে।

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

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

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

এটি কি পূর্বেরটি সংস্থান ধ্বংসের বাস্তবায়ন বিশদটি ফাঁস করে দেয়?

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


5
আমি "হ্যাঁ" বলার জন্য প্রলুব্ধ হয়েছি, তবে অন্যেরা এ সম্পর্কে কী বলতে চায় তা শুনতে আমি পছন্দ করি।
বার্ট ভ্যান ইনজেন শেহেনো

স্বচ্ছ সম্পদ ধ্বংস? আপনি সাধারণ পয়েন্টার পরিবর্তে স্মার্ট পয়েন্টার ব্যবহার করতে হবে তা বাদে? আমি মনে করি না যে এটি কেবলমাত্র একটি পদ্ধতি (রেফারেন্স) অবজেক্টগুলিতে অ্যাক্সেস পাওয়ার চেয়ে বেশি (সি ++ এ আপনার কমপক্ষে চার বা পাঁচটি রয়েছে)।
জর্জিও

@ জর্জিও: "কোনও বস্তুর অ্যাক্সেস করার উপায়" বেশ অস্পষ্ট। আপনি কি পড়তে বা লিখতে চান? কনস্ট / অস্থির যোগ্যতা? পয়েন্টারগুলি আসলে "কোনও বস্তুর অ্যাক্সেসের উপায়" নয়; কোনও বস্তুতে কোনও অভিব্যক্তির ফলাফল হয় এবং পয়েন্টারটিকে কেবলমাত্র নির্দিষ্ট করে দেয় না।
এমসাল্টার্স

1
@ জর্জিও: ওওপি অর্থে আপনি কোনও সি ++ পয়েন্টারে কোনও বার্তা প্রেরণ করতে পারবেন না। বার্তাটি পাঠাতে (*ptr).Message()বা সমতুল্যভাবে আপনাকে পয়েন্টারটি অবলম্বন করতে হবে ptr->Message()। অনুমোদিত এক্সপ্রেশনগুলির একটি অসীম সেট রয়েছে, ((*ptr))->Messageএটি সমান। তবে তারা সবাই সিদ্ধ হয়expressionIdentifyingAnObject.Message()
এমসাল্টার্স

1
পুনঃকাউন্টের সাথে আপনার চেনাশোনাগুলি এড়ানো সম্পর্কে সতর্ক হওয়া দরকার। যাতে বিমূর্ততাও ফাঁস হয়, ঠিক অন্যভাবে।
কোডসইনচওস

উত্তর:


2

আপনার নিজের উদাহরণ প্রশ্নের উত্তর দেয়। স্বচ্ছ ধ্বংস স্পষ্টভাবে ধ্বংসের চেয়ে কম ফাঁস হয়। এটি ফুটো করতে পারে তবে কম ফুটো হয়।

সুস্পষ্ট ধ্বংস হ'ল ম্যালোক / বিনামূল্যে সি এর সাথে সমস্ত সমস্যা রয়েছে। এটি স্কোপ-ভিত্তিক প্রদর্শিত হতে পারে এমন কিছু সিনট্যাকটিক চিনি দিয়ে।

সুস্পষ্ট ধ্বংসের তুলনায় স্বচ্ছ ধ্বংসের কিছু সুবিধা: -
একই ব্যবহারের ধরণ - আপনি উত্সটি
প্রকাশ করতে ভুলবেন না।
- বিশদ বিবরণ ব্যবহারের স্থানে ল্যান্ডস্কেপটি জঞ্জাল না করে।


2

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

যখন কাউন্টার অবজেক্টটি তৈরি করা হয়, তখন এটি অবশ্যই নিজের নজরদারি নিয়ন্ত্রণের মধ্যে সংরক্ষণ করতে পারে। নিয়ন্ত্রণটি আসলে কাউন্টার অবজেক্টের বিষয়ে চিন্তা করে না, এবং কাউন্টার অবজেক্ট এবং এর রেফারেন্সের উপস্থিতি বন্ধ হয়ে গেলে ঠিক ততটা খুশি হবে, তবে যতক্ষণ রেফারেন্সটি বিদ্যমান থাকবে ততক্ষণ পর্যন্ত প্রতিটি বার সেই বস্তুর ইভেন্ট হ্যান্ডলারকে কল করবে will এটি নিজেই রঙ করে। এই ক্রিয়াটি নিয়ন্ত্রণের পক্ষে সম্পূর্ণ অকেজো, তবে যে কেউ কখনই getTotalClicks()বস্তুটিতে কল করবে তাদের পক্ষে কার্যকর useful

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

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

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

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


0

কোনও "ডেস্ট্রাক্টর, বা অন্যান্য ইন্টারফেস যা" এই শ্রেণিটি ধ্বংস করতে হবে "বলে তা সেই ইন্টারফেসের চুক্তি নয় you ।

সি ++ বনাম অন্যদের ক্ষেত্রে, খুব বেশি পার্থক্য নেই। সি ++ এটির সমস্ত বস্তুর মধ্যে ইন্টারফেসটিকে জোর করে। ভাষা প্রয়োজন হলে বিমূর্ততা ফুটো করতে পারে না।


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

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

@ কোডস ইনচাউস - আহ হ্যাঁ, আমি মনে করি এটি সত্য true
তেলস্তিন

@ লজ্যাকম্যান: যে শ্রেণীর জন্য বিশেষ ধ্বংস প্রয়োজন, যে কেউ এর নির্মাতাকে কল করে যে এটি সম্পন্ন হয়েছে তা নিশ্চিত করার জন্য তার উপর বোঝা চাপিয়ে দেয়। এটি একটি এলএসপি লঙ্ঘন তৈরি করে না যেহেতু DerivedFooThatRequiresSpecialDestructionকেবলমাত্র কোনও কোড কল করে যা তৈরি করতে পারে new DerivedFooThatRequiresSpecialDestruction()। অন্যদিকে, একটি কারখানার পদ্ধতি যা কোনও DerivedFooThatRequiresSpecialDestructionকোডে ফিরে আসে যা ধ্বংসের প্রয়োজনের জন্য প্রত্যাশা করে না, এটি একটি এলএসপি লঙ্ঘন হবে।
সুপারক্যাট

0

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

হাতে চক্র দেখার জন্য অন্তর্ভুক্ত বা স্বচ্ছ নয়। একমাত্র ব্যতিক্রম এমন একটি ভাষা সহ একটি রেফারেন্স গণনা পদ্ধতি যা ডিজাইনের মাধ্যমে চক্রকে নিষিদ্ধ করে। এরলং এ জাতীয় সিস্টেমের উদাহরণ হতে পারে।

সুতরাং উভয় পদ্ধতির ফাঁস। মূল পার্থক্য হ'ল ডেস্ট্রাক্টররা সি ++ এ সর্বত্র ফাঁস IDisposeহন তবে নেট। নেটে খুব বিরল।


1
চক্রগুলি অত্যন্ত বিরল এবং ব্যবহারিকভাবে কখনই ডেটা স্ট্রাকচারের বাইরে ঘটে যা স্পষ্টভাবে চক্রাকার lic মূল পার্থক্যটি হ'ল সি ++ এ ধ্বংসকারীরা সর্বত্র যথাযথভাবে পরিচালিত হয় তবে আইডিপস কমই .NET এ সমস্যাটি পরিচালনা করে।
ডেড এমজি

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