আরম্ভের পদ্ধতিটি এড়িয়ে চলুন


12

আমার এই বিদ্যমান কোডটি রয়েছে যেখানে তাদের ক্লাস এবং সেই শ্রেণিতে একটি সূচনা পদ্ধতি রয়েছে। আশা করা যায় যে ক্লাসের অবজেক্টটি তৈরি হয়ে গেলে, তাদের এটিকে আরম্ভ করার আহ্বান জানাতে হবে।

প্রাথমিক পদ্ধতিটি কেন বিদ্যমান তা কারণটি বিশ্বব্যাপী স্কোপ পেতে প্রাথমিকভাবে তৈরি হয়ে যায় এবং তারপরে ডিএল লোড করার পরে প্রাথমিক পদ্ধতিটি পরে ডাকা হয় যা এটি নির্ভর করে।

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

একটি সম্ভাব্য সমাধান কনস্ট্রাক্টর এ আরম্ভ করুন। বিশ্বব্যাপী সুযোগে কেবলমাত্র একটি পয়েন্টার রয়েছে। ডেল লোড হওয়ার পরে আসল অবজেক্টটি তৈরি করুন।

উপরের সমাধান সহ ইস্যু করুন যে কেউ এই শ্রেণীর একটি অবজেক্ট তৈরি করে তা জানতে হবে যে এটি ডেল লোড হওয়ার পরেই তৈরি করা উচিত অন্যথায় এটি ব্যর্থ হবে।

এটা কি গ্রহণযোগ্য?


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

3
বোকা প্রশ্ন # 1: অবজেক্ট কনস্ট্রাক্টর যদি ডিএলএল ইতিমধ্যে লোড না করে তবে কেন লোড করতে পারে না?
জন আর স্ট্রোহম

1
পুরানো প্রশ্নের পুনরুত্থানের জন্য ক্ষমা প্রার্থনা করুন, তবে 2017 সালের মধ্যে কেউ যদি এটি পড়ছে তবে C ++ 11 এ ব্যবহার করুনcall_once । যে প্রকল্পগুলি এখনও সি ++ 11 এ নেই তাদের কে সি ++ 11 (কী সমস্যাটি সমাধান করে এবং তারপরে কীভাবে ফোকাস করা হয়) কীভাবে কল_অনসেস বাস্তবায়িত হবে তা অধ্যয়ন করা উচিত এবং তারপরে এটি তাদের সি (+) বাসির স্বাদে পুনরায় বাস্তবায়ন করা উচিত। এটির জন্য একটি বহু-থ্রেড নিরাপদ সিঙ্ক্রোনাইজেশন আদিম প্রয়োজন, যার রাজ্যটি স্থিতিশীলভাবে শুরু করতে হবে (ধ্রুবক মান সহ)। নোট করুন যে প্রাক-সি ++ 11 সংকলকগুলিতে অন্যান্য আইডিয়াসনক্রিয়া থাকতে পারে যা সন্তুষ্ট হওয়া দরকার।
রওয়ং

উত্তর:


7

ভার্চুয়াল প্রক্সি জন্য একটি কাজের মত শোনাচ্ছে।

আপনি প্রশ্নে থাকা অবজেক্টের রেফারেন্স যুক্ত ভার্চুয়াল প্রক্সি তৈরি করতে পারেন। ডিএলএল কোনও লোড না থাকা অবস্থায়, প্রক্সি ক্লায়েন্টদের নির্দিষ্ট ডিফল্ট আচরণের প্রস্তাব দিতে পারে, একবার ডিএলএল লোড হয়ে গেলে প্রক্সিটি সমস্ত অনুরোধগুলি কেবল আসল বিষয়টিতে ফরোয়ার্ড করে দেবে।

ভার্চুয়াল প্রক্সিটি ডিএলএল সূচনা পরীক্ষা করার জন্য দায়বদ্ধ এবং এর ভিত্তিতে সিদ্ধান্তটি স্থির করে যদি অনুরোধটি আসল বিষয়ে প্রেরণ করা উচিত।

উইকিপিডিয়ায় প্রক্সি প্যাটার্ন

আপনি এই ধারণাটি পছন্দ করেন?


আপনি সত্যিই এখানে অনেক সমাধান করবেন না। প্রকৃত অবজেক্টে যুক্ত প্রতিটি পদ্ধতির জন্য আপনাকে সেই পদ্ধতিটি প্রক্সিতে যুক্ত করতে হবে। কোন?

এটি ডিআর কল করতে মনে রাখার সমস্যা এড়ায়। ফাংশন, তবে প্রক্সির প্রতিটি ফাংশনের কাছে এখনও .dll লোড হয়েছে কিনা তা পরীক্ষা করে দেখার দরকার রয়েছে বলে মনে হয়।

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

@ এডালোরজো: ধারণাটি ভাল হওয়ার পরে, এখানে সমস্যাটি হ'ল আমরা ইতিমধ্যে একটি প্রক্সি সম্পর্কে কথা বলছি, এবং ওপি তার প্রক্সিটির প্রতিটি পদ্ধতি পরীক্ষা করার বিষয়ে অভিযোগ করছে ...
ম্যাথিউ মিঃ

4

যদি ডিএলএল এখনও লোড না করা হয় তবে দরকারী কিছু হয় না; বস্তুটি কেবল একটি ত্রুটি তৈরি করে। এটা কি মারাত্মক ত্রুটি? ত্রুটিটি কীভাবে পরিচালনা করা হয়?

আপনার পরীক্ষার পদ্ধতিটি নিশ্চিত করে যে সমাপ্ত পণ্যটিতে এই ত্রুটিটি কখনই ঘটে না?

এটি আর্কিটেকচারাল ডিজাইনের জন্য নয়, পরীক্ষার জন্য কাজ বলে মনে হচ্ছে। কেবল একটি ত্রুটি ফিরিয়ে দেবেন না, assertএটি কখনই ঘটে না।

শ্রেণীর এমন কোনও ক্লায়েন্টকে স্থির করুন যা বর্তমানে ত্রুটিটিকে ধরা এবং উপেক্ষা করার চেষ্টা করে না এবং প্রথমে এটির কারণ হয় না।

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


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

2

প্রথম জিনিস: কীট হিসাবে বিশ্বব্যাপী বস্তুগুলি এড়িয়ে চলুন, যদি না তাদের রাষ্ট্র কখনও পরিবর্তন না করে (কনফিগারেশন)।

এখন, যদি আপনি এটির সাথে আটকে থাকেন, যে কোনও কারণেই হোক না কেন, বেশ কয়েকটি ডিজাইন রয়েছে যা সম্ভবত আপনাকে সহায়তা করতে পারে।

আমি দুটি ধারণা নিয়ে এসেছি:

  1. ডিএলএল লোড করতে একটি মুখোমুখি ব্যবহার করুন। অবজেক্টটি কেবল মুখের মাধ্যমে অ্যাক্সেস করা যেতে পারে, ফেকাডটি তৈরি করার সময় ডিএলএল লোড করে এবং একই সাথে অবজেক্টটি ইনস্ট্যান্ট করে দেয়।

  2. একটি প্রক্সি ব্যবহার করুন, তবে স্মার্ট ধরণের;)

আমাকে দ্বিতীয় পয়েন্টটি বিশদভাবে বলতে দাও, যেহেতু আমি আশঙ্কা করছি যে @ এডালোরজোর উত্তর আপনাকে ভয় পেয়েছে :

// Private
static Object& GetObjectImpl() { static Object O; return O; }

// Public
static Object& GetObject() {
  Object& o = GetObjectImpl();
  assert(o.isInitialized() && "Object not initialized yet!");
  return o;
}

এখন আপনার কাছে কেবল একটি চেক আছে।

এটি কিছু ধরণের স্মার্ট পয়েন্টারের মাধ্যমেও করা যেতে পারে:

Pointer<Object> o;

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


1

এটি একটি চতুর প্রশ্ন। আমি মনে করি যে আর্কিটেকচার সমস্যাটিতে সহায়তা করতে পারে।

প্রমাণ থেকে, শোনা যাচ্ছে যে প্রোগ্রামটি লোড হওয়ার সময় .dll লোড হয় না। এটি প্রায় একটি প্লাগইন মত শোনাচ্ছে।

একটি জিনিস মনে মনে আসে তা হল আপনাকে .dll আরম্ভ করতে হবে। প্রোগ্রামারকে ধরে নিতে হবে যে কোনওভাবেই বস্তুটি নির্ভরযোগ্যতার সাথে ফিরে আসবে না। আপনি এটি ( bool isObjectLoaded() { return isInitialized; }) এর সুবিধা নিতে সক্ষম হতে পারেন তবে আপনি অবশ্যই আপনার চেকগুলিতে আরও বাগ রিপোর্ট পাবেন reports

আমি একটি সিঙ্গলটনের কথা ভাবছিলাম।

আপনি যদি সিঙ্গলটনকে কল করেন তবে এটি সঠিক বস্তুটি ফিরিয়ে আনতে হবে যদি এটি পুনরুদ্ধার করতে পারে। যদি এটি সঠিক অবজেক্টটি ফিরিয়ে দিতে না পারে তবে আপনার কিছু ত্রুটি মান / নাল্প্ট্রার / খালি বেস অবজেক্টটি পাওয়া উচিত। যদিও বস্তুটি আপনার উপর মারা যেতে পারে তবে এটি কাজ করবে না।

এছাড়াও, যদি আপনার একাধিক উদাহরণের প্রয়োজন হয় তবে আপনি পরিবর্তে কারখানার মতো কিছু ব্যবহার করতে পারেন।

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