বিগত মাসগুলিতে আমি এখানে এসई এবং অন্যান্য সাইটে লোকদের কাছে জিজ্ঞাসা করেছি আমার কোড সম্পর্কে কিছু গঠনমূলক সমালোচনা offer একটি জিনিস রয়েছে যা প্রায় প্রতিবারই পপ আউট করে চলেছে এবং আমি এখনও সেই প্রস্তাবের সাথে একমত নই; : পি আমি এখানে এটি নিয়ে আলোচনা করতে চাই এবং সম্ভবত বিষয়গুলি আমার কাছে পরিষ্কার হয়ে যাবে।
এটি একক-দায়িত্ব নীতি (এসআরপি) সম্পর্কিত। মূলত, আমার কাছে একটি ডেটা ক্লাস রয়েছে, Font
এটি কেবল ডেটা ম্যানিপুলেট করার জন্যই নয়, এটি লোড করার জন্যও কাজ করে। আমি বলেছি দুজনকে আলাদা হওয়া উচিত, লোডিং ফাংশনগুলি কারখানার শ্রেণির ভিতরে রাখা উচিত; আমি মনে করি এটি এসআরপির একটি ভুল ব্যাখ্যা ...
মাই ফন্ট ক্লাস থেকে একটি টুকরা
class Font
{
public:
bool isLoaded() const;
void loadFromFile(const std::string& file);
void loadFromMemory(const void* buffer, std::size_t size);
void free();
void some();
void another();
};
প্রস্তাবিত নকশা
class Font
{
public:
void some();
void another();
};
class FontFactory
{
public:
virtual std::unique_ptr<Font> createFromFile(...) = 0;
virtual std::unique_ptr<Font> createFromMemory(...) = 0;
};
প্রস্তাবিত নকশাটি অনুমিতভাবে এসআরপি অনুসরণ করে, তবে আমি একমত নই - আমার মনে হয় এটি খুব বেশি এগিয়ে গেছে। Font
শ্রেণী আর স্বাবলম্বী (এটা কারখানা ছাড়া অনর্থক), এবং নয় FontFactory
চাহিদা রিসোর্স, যা সম্ভবত বন্ধুত্ব বা পাবলিক getters মাধ্যমে সম্পন্ন করা হয় বাস্তবায়ন, যা আরো বাস্তবায়ন এক্সপোজ সম্পর্কে বিস্তারিত জানতে Font
। আমি মনে করি এটি বরং খণ্ডিত দায়বদ্ধতার একটি মামলা ।
আমার দৃষ্টিভঙ্গি আরও ভাল বলে আমি এখানে কেন মনে করি:
Font
স্বাবলম্বী - স্বাবলম্বী হওয়া, এটি বোঝা এবং বজায় রাখা আরও সহজ। এছাড়াও, আপনি অন্য কিছু অন্তর্ভুক্ত না করে ক্লাসটি ব্যবহার করতে পারেন। তবে, যদি আপনি খুঁজে পান যে আপনার আরও জটিল সংস্থান প্রয়োজন (একটি কারখানা) আপনার এটি খুব সহজেই করতে পারেন (পরে আমি আমার নিজস্ব কারখানা সম্পর্কে কথা বলব,ResourceManager<Font>
)।স্ট্যান্ডার্ড লাইব্রেরি অনুসরণ করে - আমি বিশ্বাস করি যে ব্যবহারকারী-সংজ্ঞায়িত প্রকারগুলি সেই সংশ্লিষ্ট ভাষায় মানক প্রকারের আচরণটি অনুলিপি করার জন্য যথাসম্ভব চেষ্টা করা উচিত।
std::fstream
স্বাবলম্বী হয় এবং এটি মতো কাজগুলির প্রদান করেopen
এবংclose
। স্ট্যান্ডার্ড লাইব্রেরি অনুসরণ করার অর্থ জিনিসগুলি করার আরও একটি উপায় শেখার জন্য প্রচেষ্টা ব্যয় করার দরকার নেই। এ ছাড়া, সাধারণভাবে বলতে গেলে, সি ++ স্ট্যান্ডার্ড কমিটি সম্ভবত এখানে কারও চেয়ে নকশা সম্পর্কে আরও বেশি জানেন, তাই যদি সন্দেহ হয় তবে তারা যা করেন তা অনুলিপি করুন।পরীক্ষারযোগ্যতা - কিছু ভুল হয়ে যায়, সমস্যাটি কোথায় হতে পারে? - এটি
Font
কীভাবে তার ডেটা পরিচালনা করে বাFontFactory
ডেটা লোড করার উপায় ? আপনি সত্যিই জানেন না। ক্লাস স্বয়ংসম্পূর্ণ হওয়া এই সমস্যা হ্রাস করে: আপনিFont
বিচ্ছিন্নতাতে পরীক্ষা করতে পারেন । এরপরে যদি আপনাকে কারখানার পরীক্ষা করতে হয় এবং আপনি ভালFont
কাজ জানেন তবে আপনি এটিও জানবেন যে যখনই কোনও সমস্যা দেখা দেয় অবশ্যই এটি কারখানার অভ্যন্তরে থাকতে হবে।এটি প্রাসঙ্গিক অজ্ঞেয়বাদী - (এটি আমার প্রথম পয়েন্টটির সাথে কিছুটা ছেদ
Font
করে ) ব্যবহারকারীকে কারখানা ব্যবহার করতে বাধ্য করা ক্লাসগুলির মধ্যে সংযোগ বাড়িয়ে তোলে।
আমারও একটা কারখানা আছে
(কারণ ডিজাইনটি Font
আমাকে অনুমতি দেয়))
বরং ম্যানেজারের চেয়ে আরও বেশি, নিছক একটি কারখানা নয় ... Font
স্বাবলম্বী তাই ম্যানেজারকে কীভাবে এটি তৈরি করবেন তা জানার দরকার নেই ; পরিবর্তে ম্যানেজার নিশ্চিত করে যে একই ফাইল বা বাফার একাধিকবার মেমরিতে লোড হচ্ছে না। আপনি বলতে পারেন কোনও কারখানাও একই কাজ করতে পারে তবে তা কি এসআরপি ভেঙে দেবে না? কারখানাটি কেবল তখন অবজেক্টগুলি তৈরি করতে হবে না, তবে সেগুলি পরিচালনাও করতে পারে।
template<class T>
class ResourceManager
{
public:
ResourcePtr<T> acquire(const std::string& file);
ResourcePtr<T> acquire(const void* buffer, std::size_t size);
};
ম্যানেজারটি কীভাবে ব্যবহার করা যেতে পারে তার একটি প্রদর্শন এখানে's লক্ষ্য করুন যে এটি কারখানার মত মূলত ব্যবহৃত হয়েছিল।
void test(ResourceManager<Font>* rm)
{
// The same file isn't loaded twice into memory.
// I can still have as many Fonts using that file as I want, though.
ResourcePtr<Font> font1 = rm->acquire("fonts/arial.ttf");
ResourcePtr<Font> font2 = rm->acquire("fonts/arial.ttf");
// Print something with the two fonts...
}
শেষের সারি...
(এটি এখানে একটি টিএল লাগাতে চাই; ড।, তবে আমি একটির কথা ভাবতে পারি না::
there ) ঠিক আছে, আপনি এখানে আছেন, আমি আমার কেসটি যথাসম্ভব সেরা করে তুলেছি। আপনার যে কোনও পাল্টা যুক্তি যুক্ত করুন এবং প্রস্তাবিত ডিজাইনটি আমার নিজের ডিজাইনের উপরে রয়েছে বলে মনে করেন এমন কোনও সুবিধা পোস্ট করুন। মূলত, আমাকে ভুল দেখানোর চেষ্টা করুন I'm :)