সিঙ্গলেটন, বিমূর্ত শ্রেণি এবং ইন্টারফেসের ভূমিকা কী?


13

আমি সি ++ এ ওওপি অধ্যয়ন করছি এবং যদিও এই 3 টি ধারণার সংজ্ঞা সম্পর্কে আমি সচেতন, এটি কখন বা কীভাবে ব্যবহার করতে হয় তা আমি সত্যিই বুঝতে পারি না।

উদাহরণস্বরূপ এই শ্রেণিটি ব্যবহার করা যাক:

class Person{
    private:
             string name;
             int age;
    public:
             Person(string p1, int p2){this->name=p1; this->age=p2;}
             ~Person(){}

             void set_name (string parameter){this->name=parameter;}                 
             void set_age (int parameter){this->age=parameter;}

             string get_name (){return this->name;}
             int get_age (){return this->age;}

             };

1. সিঙ্গলটন

কেমন ক্লাসের সীমাবদ্ধতা শুধুমাত্র এক বস্তু কাজ আছে না?

পারি আপনি যদি একটি বর্গ হবে যে ডিজাইন কেবলমাত্র 2 দৃষ্টান্ত? নাকি 3?

যখন সিঙ্গেলটন প্রস্তাবিত / প্রয়োজনীয় ব্যবহার করা হয়? এটা কি ভাল অনুশীলন?

2. বিমূর্ত শ্রেণি

আমি যতদূর জানি, যদি কেবলমাত্র একটি খাঁটি ভার্চুয়াল ফাংশন থাকে, ক্লাসটি বিমূর্ত হয়ে যায়। সুতরাং, যোগ করা হচ্ছে

virtual void print ()=0;

তাই না, তাই না?

আপনি কেন এমন শ্রেণীর প্রয়োজন যাঁর বস্তুর প্রয়োজন নেই?

3.Interface

যদি কোনও ইন্টারফেস কোনও বিমূর্ত শ্রেণি হয় যেখানে সমস্ত পদ্ধতি খাঁটি ভার্চুয়াল ফাংশন হয় তবে

এর মধ্যে ২ এর মধ্যে প্রধান পার্থক্য কী ?

আগাম ধন্যবাদ!


2
সিঙ্গলটন বিতর্কিত, বিভিন্ন মতামত পেতে এই সাইটে এটি অনুসন্ধান করুন।
উইনস্টন ইওয়ার্ট

2
এটিও লক্ষণীয় যে, বিমূর্ত ক্লাসগুলি ভাষার অংশ হলেও, একা বা একক ইন্টারফেস নয়। এগুলি এমন নিদর্শন যা মানুষ প্রয়োগ করে। বিশেষত সিঙ্গলটন এমন একটি জিনিস যা কাজ করার জন্য কিছুটা চালাক হ্যাকিংয়ের প্রয়োজন। (অবশ্যই আপনি কেবল কনভেনশন দ্বারা একটি সিঙ্গলটন তৈরি করতে পারেন))
রোবট

1
একবারে দয়া করে।
জেফো

উত্তর:


17

1. সিঙ্গলটন

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

কেবলমাত্র 2 বা 3 টি উদাহরণ থাকবে এমন শ্রেণি তৈরি করা পুরোপুরি সম্ভব as আপনি যখনই পুরো সিস্টেমটিতে এই শ্রেণীর একমাত্র উদাহরণ থাকা প্রয়োজন বোধ করেন তখনই আপনার সিঙ্গলটন ব্যবহার করা উচিত। এটি সাধারণত 'ম্যানেজারের' আচরণযুক্ত ক্লাসগুলিতে ঘটে।

আপনি যদি সিঙ্গলেটগুলি সম্পর্কে আরও জানতে চান তবে আপনি উইকিপিডিয়ায় এবং বিশেষত এই পোস্টে সি ++ এর জন্য শুরু করতে পারেন ।

এই প্যাটার্নটি সম্পর্কে অবশ্যই কিছু ভাল এবং খারাপ জিনিস রয়েছে তবে এই আলোচনাটি অন্য কোথাও সম্পর্কিত।

2. বিমূর্ত শ্রেণি

হ্যা, তা ঠিক. কেবলমাত্র একটি একক ভার্চুয়াল পদ্ধতি ক্লাসটিকে বিমূর্ত হিসাবে চিহ্নিত করবে।

আপনি যখন এই ধরণের ক্লাসগুলি ব্যবহার করবেন তখন যখন আপনার কাছে একটি বৃহত্তর শ্রেণীর শ্রেণিবিন্যাস থাকবে যেখানে শীর্ষ শ্রেণিগুলি সত্যই ইনস্ট্যান্ট করা উচিত নয়।

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

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

সুতরাং এর অর্থ হ'ল স্তন্যপায়ী প্রাণীটি একটি বিমূর্ত শ্রেণি হওয়া উচিত কারণ এটি সমস্ত স্তন্যপায়ী প্রাণীর জন্য কিছু সাধারণ আচরণ বাস্তবায়িত হবে তবে এটি তাত্ক্ষণিকভাবে অনুমিত হওয়ার কথা নয়। এটি বিমূর্ত শ্রেণির পিছনে মূল ধারণা তবে এটির আরও অবশ্যই আপনার আরও শিখতে হবে।

3. ইন্টারফেস

আপনার জাভা বা সি # তে একই অর্থে সি ++ তে কোনও খাঁটি ইন্টারফেস নেই। একটি তৈরির একমাত্র উপায় হ'ল একটি বিশুদ্ধ বিমূর্ত শ্রেণি যা কোনও ইন্টারফেস থেকে আপনি চান এমন বেশিরভাগ আচরণ নকল করে।

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

আরও ভাল ধারণা পেতে আপনি এমএসডিএন-তে সি # এর ইন্টারফেস স্পেসিফিকেশন সম্পর্কে পড়তে পারেন:

http://msdn.microsoft.com/en-us/library/ms173156.aspx

সি ++ খাঁটি বিমূর্ত শ্রেণীর দ্বারা একই ধরণের আচরণ সরবরাহ করবে।


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

@ স্টিভেন বার্নাপ: তবে সি ++ তে নয়, যা প্রশ্নের প্রসঙ্গ।
ডেড এমজি

3
তিনি সি ++ এবং ইন্টারফেস সম্পর্কে জিজ্ঞাসা করছেন। "ইন্টারফেস" সি ++ এর কোনও ভাষা বৈশিষ্ট্য নয়, তবে মানুষ অবশ্যই সি ++ তে এমন ইন্টারফেস তৈরি করে যা জাভা ইন্টারফেসের মতো ঠিক কাজ করে, বিমূর্ত বেস ক্লাসগুলি ব্যবহার করে। জাভা এমনকি অস্তিত্বের আগেই তারা তা করেছিল।
রোবট


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

8

বেশিরভাগ লোকেরা ইতিমধ্যে ব্যাখ্যা করেছেন যে সিলেটলেট / বিমূর্ত শ্রেণি কী। আশা করি, আমি কিছুটা ভিন্ন দৃষ্টিভঙ্গি সরবরাহ করব এবং কিছু ব্যবহারিক উদাহরণ দেব।

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

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

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

তাহলে আপনি কোথায় একক ব্যবহার করবেন? এখানে কয়েকটি উদাহরণ:

  • লগিং - আপনি যদি চান আপনার সম্পূর্ণ প্রক্রিয়াটির একটি একক লগ থাকে তবে আপনি একটি লগ অবজেক্ট তৈরি করতে এবং সর্বত্র এটি পাস করতে পারেন। তবে যদি আপনার কাছে লিগ্যাসি অ্যাপ্লিকেশন কোডের 100,000k লাইন থাকে? তাদের সব পরিবর্তন করুন? অথবা আপনি কেবল নীচেরগুলি পরিচয় করিয়ে দিতে এবং আপনি যে কোনও জায়গায় এটি ব্যবহার শুরু করতে পারেন:

    CLog::GetInstance().write( "my log message goes here" );
  • সার্ভার সংযোগ ক্যাশে - এটি আমার অ্যাপ্লিকেশনটিতে আমাকে প্রবর্তন করতে হবে। আমাদের কোড বেস, এবং এটি প্রচুর ছিল, যখনই এটি খুশি সার্ভারের সাথে সংযোগ স্থাপন করত। বেশিরভাগ সময় এটি ঠিক ছিল, যদি না নেটওয়ার্কে কোনও ধরণের বিলম্ব না ঘটে। আমাদের একটি সমাধান দরকার এবং 10 বছরের পুরানো অ্যাপ্লিকেশনটির পুনরায় নকশা করা সত্যিই টেবিলে ছিল না। আমি একটি সিঙ্গলটন CServerConnicationManager লিখেছি। তারপরে আমি কোডটি অনুসন্ধান করে CoCreateInstanceWithAuth কলগুলিকে অভিন্ন স্বাক্ষর কল দিয়ে প্রতিস্থাপন করেছি যা আমার ক্লাসটি প্রেরণ করেছিল। এখন প্রথম প্রচেষ্টা সংযোগটি ক্যাশে হওয়ার পরে এবং বাকি সময় "সংযোগ" প্রচেষ্টা তাত্ক্ষণিক ছিল। কেউ কেউ বলে সিঙ্গেলন দুষ্ট। আমি বলি তারা আমার বাট সংরক্ষণ করেছে

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

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

এই সব বলার পরে, সিলেটলেটগুলি কখন এবং কোথায় ব্যবহার করা উচিত তা আপনার মনে রাখা দরকার। 10 বারের মধ্যে 9 এর থেকে আরও ভাল সমাধান রয়েছে এবং সবসময়, আপনার পরিবর্তে এটি ব্যবহার করা উচিত। তবে, এমন সময় রয়েছে যখন সিঙ্গলটন হ'ল একেবারে সঠিক ডিজাইনের পছন্দ।

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

typedef struct interface;

... সুতরাং আপনি এখনও ইন্টারফেস কীওয়ার্ডটি ব্যবহার করতে পারেন (এটি এমনকি 'বাস্তব' কীওয়ার্ড হিসাবে হাইলাইট করা হবে), তবে প্রকৃত সংকলক হিসাবে এটি কেবল একটি কাঠামো।

তাহলে আপনি কোথায় এটি ব্যবহার করবেন? চলুন চলমান অবজেক্ট টেবিলের আমার উদাহরণে ফিরে যাই। ধরা যাক বেস ক্লাসটি আছে ...

ভার্চুয়াল শূন্য প্রিন্ট () = 0;

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

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

এখানে আরও একটি উদাহরণ। ধরা যাক আমার একটি ক্লাস রয়েছে যা একটি লগার, ক্লাগ প্রয়োগ করে। এই ক্লাসটি লোকাল ডিস্কে ফাইলটি লিখে। আমি এই কোডটি আমার উত্তরাধিকারে 100,000 কোডের লাইনগুলিতে ব্যবহার শুরু করি। সব জায়গায় বেশি. লাইফ ভাল না হওয়া পর্যন্ত কেউ না বলে, আরে ফাইলের পরিবর্তে ডাটাবেসে লিখি। এখন আমি নতুন ক্লাস তৈরি করি, আসুন এটি সিডিবিলগ বলি এবং ডাটাবেজে লিখি। আপনি কি 100,000 লাইনের মধ্য দিয়ে যেতে এবং CLog থেকে CDBLog এ সমস্ত কিছু পরিবর্তন করার ঝামেলা করতে পারেন? বিকল্পভাবে, আমি থাকতে পারে:

interface ILogger {
    virtual void write( const char* format, ... ) = 0;
};

class CLog : public ILogger { ... };

class CDbLog : public ILogger { ... };

class CLogFactory {
    ILogger* GetLog();
};

সমস্ত কোড যদি আইলোগার ইন্টারফেস ব্যবহার করে তবে আমার যে সমস্ত পরিবর্তন করতে হবে তা হ'ল সিএলএগফ্যাক্টরি :: গেটলগ () এর অভ্যন্তরীণ বাস্তবায়ন। বাকী কোডটি আমাকে একটি আঙুল না তুলে কেবল স্বয়ংক্রিয়ভাবে কাজ করবে।

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


4

যখন সিঙ্গেলটন প্রস্তাবিত / প্রয়োজনীয় ব্যবহার করা হয়? এটা কি ভাল অনুশীলন?

কখনও। এর চেয়ে খারাপ বিষয়, এগুলি পরিত্রাণ পাওয়ার জন্য এক চূড়ান্ত দুশ্চরিত্রা making তাই একবারে এই ভুল করা আপনাকে বহু, বহু বছরের জন্য আড়াল করতে পারে।

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


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

1
@ স্টিভেনবার্নাপ: সম্ভবত অন্য কোনও ভাষায়।
ডেডএমজি

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

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

3

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

একটি সিঙ্গলটন যার 2 বা ততোধিক সংখ্যক নির্দিষ্ট সংখ্যক সংখ্যক স্থির সংখ্যা রয়েছে একটি মাল্টিটন , ডাটাবেস সংযোগ পুলিংয়ের কথা ভাবেন ইত্যাদি think

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

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

দ্রষ্টব্য: ইন্টারফেস এবং বিমূর্ত শ্রেণি একাধিক উত্তরাধিকার ইত্যাদি সহ সি ++ বিশ্বে খুব আলাদা নয়, তবে জাভা এট-এর আলাদা অর্থ রয়েছে।


খুব ভাল বলেছেন! +1
jmort253

3

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

বলুন আমাদের নীচের পাইথন কোডের মতো একটি ফাংশন রয়েছে:

function foo(objs):
    for obj in objs:
        obj.printToScreen()

class HappyWidget:
    def printToScreen(self):
        print "I am a happy widget"

class SadWidget:
    def printToScreen(self):
        print "I am a sad widget"

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

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

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

void foo( Printable *objs[], int n){ //Please correctme if I messed up on the type signature
    for(int i=0; i<n; i++){
        objs[i]->printToScreen();
    }
}

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

সি ++ এ অ্যাবস্ট্রাক্ট শ্রেণি এবং ইন্টারফেস ধারণাটি কিছুটা ঝাপসা। আপনি যদি এগুলি আরও ভালভাবে সংজ্ঞায়িত করতে চান তবে বিমূর্ত ক্লাসগুলি আপনি যা সম্পর্কে ভাবছেন তা হ'ল, যখন ইন্টারফেসগুলি স্বাভাবিকভাবে বোঝায় যে কোনও বস্তুটি প্রকাশিত দৃশ্যমান পদ্ধতির সেটটির আরও সাধারণ, ক্রস-ল্যাঙ্গুয়েজ ধারণা। (যদিও জাভা-র মতো কিছু ভাষা ইন্টারফেস শব্দটি ব্যবহার করে সরাসরি কোনও বিমূর্ত বেস শ্রেণীর মতো আরও কিছু বোঝায়)

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


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


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


1

ইন্টারফেস

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

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

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

আপনি যদি প্রথমে চালাক হন তবে আপনি এই আগতটি দেখতে পেতেন এবং সরাসরি সিএসভিতে সংরক্ষণ করার জন্য কলগুলি করেন নি। পরিবর্তে আপনি এটি করার জন্য আপনার কী প্রয়োজন তা ভেবে দেখবেন, এটি কীভাবে কার্যকর করা হয়েছিল। যাক store()এবং retrieve()। আপনি একটি করতে Persisterজন্য বিমূর্ত পদ্ধতি ইন্টারফেস store()এবং retrieve()একটি তৈরি CsvPersisterউপশ্রেণী যে আসলে ঐ পদ্ধতি প্রয়োগ করা হয়।

পরবর্তীতে, আপনি এমন একটি তৈরি করতে পারেন DbPersisterযা আপনার সিএসভি শ্রেণিটি কীভাবে করেছিল তার থেকে আলাদাভাবে প্রকৃত স্টোরেজ এবং ডেটা পুনরুদ্ধার কার্যকর করে।

দুর্দান্ত জিনিসটি হল, আপনাকে এখন যা করতে হবে তা হ'ল পরিবর্তন

Persister* prst = new CsvPersister();

প্রতি

Persister* prst = new DbPersister();

এবং তারপরে আপনার কাজ শেষ। আপনার কলগুলি prst.store()এবং prst.retrieve()এখনও সব কাজ করবে, সেগুলি কেবল "পর্দার আড়ালে" আলাদাভাবে পরিচালিত হয়।

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

আমি আমার সি ++ তে সত্যই মরিচা, তাই আমি কিছু জেনেরিক প্রোগ্রামিং উদাহরণ ব্যবহার করব। ইন্টারফেসগুলি কীভাবে আপনার জীবনকে সহজ করে তোলে তার একটি দুর্দান্ত উদাহরণ হ'ল পাত্রে।

আপনি থাকতে পারে Array, LinkedList, BinaryTree, ইত্যাদি সব উপশ্রেণী Containerযা মত পদ্ধতি আছে insert(), find(), delete()

এখন কোনও লিঙ্কযুক্ত তালিকার মাঝখানে কিছু যুক্ত করার সময়, আপনাকে লিঙ্কযুক্ত তালিকাটি কী তাও জানতে হবে না। আপনি কেবল কল করুন myLinkedList->insert(4)এবং এটি যাদুকরীভাবে তালিকাটির মাধ্যমে পুনরাবৃত্তি করে এবং এটি সেখানে আটকে দেয়। এমনকি যদি আপনি জানেন যে কোনও লিঙ্কযুক্ত তালিকাগুলি কীভাবে কাজ করে (যা আপনার সত্যিকারের উচিত) তবে আপনাকে এর নির্দিষ্ট ফাংশনগুলি সন্ধান করতে হবে না, কারণ আপনি সম্ভবত ইতিমধ্যে জানেন যে তারা এর Containerআগে কোনও আলাদা ব্যবহার করা থেকে কী ।

বিমূর্ত ক্লাস

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

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

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

অবশ্যই ইন্টারফেস এবং বিমূর্ত বেস ক্লাসগুলির জন্য আরও অনেক কারণ রয়েছে তবে আপনি সেগুলি কেন ব্যবহার করতে পারেন সেগুলির কয়েকটি কারণ।

Singletons

আমি তাদের মাঝে মাঝে ব্যবহার করি এবং আমি তাদের দ্বারা কখনও পোড়া হইনি। এটি অন্য জাতির অভিজ্ঞতার ভিত্তিতে তারা আমার জীবনকে এক পর্যায়ে নষ্ট করবে না তা বলার অপেক্ষা রাখে না।

আরও কিছু অভিজ্ঞ এবং সতর্ক লোকদের কাছ থেকে এখানে বৈশ্বিক রাষ্ট্র সম্পর্কে একটি ভাল আলোচনা রয়েছে: গ্লোবাল স্টেট এত খারাপ কেন?


1

পশুর রাজ্যে বিভিন্ন প্রাণী রয়েছে যা স্তন্যপায়ী প্রাণী। এখানে স্তন্যপায়ী প্রাণি একটি বেস শ্রেণি এবং বিভিন্ন প্রাণী এটি থেকে প্রাপ্ত।

আপনি কি কখনও স্তন্যপায়ী প্রাণীর দ্বারা হাঁটতে দেখেছেন? হ্যাঁ, অনেক সময় আমি নিশ্চিত - তবে তারা সমস্ত প্রকারের স্তন্যপায়ী ছিল না?

আপনি কখনও এমন কিছু দেখেন নি যা আক্ষরিকভাবে কেবল একটি স্তন্যপায়ী ছিল। তারা সব ধরণের স্তন্যপায়ী ছিল।

শ্রেণীর স্তন্যপায়ী প্রাণীর বিভিন্ন বৈশিষ্ট্য এবং গোষ্ঠী সংজ্ঞায়িত করার প্রয়োজন হয় তবে এটি কোনও দৈহিক সত্তা হিসাবে বিদ্যমান নেই।

সুতরাং এটি একটি বিমূর্ত বেস শ্রেণি।

স্তন্যপায়ী প্রাণীরা কীভাবে চলাচল করে? তারা কি হাঁটা, সাঁতার, উড়ন্ত ইত্যাদি?

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

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

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

অতএব মুভআউন্ড একটি খাঁটি ভার্চুয়াল ফাংশন।

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

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