নেস্টেড ক্লাসগুলি ঠিক নিয়মিত ক্লাসের মতো তবে:
- তাদের অতিরিক্ত অ্যাক্সেস বিধিনিষেধ রয়েছে (যেমন শ্রেণীর সংজ্ঞা অনুসারে সমস্ত সংজ্ঞা রয়েছে),
- তারা প্রদত্ত নেমস্পেস দূষণ করে না , যেমন গ্লোবাল নেমস্পেস। আপনি যদি মনে করেন যে ক্লাস বি এত গভীরভাবে ক্লাস এ এর সাথে সংযুক্ত রয়েছে তবে ক এবং খ এর বিষয়গুলি অপরিহার্যভাবে সম্পর্কিত নয়, তবে আপনি ক্লাস বিটি কেবলমাত্র ক্লাসের স্কোপিংয়ের মাধ্যমে অ্যাক্সেসযোগ্য হতে চাইতে পারেন (এটি A হিসাবে পরিচিত হবে) :: ক্লাস)।
কিছু উদাহরণ:
এটিকে প্রাসঙ্গিক শ্রেণির স্কোপে রাখার জন্য সর্বজনীনভাবে বাসা বাঁধছে
ধরে নিন আপনার কাছে এমন একটি শ্রেণি রয়েছে SomeSpecificCollection
যা শ্রেণীর সামগ্রিক অবজেক্টগুলি করতে চায় Element
। এরপরে আপনিও পারেন:
দুটি ক্লাস ঘোষণা করুন: SomeSpecificCollection
এবং Element
- খারাপ, কারণ "এলিমেন্ট" নামটি সাধারণত একটি সাধারণ নাম সংঘর্ষের কারণ হিসাবে যথেষ্ট সাধারণ
একটি নেমস্পেস চালু someSpecificCollection
এবং ক্লাস ঘোষণা someSpecificCollection::Collection
এবং someSpecificCollection::Element
। নামের সংঘর্ষের ঝুঁকি নেই, তবে এটি কি আর কোনও ভার্বোস পেতে পারে?
দুটি বৈশ্বিক ক্লাস ঘোষণা করুন SomeSpecificCollection
এবং SomeSpecificCollectionElement
- এতে সামান্য ত্রুটি রয়েছে, তবে সম্ভবত ঠিক আছে।
গ্লোবাল ক্লাস SomeSpecificCollection
এবং ক্লাসকে Element
তার নেস্টেড ক্লাস হিসাবে ঘোষণা করুন । তারপর:
- এলিমেন্ট বিশ্বব্যাপী নেমস্পেসে না থাকায় আপনি কোনও নাম সংঘর্ষের ঝুঁকি নেবেন না,
- বাস্তবায়নের ক্ষেত্রে
SomeSpecificCollection
আপনাকে ন্যায়সঙ্গত Element
এবং অন্য যে কোনও জায়গায় উল্লেখ করা হয় SomeSpecificCollection::Element
- যা দেখতে + - 3 হিসাবে একই, তবে আরও পরিষ্কার
- এটি সহজ সরল হয়ে উঠল যে এটি "নির্দিষ্ট সংগ্রহের একটি উপাদান", "সংগ্রহের একটি নির্দিষ্ট উপাদান" নয়
- এটি দৃশ্যমান যে
SomeSpecificCollection
এটিও একটি বর্গ।
আমার মতে, শেষ রূপটি অবশ্যই সবচেয়ে স্বজ্ঞাত এবং তাই সেরা নকশা।
আমাকে চাপ দিন - আরও ভার্বোজের নাম দিয়ে দুটি বৈশ্বিক ক্লাস করা থেকে এটি কোনও বড় পার্থক্য নয়। এটি কেবলমাত্র একটি ছোট্ট বিশদ বিবরণ, তবে imho এটি কোডটিকে আরও স্পষ্ট করে তোলে।
শ্রেণীর ক্ষেত্রের মধ্যে অন্য একটি সুযোগের পরিচয় দেওয়া
এটি টাইপডেফস বা এনামগুলি প্রবর্তনের জন্য বিশেষভাবে কার্যকর। আমি এখানে একটি কোড উদাহরণ পোস্ট করব:
class Product {
public:
enum ProductType {
FANCY, AWESOME, USEFUL
};
enum ProductBoxType {
BOX, BAG, CRATE
};
Product(ProductType t, ProductBoxType b, String name);
// the rest of the class: fields, methods
};
তারপরে একজন ফোন করবে:
Product p(Product::FANCY, Product::BOX);
তবে কোড সমাপ্তির প্রস্তাবগুলি দেখার সময় Product::
, প্রায়শই সমস্ত সম্ভাব্য এনাম মানগুলি (বক্স, ফ্যানসি, ক্র্যাট) তালিকাভুক্ত হয়ে যায় এবং এখানে একটি ভুল করা সহজ (সি ++ 0 এক্স এর দৃ strongly়ভাবে টাইপযুক্ত এনামগুলি সমাধান করে, তবে কিছু মনে করবেন না) )।
তবে আপনি যদি নেস্টেড ক্লাসগুলি ব্যবহার করে সেই এনামগুলির জন্য অতিরিক্ত সুযোগ প্রবর্তন করেন তবে জিনিসগুলি দেখতে দেখতে দেখতে পারে:
class Product {
public:
struct ProductType {
enum Enum { FANCY, AWESOME, USEFUL };
};
struct ProductBoxType {
enum Enum { BOX, BAG, CRATE };
};
Product(ProductType::Enum t, ProductBoxType::Enum b, String name);
// the rest of the class: fields, methods
};
তারপরে কলটি দেখে মনে হচ্ছে:
Product p(Product::ProductType::FANCY, Product::ProductBoxType::BOX);
তারপরে Product::ProductType::
একটি আইডিই টাইপ করে, কেবলমাত্র পছন্দসই সুযোগ থেকে এনামগুলি পাওয়া যাবে। এটি ভুল করার ঝুঁকিও হ্রাস করে।
অবশ্যই এটি ছোট ক্লাসগুলির জন্য প্রয়োজন হতে পারে না তবে যদি কারও অনেকগুলি এনাম থাকে তবে এটি ক্লায়েন্ট প্রোগ্রামারদের জন্য জিনিসগুলিকে সহজ করে তোলে।
একইভাবে, আপনি যদি কখনও প্রয়োজন হয় তবে আপনি কোনও টেম্পলেটে টাইপডেফগুলির একটি বিশাল গোছা "সংগঠিত" করতে পারেন। এটি কখনও কখনও দরকারী প্যাটার্ন।
পিআইএমপিএল প্রতিমা
পিআইএমপিএল (পয়েন্টার থেকে আইএমপিএলমেন্টেশন সংক্ষিপ্ত) শিরোনাম থেকে কোনও শ্রেণীর প্রয়োগের বিশদটি সরিয়ে ফেলার জন্য একটি মূর্তি কার্যকর। এটি ক্লাসের শিরোনামের উপর নির্ভর করে ক্লাসগুলির পুনরায় সংক্রমণের প্রয়োজনীয়তা হ্রাস করে যখনই শিরোনামের "বাস্তবায়ন" অংশ পরিবর্তন করে।
এটি সাধারণত নেস্টেড শ্রেণি ব্যবহার করে প্রয়োগ করা হয়:
Xh:
class X {
public:
X();
virtual ~X();
void publicInterface();
void publicInterface2();
private:
struct Impl;
std::unique_ptr<Impl> impl;
}
X.cpp:
#include "X.h"
#include <windows.h>
struct X::Impl {
HWND hWnd; // this field is a part of the class, but no need to include windows.h in header
// all private fields, methods go here
void privateMethod(HWND wnd);
void privateMethod();
};
X::X() : impl(new Impl()) {
// ...
}
// and the rest of definitions go here
এটি বিশেষত কার্যকর যদি সম্পূর্ণ শ্রেণীর সংজ্ঞাটির জন্য কোনও বাহ্যিক গ্রন্থাগার থেকে প্রকারের সংজ্ঞা প্রয়োজন হয় যার ভারী বা কেবল কুশল শিরোলেখ ফাইল থাকে (উইনাপি নিন)। আপনি যদি পিআইএমপিএল ব্যবহার করেন তবে আপনি যে কোনও উইনএপিআই-নির্দিষ্ট কার্যকারিতা কেবলমাত্র এটিকে আবদ্ধ করতে পারবেন .cpp
এবং এটি কখনই এতে অন্তর্ভুক্ত করতে পারবেন না .h
।