পিপিম্প আইডিয়ামটি কি বাস্তবে অনুশীলনে ব্যবহৃত হয়?


165

আমি হার্ব সুটারের "ব্যতিক্রমী সি ++" বইটি পড়ছি এবং সেই বইটিতে আমি পিআইএমপিএল প্রতিবাদ সম্পর্কে শিখেছি। মূলত, ধারণাটি হ'ল কোনওটির privateঅবজেক্টের জন্য একটি কাঠামো তৈরি করা classএবং সংকলনের সময় হ্রাস করতে গতিশীলভাবে তাদের বরাদ্দ করা (এবং আরও ভাল পদ্ধতিতে ব্যক্তিগত বাস্তবায়নগুলি আড়াল করা)।

উদাহরণ স্বরূপ:

class X
{
private:
  C c;
  D d;  
} ;

এতে পরিবর্তন করা যেতে পারে:

class X
{
private:
  struct XImpl;
  XImpl* pImpl;       
};

এবং, সিপিতে, সংজ্ঞা:

struct X::XImpl
{
  C c;
  D d;
};

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

আমার কি এটি সর্বত্র ব্যবহার করা উচিত, বা সতর্কতার সাথে? এবং এই কৌশলটি এম্বেড থাকা সিস্টেমে (যেখানে পারফরম্যান্সটি খুব গুরুত্বপূর্ণ) ব্যবহার করার পরামর্শ দেওয়া হচ্ছে?


এটি কি মূলত সিদ্ধান্ত নেওয়ার মতো যে এক্সটি একটি (বিমূর্ত) ইন্টারফেস, এবং এক্সিম্পল বাস্তবায়ন? struct XImpl : public X। এটি আমার কাছে আরও স্বাভাবিক অনুভূত হয়। আমি মিস করেছি এমন আরও কিছু সমস্যা আছে?
অ্যারন ম্যাকডেইড

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

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

30
সি ++ এ, পিম্পলটি const unique_ptr<XImpl>পরিবর্তে প্রয়োগ করা উচিত XImpl*
নিল জি

1
"এর আগে এই ধরণের পদ্ধতির আগে কখনও দেখেনি, আমি যে সংস্থাগুলি কাজ করেছি তাদের মধ্যেও নেই, না ওপেন সোর্স প্রকল্পগুলিতেও"। কিউটি খুব কমই এটি ব্যবহার করছে না।
ম্যানুয়েলস্কিনিড 3 ই

উত্তর:


132

সুতরাং, আমি ভাবছি যে এই কৌশলটি বাস্তবে বাস্তবে ব্যবহৃত হয়? আমার কি এটি সর্বত্র ব্যবহার করা উচিত, বা সতর্কতার সাথে?

অবশ্যই এটি ব্যবহৃত হয়। আমি আমার প্রকল্পে এটি প্রায় প্রতিটি ক্লাসে ব্যবহার করি।


পিআইএমপিএল আইডিয়ামটি ব্যবহারের কারণগুলি:

বাইনারি সামঞ্জস্য

আপনি যখন একটি লাইব্রেরি বিকাশ করছেন, আপনি XImplআপনার ক্লায়েন্টের সাথে বাইনারি সামঞ্জস্যতা (যার অর্থ ক্র্যাশগুলি বোঝায়!) ভঙ্গ না করে ক্ষেত্রগুলি যুক্ত / সংশোধন করতে পারেন । Xআপনি যখন Ximplক্লাসে নতুন ক্ষেত্র যুক্ত করবেন তখন ক্লাসের বাইনারি বিন্যাস পরিবর্তন হয় না , তাই ছোটখাটো সংস্করণ আপডেটে লাইব্রেরিতে নতুন কার্যকারিতা যুক্ত করা নিরাপদ।

অবশ্যই, আপনি বাইনারি সামঞ্জস্যতা ভঙ্গ করে X/ XImplছাড়াই নতুন সরকারী / বেসরকারী নন-ভার্চুয়াল পদ্ধতিগুলি যুক্ত করতে পারেন তবে এটি স্ট্যান্ডার্ড শিরোনাম / বাস্তবায়ন কৌশলটির সাথে সমান।

তথ্য গোপন করা হচ্ছে

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

সংকলনের সময়

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

স্ট্যান্ডার্ড শিরোনাম / বাস্তবায়ন কৌশল (পিআইএমপিএল ব্যতীত) এর সাথে আপনি যখন নতুন ক্ষেত্র যুক্ত করেন তখন Xযে ক্লায়েন্ট কখনও বরাদ্দ করে X(স্ট্যাক বা গাদাতে থাকে) তা পুনরায় সংযুক্ত করা দরকার, কারণ এটি অবশ্যই বরাদ্দের আকার সামঞ্জস্য করতে পারে। ঠিক আছে, প্রতিটি ক্লায়েন্ট যা কখনই এক্স বরাদ্দ করে না সেগুলি আবারও সংকলন করা দরকার, তবে এটি কেবল ওভারহেড (ক্লায়েন্টের ফলস্বরূপ কোডটি একই হবে)।

আর কী, XClient1.cppপ্রাইভেট পদ্ধতি X::foo()যুক্ত করা Xএবং X.hপরিবর্তিত হওয়া সত্ত্বেও স্ট্যান্ডার্ড শিরোনাম / প্রয়োগের সাথে পৃথকীকরণ পুনরায় সংযুক্ত করা দরকার , যদিও XClient1.cppএ্যাঙ্ক্যাপসুলেশন কারণে সম্ভবত এই পদ্ধতিটি কল করতে পারে না! উপরের মত এটিও খাঁটি ওভারহেড এবং বাস্তব জীবনের সি ++ বিল্ড সিস্টেমগুলি কীভাবে কাজ করে তা সম্পর্কিত।

অবশ্যই, যখন আপনি কেবলমাত্র পদ্ধতিগুলির বাস্তবায়নটি সংশোধন করেন তখন পুনঃসংশোধনের প্রয়োজন হয় না (কারণ আপনি শিরোনামটি স্পর্শ করেন না), তবে এটি স্ট্যান্ডার্ড শিরোনাম / বাস্তবায়ন কৌশল হিসাবে সমান।


এই কৌশলটি এম্বেড থাকা সিস্টেমে (যেখানে পারফরম্যান্সটি খুব গুরুত্বপূর্ণ) ব্যবহার করার পরামর্শ দেওয়া হচ্ছে?

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


16
+1 কারণ এটি যে সংস্থায় আমি কাজ করি সেগুলিতেও এটি ব্যাপকভাবে ব্যবহৃত হয় এবং একই কারণে।
বেনোইট

9
এছাড়াও, বাইনারি সামঞ্জস্যতা
আম্বরোজ বিজ্জাক

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

8
আরও বেশি, pimpl idiom Qt এর সাহায্যে একক বড় সংস্করণের মধ্যে (বেশিরভাগ ক্ষেত্রে) উভয় সামনের সামনের সামনের সামনের সামনের সামঞ্জস্য বজায় রাখতে পারে। আইএমও এটি এখন পর্যন্ত এটি ব্যবহারের সবচেয়ে উল্লেখযোগ্য কারণ।
হোয়াইটকায়ার্ক

1
প্ল্যাটফর্ম-নির্দিষ্ট কোড প্রয়োগের ক্ষেত্রেও এটি কার্যকর, কারণ আপনি একই এপিআই বজায় রাখতে পারেন।
ডক

49

দেখে মনে হয় যে অনেকগুলি লাইব্রেরি তাদের এপিআইতে স্থির থাকতে কমপক্ষে কয়েকটি সংস্করণের জন্য এটি ব্যবহার করে।

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

এটি আপনাকে যে সুবিধা দিতে পারে তা হ'ল :

  • ভাগ করা লাইব্রেরির বাইনারি সামঞ্জস্য রাখতে সহায়তা করে
  • কিছু অভ্যন্তরীণ বিবরণ লুকানো
  • পুনঃসংশোধন চক্র হ্রাস

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

সম্ভাব্য অসুবিধাগুলি হ'ল (বাস্তবায়নের উপর নির্ভর করে এবং সেগুলি আপনার সত্যিকারের অসুবিধা কিনা তাও এখানে রয়েছে):

  • সাদামাটা বৈকল্পিকের চেয়ে বেশি বরাদ্দের কারণে মেমরির ব্যবহার বৃদ্ধি করুন
  • রক্ষণাবেক্ষণ প্রচেষ্টা বৃদ্ধি (আপনি কমপক্ষে ফরোয়ার্ডিং ফাংশন লিখতে হবে)
  • কর্মক্ষমতা হ্রাস (সংকলক এটি আপনার শ্রেণীর নির্বিকার প্রয়োগের সাথে সাথে স্টাফটিকে ইনলাইন করতে সক্ষম হতে পারে)

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

লিনাক্স statকলের জন্য আমার সি ++ র‍্যাপার । এখানে সি হেডার থেকে স্ট্রাক্ট আলাদা হতে পারে, কি #definesসেট করা আছে তার উপর নির্ভর করে । এবং যেহেতু আমার মোড়কের শিরোনাম তাদের সমস্তকে নিয়ন্ত্রণ করতে পারে না, তাই আমি কেবল #include <sys/stat.h>আমার .cxxফাইলে থাকি এবং এই সমস্যাগুলি এড়াতে পারি ।


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

5
@ জামেসকাঞ্জ: এমনকি আমি ব্যক্তিগতভাবে প্রথমে এক মুহুর্তের জন্য বসে ভাবব এবং মোড়কে #ifdefযতটা সম্ভব পাতলা করে তুলতে কিছু লোকের পক্ষে যথেষ্ট না ছিল তা নিয়ে ভাবতাম । তবে প্রত্যেকের লক্ষ্য আলাদা আলাদা, গুরুত্বপূর্ণ বিষয় হ'ল অন্ধভাবে কিছু অনুসরণ করার পরিবর্তে এটি নিয়ে চিন্তা করার সময় নেওয়া।
প্লাজমাএইচএইচ

31

অন্যান্য সমস্ত পণ্য সম্পর্কে সম্মত হন, তবে আমাকে প্রমাণ হিসাবে একটি সীমাবদ্ধ রাখুন: টেমপ্লেটগুলি দিয়ে ভাল কাজ করে না

কারণটি হ'ল টেমপ্লেট ইনস্ট্যান্টিশনের জন্য যেখানে ইনস্ট্যান্টেশন হয়েছিল সেখানে সম্পূর্ণ ঘোষণার প্রয়োজন হয়। (এবং এটিই সিপিপি ফাইলে সংজ্ঞায়িত টেম্পলেট পদ্ধতিগুলি না দেখানোর মূল কারণ)

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

ক্লাসিক ওওপি (উত্তরাধিকার ভিত্তিক) জন্য একটি ভাল দৃষ্টান্ত তবে জেনেরিক প্রোগ্রামিংয়ের জন্য নয় (বিশেষীকরণ ভিত্তিক)।


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

22

অন্যান্য লোকেরা ইতিমধ্যে প্রযুক্তিগত আপ / ডাউনসাইড সরবরাহ করেছে তবে আমি মনে করি যে নিম্নলিখিতগুলি লক্ষণীয়:

প্রথম এবং সর্বাগ্রে, মতবাদী হবেন না। "যেহেতু এটা ভাল OO যেমন পণ্য এটা ব্যবহার করবেন না শুধু কারণ - pImpl আপনার অবস্থা জন্য কাজ করে, তাহলে এটি ব্যবহার সত্যিই : ইত্যাদি সি ++ প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী বরাত দিয়ে বাস্তবায়ন লুকায়"

এনক্যাপসুলেশন কোডের জন্য, লোকে নয় ( উত্স )

OpenThreads, থ্রেডিং দ্বারা ব্যবহৃত লাইব্রেরি: শুধু তুমি কোথায় এটা ব্যবহার করা হয় ওপেন সোর্স সফটওয়্যার এর একটি উদাহরণ এবং কেন দিতে OpenSceneGraph । মূল ধারণাটি হ্যাডার থেকে (উদাঃ <Thread.h>) সমস্ত প্ল্যাটফর্ম-নির্দিষ্ট কোড থেকে সরিয়ে ফেলা হয় , কারণ অভ্যন্তরীণ স্টেট ভেরিয়েবলগুলি (যেমন থ্রেড হ্যান্ডলগুলি) প্ল্যাটফর্ম থেকে প্ল্যাটফর্মের মধ্যে পৃথক। এইভাবে একজন অন্য প্ল্যাটফর্মের আইডিয়োসিঙ্ক্রেসিগুলির কোনও জ্ঞান ছাড়াই আপনার লাইব্রেরির বিরুদ্ধে কোড সংকলন করতে পারে, কারণ সবকিছু গোপন রয়েছে।


12

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

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


"প্রয়োগের পদ্ধতিগুলি অ্যাক্সেস করার জন্য অতিরিক্ত স্তরের ইন্ডিয়ারেশন প্রয়োজন" " এইটা?
xaxxon

@ এক্স্যাক্সসন হ্যাঁ, এটি। পদ্ধতিগুলি নিম্ন স্তরের হলে পিম্পল ধীর হয়। উদাহরণস্বরূপ, এমন স্টাফের জন্য কখনও এটি ব্যবহার করবেন না।
এরিক আরোনাস্টি

@ এক্সএক্সএক্সন আমি সাধারণ ক্ষেত্রে বলব একটি অতিরিক্ত স্তর প্রয়োজন। ইনলাইনিং যদি না চেয়ে সঞ্চালিত হয়। তবে ইনলিংনিং কোনও আলাদা ডিএল-তে সংকলিত কোডের বিকল্প নয়।
গীতা

5

আমি মনে করি এটি ডিউপলিংয়ের অন্যতম মৌলিক সরঞ্জাম।

আমি এম্বেডড প্রোজেক্টে (সেটটপবক্স) পিম্পল (এবং ব্যতিক্রমী সি ++ থেকে অনেক অন্যান্য আইডিয়াম) ব্যবহার করছিলাম।

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


4

আমি আগে এই কৌশলটি ব্যবহার করতাম তবে নিজেকে এ থেকে দূরে সরে যেতে দেখলাম।

অবশ্যই আপনার শ্রেণীর ব্যবহারকারীদের কাছ থেকে বাস্তবায়ন বিশদটি গোপন করা ভাল ধারণা। তবে আপনি ক্লাসের ব্যবহারকারীদের একটি বিমূর্ত ইন্টারফেস ব্যবহার করতে এবং প্রয়োগের বিশদটি কংক্রিট শ্রেণি হিসাবে পেয়েও এটি করতে পারেন।

পিপিমিলের সুবিধাগুলি হ'ল:

  1. এই ইন্টারফেসটির কেবলমাত্র একটি বাস্তবায়ন রয়েছে বলে ধরে নেওয়া, বিমূর্ত শ্রেণি / কংক্রিট প্রয়োগ না করে এটি পরিষ্কার

  2. আপনার যদি ক্লাসগুলির একটি স্যুট থাকে (একটি মডিউল) যেমন বেশ কয়েকটি ক্লাস একই "ইমপ্ল্লি" অ্যাক্সেস করে তবে মডিউলটির ব্যবহারকারীরা কেবল "এক্সপোজড" ক্লাস ব্যবহার করবেন।

  3. এটি কোনও খারাপ জিনিস হিসাবে ধরে নেওয়া হলে কোনও ভি-টেবিল নেই।

আমি পিআইএমপিএল-এর যে অসুবিধাগুলি পেয়েছি (যেখানে বিমূর্ত ইন্টারফেসটি আরও ভাল কাজ করে)

  1. যদিও আপনার কেবলমাত্র একটি "উত্পাদন" বাস্তবায়ন থাকতে পারে, একটি বিমূর্ত ইন্টারফেস ব্যবহার করে আপনি ইউনিট টেস্টিংয়ে কাজ করে এমন একটি "মক" অন্তর্নিবেশও তৈরি করতে পারেন।

  2. (সবচেয়ে বড় ইস্যু)। অনন্য_পিটার এবং চলমান দিনগুলির আগে আপনি পিআইএমপিএল কীভাবে সংরক্ষণ করবেন সে সম্পর্কে আপনার পছন্দগুলি সীমাবদ্ধ ছিল। একটি কাঁচা পয়েন্টার এবং আপনার ক্লাসটি অনুলিপিযোগ্য হওয়ার বিষয়ে সমস্যা ছিল had একজন পুরানো অটো_পিটার এগিয়ে ঘোষিত শ্রেণীর সাথে কাজ করবে না (যাইহোক সমস্ত সংকলকগুলিতে নয়)। সুতরাং লোকেরা শেয়ারড_পিটার ব্যবহার শুরু করেছে যা আপনার শ্রেণি অনুলিপিযোগ্য তৈরিতে দুর্দান্ত ছিল তবে অবশ্যই উভয় অনুলিপি একই রকম অন্তর্নিহিত শেয়ারড_পিটার পেয়েছিল যা আপনি আশা করতে পারেন না (একটিতে সংশোধন করুন এবং উভয়ই সংশোধিত হয়েছে)। সুতরাং সমাধানটি প্রায়শই অভ্যন্তরীণটির জন্য কাঁচা পয়েন্টার ব্যবহার করে শ্রেণিটিকে অনুলিপিযোগ্য করে তোলা এবং তার পরিবর্তে একটি ভাগ করা_পিটার ফিরিয়ে দেওয়া হয়। নতুন দুটি কল। (প্রকৃতপক্ষে 3 টি দেওয়া পুরানো শেয়ার_পিটার আপনাকে দ্বিতীয়টি দিয়েছে)।

  3. টেকনিক্যালি সত্যই কনস্ট-সঠিক নয় কারণ কোনও সদস্য পয়েন্টারের মাধ্যমে স্থিরতা প্রচার করা হয়নি।

সাধারণভাবে আমি তাই বছরগুলিতে পিপিম্পল থেকে এবং তার পরিবর্তে অ্যাবস্ট্রাক্ট ইন্টারফেসের ব্যবহারে (এবং উদাহরণ তৈরি করার জন্য কারখানার পদ্ধতি) সরে এসেছি।


3

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


3

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


2

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

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

প্রায় সব ডিজাইনের সিদ্ধান্ত হিসাবে যেমন একটি ভাল এবং কনস।


9
এটি বোবা তবে এটি টাইপ করা হয়েছে ... আপনি ডিবাগারে কোডটি কেন অনুসরণ করতে পারবেন না?
আঙ্কেলজিভ

2
সাধারণভাবে বলতে গেলে, কিউটি কোডে ডিবাগ করার জন্য আপনাকে নিজেই কিউটি তৈরি করতে হবে। একবার আপনি হয়ে গেলে, পিআইএমপিএল পদ্ধতিগুলিতে পদক্ষেপ নেওয়া এবং পিআইএমপিএল ডেটার সামগ্রীগুলি পরীক্ষা করার কোনও সমস্যা নেই।
মনিকা

0

একটি সুবিধা আমি দেখতে পাচ্ছি তা হ'ল এটি প্রোগ্রামারকে বেশ দ্রুত গতিতে কিছু নির্দিষ্ট ক্রিয়াকলাপ প্রয়োগ করতে দেয়:

X( X && move_semantics_are_cool ) : pImpl(NULL) {
    this->swap(move_semantics_are_cool);
}
X& swap( X& rhs ) {
    std::swap( pImpl, rhs.pImpl );
    return *this;
}
X& operator=( X && move_semantics_are_cool ) {
    return this->swap(move_semantics_are_cool);
}
X& operator=( const X& rhs ) {
    X temporary_copy(rhs);
    return this->swap(temporary_copy);
}

পিএস: আমি আশা করি আমি মুভ শব্দার্থবিজ্ঞানের ভুল বোঝাবুঝি না।

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