পিম্পল আইডিয়াম বনাম পিওর ভার্চুয়াল ক্লাস ইন্টারফেস


118

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

আমি বুঝতে পারি যে পিম্পল আইডিয়ম প্রতিটি পাবলিক পদ্ধতি এবং অবজেক্ট তৈরির ওভারহেডের জন্য একটি স্পষ্টত অতিরিক্ত ইন্ডাইরেশন নিয়ে আসে।

অন্যদিকে খাঁটি ভার্চুয়াল ক্লাস উত্তরাধিকার সূত্রে বাস্তবায়নের জন্য অন্তর্নিহিত নির্দেশনা (vtable) নিয়ে আসে এবং আমি বুঝতে পারি যে কোনও বস্তু তৈরির ওভারহেড নেই।
সম্পাদনা করুন : তবে আপনি যদি বাইরে থেকে কোনও জিনিস তৈরি করেন তবে আপনাকে কারখানার প্রয়োজন হবে

খাঁটি ভার্চুয়াল ক্লাসটি পিম্পল আইডিয়মের চেয়ে কম পছন্দসই করে তোলে?


3
দুর্দান্ত প্রশ্ন, শুধু একই জিনিস জিজ্ঞাসা করতে চেয়েছিলেন। আরও দেখুন boost.org/doc/libs/1_41_0/libs/smart_ptr/sp_techniques.html
ফ্রাঙ্ক

উত্তর:


60

সি ++ ক্লাস লেখার সময় এটি ঠিক হবে কিনা তা চিন্তা করা উপযুক্ত

  1. একটি মান প্রকার

    মান দ্বারা অনুলিপি, পরিচয় কখনও গুরুত্বপূর্ণ নয়। এটি একটি স্টাডি :: মানচিত্রে চাবি হওয়া উপযুক্ত। উদাহরণস্বরূপ, একটি "স্ট্রিং" শ্রেণি, বা একটি "তারিখ" শ্রেণি বা একটি "জটিল সংখ্যা" শ্রেণি। এই জাতীয় শ্রেণীর উদাহরণগুলি "অনুলিপি করা" অর্থপূর্ণ makes

  2. একটি সত্তা টাইপ

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

পিআইএমপিএল এবং খাঁটি বিমূর্ত বেস ক্লাস উভয়ই সংকলনের সময় নির্ভরতা হ্রাস করার কৌশল।

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


6
দয়া করে এই উত্তরে পল ডি ভ্রিজের মন্তব্য দেখুন । পিম্পল এবং খাঁটি ভার্চুয়াল উল্লেখযোগ্যভাবে পৃথক হয় যদি আপনি কোনও লাইব্রেরিতে থাকেন এবং ক্লায়েন্টটি পুনর্নির্মাণ না করে আপনার .so / .dll অদলবদল করতে চান। ক্লায়েন্টরা নাম দিয়ে পিম্পল ফ্রন্টএন্ডসে লিঙ্ক করে তাই পুরাতন পদ্ধতির স্বাক্ষরগুলি রাখা যথেষ্ট। খাঁটি বিমূর্ত ক্ষেত্রে ওটিওএইচ তারা কার্যকরভাবে ভিটিবেল সূচক দ্বারা লিঙ্ক করে তাই পদ্ধতিগুলি পুনরায় সাজানো বা মাঝখানে সন্নিবেশ করায় সামঞ্জস্যতা ভেঙে যায়।
11:30 এ স্নেক করুন

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

31

Pointer to implementationসাধারণত কাঠামোগত বাস্তবায়ন বিবরণ গোপন সম্পর্কে about Interfacesবিভিন্ন বাস্তবায়ন ইনস্ট্যান্সিং সম্পর্কে হয়। তারা সত্যিই দুটি ভিন্ন উদ্দেশ্যে পরিবেশন।


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

14
তবে আপনি প্রয়োগের বিশদটি
দ্বিগুণ

6
আপনি যখন কোনও ইন্টারফেস ব্যবহার করে পিম্পল বাস্তবায়ন করতে পারেন তবে প্রায়শই প্রয়োগের বিবরণ ডিকুয়াল করার কোনও কারণ নেই। তাই বহুমুখী হওয়ার কোনও কারণ নেই। কারণ pimpl জন্য বাস্তবায়ন বিবরণ ক্লায়েন্ট থেকে দূরে রাখা (C ++ তাদের শিরোনামের বার করার জন্য) হয়। আপনি এটি একটি বিমূর্ত বেস / ইন্টারফেস ব্যবহার করে করতে পারেন, তবে সাধারণত এটি অপ্রয়োজনীয় ওভারকিল।
মাইকেল বারার

10
ওভারকিল কেন? আমি বলতে চাইছি, এটি পিম্পলটির চেয়ে ইন্টারফেস পদ্ধতিটি ধীর? যৌক্তিক কারণ থাকতে পারে, তবে ব্যবহারিক দৃষ্টিকোণ থেকে আমি এটি একটি বিমূর্ত ইন্টারফেস দিয়ে এটি করা সহজ বলব
আরকাইটজ জিমনেজ

1
আমি বলব অ্যাবস্ট্রাক্ট বেস ক্লাস / ইন্টারফেস হ'ল জিনিসগুলি করার "সাধারণ" উপায় এবং উপহাসের মাধ্যমে সহজ পরীক্ষার অনুমতি দেয়
পলম

28

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

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


17

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

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

একমাত্র ত্রুটি ( আমি এটি নিয়ে তদন্ত করার চেষ্টা করছি ) এটি হ'ল পিম্পল আইডিয়মটি দ্রুততর হতে পারে

  1. প্রক্সি-কলগুলি যখন ইনলাইন করা হয়, উত্তরাধিকার সূত্রে যখন প্রয়োজন হয় তখন রানটাইমের সময় VTABLE অবজেক্টটিতে অতিরিক্ত অ্যাক্সেসের প্রয়োজন হয়
  2. মেমরির পদচিহ্নগুলি পিম্পল পাবলিক-প্রক্সি-ক্লাসটি ছোট (আপনি দ্রুত অদলবদল এবং অন্যান্য অনুরূপ অপ্টিমাইজেশনের জন্য সহজেই অপ্টিমাইজেশন করতে পারেন)

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

1
^ এখানে এই মন্তব্যটি একটি স্টিকি হওয়া উচিত should
কোডআঙ্গারি

10

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


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

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

"ব্যক্তিগত পদ্ধতিগুলি গোপন করার বিষয়টি আমি একটি অদ্ভুত প্যারানোইয়া হিসাবে পেয়েছি" এটি নির্ভর করে না যদি নির্ভরতা পরিবর্তিত হয় তবে নির্ভরতাগুলি লুকিয়ে রাখার জন্য এবং তাই সংকলনের সময়কে হ্রাস করতে দেয় না?
pooya13

ফ্যাক্টরিগুলি কীভাবে পিআইএমপিএল থেকে পুনরায় ফ্যাক্টর করা সহজ তা আমিও বুঝতে পারি না। আপনি উভয় ক্ষেত্রে "ইন্টারফেস" রেখে বাস্তবায়ন পরিবর্তন করবেন না? কারখানায় আপনাকে একটি .h এবং একটি .cpp ফাইল পরিবর্তন করতে হবে এবং pImpl এ আপনাকে একটি .h এবং দুটি .cpp ফাইল সংশোধন করতে হবে তবে এটি প্রায় এবং আপনাকে সাধারণত পিআইএমপিএল এর ইন্টারফেসের সিপিপি ফাইলটি পরিবর্তন করতে হবে না।
pooya13

8

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

সমস্যাটি বিস্তারিতভাবে ব্যাখ্যা করতে, আপনার ভাগ করা লাইব্রেরি / শিরোনামে নিম্নলিখিত কোডটি বিবেচনা করুন:

// header
struct A
{
public:
  A();
  // more public interface, some of which uses the int below
private:
  int a;
};

// library 
A::A()
  : a(0)
{}

ভাগ গ্রন্থাগার যে পূর্ণসংখ্যা এর ঠিকানা হিসাব মধ্যে কম্পাইলার নিঃসরণ করে কোড (সম্ভবত এই ক্ষেত্রে শূন্য কারণ এটি শুধুমাত্র সদস্য) একটি নির্দিষ্ট অফসেট হতে সক্রিয়া হতো তার বস্তুর এটা হতে জানে পয়েন্টার থেকে this

কোডটির ব্যবহারকারীর দিকে, একটি new Aপ্রথমে sizeof(A)মেমরির বাইটগুলি বরাদ্দ করবে , তারপরে সেই মেমোরিটির জন্য একটি পয়েন্টারকে A::A()কনস্ট্রাক্টর হিসাবে হস্তান্তর করবে this

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

পিম্পলিংয়ের মাধ্যমে, আপনি ভাগ করে নেওয়া লাইব্রেরিতে মেমরির বরাদ্দ এবং কনস্ট্রাক্টর কল হওয়ায় আপনি নিরাপদভাবে অভ্যন্তরীণ শ্রেণিতে ডেটা সদস্যদের যুক্ত করতে বা মুছতে পারেন:

// header
struct A
{
public:
  A();
  // more public interface, all of which delegates to the impl
private:
  void * impl;
};

// library 
A::A()
  : impl(new A_impl())
{}

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

সম্পাদনা: আমার সম্ভবত যুক্ত করা উচিত যে আমি এখানে নির্মাণকারীর কথা বলার একমাত্র কারণ হ'ল আমি আরও কোড সরবরাহ করতে চাইনি - একই যুক্তি ডেটা সদস্যদের অ্যাক্সেস করে এমন সমস্ত ফাংশনে প্রযোজ্য।


4
অকার্যকর * এর পরিবর্তে, আমি বাস্তবায়নকারী শ্রেণি ঘোষণা করা আরও traditionalতিহ্যবাহী বলে মনে করি:class A_impl *impl_;
ফ্রাঙ্ক ক্রুয়েগার

9
আমি বুঝতে পারছি না, আপনার কোনও ইন্টারফেস হিসাবে ব্যবহার করার ইচ্ছা রয়েছে এমন ভার্চুয়াল খাঁটি শ্রেণিতে আপনি ব্যক্তিগত সদস্যদের ঘোষণা করবেন না, এই ধারণাটি হ'ল ক্লাসটি pruely বিমূর্ত রাখুন, কোনও আকার হবে না, কেবল খাঁটি ভার্চুয়াল পদ্ধতি আছে, আমি কিছুই দেখছি না আপনি ভাগ করা লাইব্রেরিগুলির মাধ্যমে করতে পারবেন না
আরকাইৎজ জিমনেজ

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

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

10
আপনার আনসারের প্রথম বাক্যটি বোঝায় যে কোনও সম্পর্কিত কারখানা পদ্ধতিযুক্ত খাঁটি ভার্চুয়ালগুলি আপনাকে কোনওভাবে শ্রেণীর অভ্যন্তরীণ অবস্থার আড়াল করতে দেয় না। এটা সত্যি না. দুটি কৌশলই আপনাকে শ্রেণীর অভ্যন্তরীণ অবস্থাটি আড়াল করতে দেয়। পার্থক্যটি এটি ব্যবহারকারীর কাছে কীভাবে দেখায়। পিআইএমপিএল আপনাকে এখনও মূল্য শব্দার্থবিজ্ঞান সহ একটি শ্রেণির প্রতিনিধিত্ব করতে অনুমতি দেয় তবে অভ্যন্তরীণ অবস্থাও গোপন করে। খাঁটি অ্যাবস্ট্রাক্ট বেস ক্লাস + কারখানার পদ্ধতি আপনাকে সত্তার ধরণের প্রতিনিধিত্ব করতে দেয় এবং আপনাকে অভ্যন্তরীণ অবস্থার আড়াল করতে দেয়। পরেরটি হ'ল সিওএম কীভাবে কাজ করে। "এসেনশিয়াল সিওএম" এর ১ ম অধ্যায়ে এ সম্পর্কে দুর্দান্ত ধারণা রয়েছে।
পল হোলিংসওয়ার্থ

6

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


3

যদিও অন্যান্য উত্তরগুলিতে বিস্তৃতভাবে আচ্ছাদিত আমি সম্ভবত ভার্চুয়াল বেস ক্লাসগুলির চেয়ে পিম্পলের এক সুবিধা সম্পর্কে কিছুটা আরও স্পষ্ট হতে পারি:

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

// Pimpl
Object pi_obj(10);
std::cout << pi_obj.SomeFun1();

std::vector<Object> objs;
objs.emplace_back(3);
objs.emplace_back(4);
objs.emplace_back(5);
for (auto& o : objs)
    std::cout << o.SomeFun1();

// Abstract Base Class
auto abc_obj = ObjectABC::CreateObject(20);
std::cout << abc_obj->SomeFun1();

std::vector<std::shared_ptr<ObjectABC>> objs2;
objs2.push_back(ObjectABC::CreateObject(13));
objs2.push_back(ObjectABC::CreateObject(14));
objs2.push_back(ObjectABC::CreateObject(15));
for (auto& o : objs2)
    std::cout << o->SomeFun1();

2

আমার বুঝতে এই দুটি জিনিস সম্পূর্ণ ভিন্ন উদ্দেশ্যে পরিবেশন করে। পিম্পল আইডিয়মের উদ্দেশ্যটি মূলত আপনাকে আপনার প্রয়োগের জন্য একটি হ্যান্ডেল দেয় যাতে আপনি কোনও ধরণের জন্য দ্রুত অদলবদলের মতো কাজ করতে পারেন।

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

আপেল এবং কমলা সত্যিই।


আমি আপেল / কমলা দিয়ে একমত তবে দেখা যাচ্ছে যে আপনি একটি কার্যকরী জন্য pImpl ব্যবহার করেন। আমার লক্ষ্যটি বেশিরভাগ বিল্ড-টেকনিক্যাল এবং তথ্য গোপন করা।
xtofl

2

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

বিশেষত "বিল্ড টাইমস" এমন একটি সমস্যা যা আপনি আরও ভাল হার্ডওয়্যার দ্বারা বা Incredibuild (www.incredibuild.com এর মতো সরঞ্জামগুলি ইতিমধ্যে ভিজ্যুয়াল স্টুডিও 2017 এর অন্তর্ভুক্ত) ব্যবহার করে সমাধান করতে পারেন, সুতরাং এটি আপনার সফ্টওয়্যার নকশাকে প্রভাবিত করবে না। সফ্টওয়্যারটি যেভাবে তৈরি হয়েছে তার থেকে সফটওয়্যার ডিজাইনটি সাধারণত স্বতন্ত্র হওয়া উচিত।


আপনি বিকাশকারী সময় দিয়ে যখন বিল্ড সময় 2 এর পরিবর্তে 20 মিনিট সময় প্রদান করেন, তাই এটির ভারসাম্য কিছুটা হলেও আসল মডিউল সিস্টেমটি এখানে অনেক সহায়তা করবে।
আরকাইৎজ জিমেনিজ

আইএমএইচও, যেভাবে সফ্টওয়্যারটি তৈরি করা হয়েছে তাতে অভ্যন্তরীণ নকশাকে মোটেই প্রভাবিত করা উচিত নয়। এটি সম্পূর্ণ ভিন্ন সমস্যা।
ট্রান্টার

2
বিশ্লেষণ করা কি শক্ত করে তোলে? ইমপ্লের ক্লাসে ফরোয়ার্ড করা একটি বাস্তবায়ন ফাইলে কলগুলির একটি গোছা শক্ত শোনায় না।
mabraham

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

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