কিছু গবেষণা করার পরে আমি প্রায়শই মুখোমুখি হওয়া সমস্যার সমাধান করার সহজ উদাহরণ খুঁজে পাচ্ছি না।
আসুন আমি বলি যে আমি একটি ছোট অ্যাপ্লিকেশন তৈরি করতে চাই যেখানে আমি Square
গুলি, Circle
গুলি এবং অন্যান্য আকার তৈরি করতে পারি , তাদের একটি স্ক্রিনে প্রদর্শন করতে পারি, তাদের বৈশিষ্ট্যগুলি নির্বাচনের পরে সংশোধন করতে পারি এবং তারপরে তার সমস্ত ঘেরগুলি গণনা করি।
আমি মডেল ক্লাসটি এইভাবে করতাম:
class AbstractShape
{
public :
typedef enum{
SQUARE = 0,
CIRCLE,
} SHAPE_TYPE;
AbstractShape(SHAPE_TYPE type):m_type(type){}
virtual ~AbstractShape();
virtual float computePerimeter() const = 0;
SHAPE_TYPE getType() const{return m_type;}
protected :
const SHAPE_TYPE m_type;
};
class Square : public AbstractShape
{
public:
Square():AbstractShape(SQUARE){}
~Square();
void setWidth(float w){m_width = w;}
float getWidth() const{return m_width;}
float computePerimeter() const{
return m_width*4;
}
private :
float m_width;
};
class Circle : public AbstractShape
{
public:
Circle():AbstractShape(CIRCLE){}
~Circle();
void setRadius(float w){m_radius = w;}
float getRadius() const{return m_radius;}
float computePerimeter() const{
return 2*M_PI*m_radius;
}
private :
float m_radius;
};
(কল্পনা করুন যে আমার আকারের আরও ক্লাস রয়েছে: ত্রিভুজ, হেক্সাগন, প্রতিবারের সাথে তাদের প্রোপারার ভেরিয়েবল এবং সম্পর্কিত গেটর এবং সেটার। আমি যে সমস্যার মুখোমুখি হয়েছিলাম তার 8 টি সাবক্লাস ছিল তবে উদাহরণের জন্য আমি 2 এ থামলাম)
আমার কাছে এখন একটি ShapeManager
, তাত্ক্ষণিকভাবে এবং একটি অ্যারেতে সমস্ত আকার সংরক্ষণ করে:
class ShapeManager
{
public:
ShapeManager();
~ShapeManager();
void addShape(AbstractShape* shape){
m_shapes.push_back(shape);
}
float computeShapePerimeter(int shapeIndex){
return m_shapes[shapeIndex]->computePerimeter();
}
private :
std::vector<AbstractShape*> m_shapes;
};
সবশেষে, প্রতিটি ধরণের আকারের জন্য প্রতিটি প্যারামিটার পরিবর্তন করতে আমার স্পিনবক্সগুলির সাথে একটি ভিউ রয়েছে। উদাহরণস্বরূপ, আমি যখন স্ক্রিনে একটি বর্গক্ষেত্রটি নির্বাচন করি তখন প্যারামিটার উইজেটটি কেবলমাত্র Square
সম্পর্কিত সম্পর্কযুক্ত প্যারামিটারগুলি (ধন্যবাদ ধন্যবাদ AbstractShape::getType()
) প্রদর্শন করে এবং স্কোয়ারের প্রস্থ পরিবর্তন করার প্রস্তাব দেয়। এটি করার জন্য আমার একটি ফাংশন প্রয়োজন যা আমাকে প্রস্থটি সংশোধন করার অনুমতি দেয় ShapeManager
এবং আমি এটি এইভাবে করি:
void ShapeManager::changeSquareWidth(int shapeIndex, float width){
Square* square = dynamic_cast<Square*>(m_shapes[shapeIndex]);
assert(square);
square->setWidth(width);
}
আমার কাছে থাকা প্রতিটি সাবক্লাস ভেরিয়েবলের জন্য আমাকে ব্যবহার dynamic_cast
এবং গিটার / সেটার দম্পতি বাস্তবায়নের জন্য কী আরও ভাল নকশা ShapeManager
রয়েছে? আমি ইতিমধ্যে টেমপ্লেট ব্যবহার করার চেষ্টা করেছি কিন্তু ব্যর্থ হয়েছি ।
সমস্যা আমি সম্মুখীন করছি আকার সঙ্গে কিন্তু সত্যিই নয় বিভিন্ন Job
গুলি : (প্রাক্তন একটি 3D প্রিন্টার জন্য PrintPatternInZoneJob
, TakePhotoOfZone
ইত্যাদি) সঙ্গে AbstractJob
তাদের বেস শ্রেণী হিসেবে। ভার্চুয়াল পদ্ধতিটি execute()
এবং না getPerimeter()
। আমাকে কেবলমাত্র কংক্রিটের ব্যবহারের প্রয়োজন হ'ল কোনও কাজের প্রয়োজনীয় নির্দিষ্ট তথ্য পূরণ করা :
PrintPatternInZone
মুদ্রণের জন্য পয়েন্টগুলির তালিকা, জোনটির অবস্থান, তাপমাত্রার মতো কিছু মুদ্রণ পরামিতি প্রয়োজন needsTakePhotoOfZone
কোন জোনটি ফটো তোলা দরকার, যেখানে ছবিটি সংরক্ষণ করা হবে সেই পথ, মাত্রা ইত্যাদি
আমি যখন তখন কল করব execute()
, তখন জবসরা তাদের করা কর্মটি অনুধাবন করার জন্য তাদের নির্দিষ্ট তথ্য ব্যবহার করবে।
যখনই আমি এই তথ্যগুলি পূরণ করি বা প্রদর্শন করি (তখন যদি একটি TakePhotoOfZone
Job
নির্বাচিত হয়, একটি উইজেট অঞ্চল, পথ এবং মাত্রা পরামিতি প্রদর্শন করবে এবং সংশোধন করবে ) তখনই আমাকে জবের কংক্রিট ধরণের ব্যবহার করার প্রয়োজন হয় ।
Job
গুলি তারপর একটি তালিকা পুরা হয় Job
গুলি যা প্রথম চাকরি নিতে, এটা executes (কল করে AbstractJob::execute()
), পরবর্তী তালিকা শেষ না হওয়া পর্যন্ত এবং উপর, চলে যায়। (এই কারণেই আমি উত্তরাধিকার ব্যবহার করি)।
বিভিন্ন ধরণের প্যারামিটার সংরক্ষণ করতে আমি এটি ব্যবহার করি JsonObject
:
সুবিধাগুলি: যে কোনও কাজের জন্য একই কাঠামো, পরামিতিগুলি সেট করা বা পড়ার সময় কোনও গতিশীল_কাস্ট নয়
সমস্যা: পয়েন্টারগুলি সঞ্চয় করতে পারে না (
Pattern
বাZone
)
আপনি কি তথ্য সংরক্ষণের আরও ভাল উপায় আছে?
তারপরে যখন আমাকে সেই ধরণের নির্দিষ্ট পরামিতিগুলি সংশোধন করতে হবে তখন আপনি কীভাবেJob
এটি ব্যবহারের কংক্রিট প্রকারটি সংরক্ষণ করবেন ? JobManager
শুধুমাত্র একটি তালিকা আছে AbstractJob*
।
changeValue(int shapeIndex, PropertyKey propkey, double numericalValue)
কোথায় PropertyKey
থাকতে পারে এবং "প্রস্থ" (এটি নির্দেশ করে যে সেটারে কল প্রস্থের মান আপডেট করবে) অনুমোদিত মানগুলির মধ্যে একটি।