আপনি ম্যাক্রোগটিকে কীভাবে খারাপ ব্যবহার করতে পারেন তার একটি পরিষ্কার উদাহরণ এই প্রশ্ন দেয়। অন্যান্য উদাহরণ দেখতে (এবং বিনোদন করা) এই প্রশ্নটি দেখুন ।
এটি বলার পরে, আমি ম্যাক্রোগুলিকে ভাল সংযুক্তি হিসাবে বিবেচনা করি তার বাস্তব বিশ্বের উদাহরণ দেব।
প্রথম উদাহরণ CppUnit এ উপস্থিত হয় , যা একটি ইউনিট পরীক্ষার কাঠামো। অন্যান্য স্ট্যান্ডার্ড পরীক্ষার কাঠামোর মতো, আপনি একটি পরীক্ষা ক্লাস তৈরি করেন এবং তারপরে আপনাকে কোনওভাবে পরীক্ষার অংশ হিসাবে কোন পদ্ধতিগুলি চালানো উচিত তা নির্দিষ্ট করতে হবে।
#include <cppunit/extensions/HelperMacros.h>
class ComplexNumberTest : public CppUnit::TestFixture
{
CPPUNIT_TEST_SUITE( ComplexNumberTest );
CPPUNIT_TEST( testEquality );
CPPUNIT_TEST( testAddition );
CPPUNIT_TEST_SUITE_END();
private:
Complex *m_10_1, *m_1_1, *m_11_2;
public:
void setUp();
void tearDown();
void testEquality();
void testAddition();
}
আপনি দেখতে পাচ্ছেন যে ক্লাসটির ম্যাক্রোগুলির একটি ব্লক রয়েছে কারণ এটি প্রথম উপাদান। আমি যদি একটি নতুন পদ্ধতি যুক্ত করিtestSubtraction
এটি পরীক্ষার অন্তর্ভুক্ত করার জন্য আপনার কী করা উচিত তা স্পষ্ট।
এই ম্যাক্রো ব্লকগুলি এরকম কিছুতে প্রসারিত হয়:
public:
static CppUnit::Test *suite()
{
CppUnit::TestSuite *suiteOfTests = new CppUnit::TestSuite( "ComplexNumberTest" );
suiteOfTests->addTest( new CppUnit::TestCaller<ComplexNumberTest>(
"testEquality",
&ComplexNumberTest::testEquality ) );
suiteOfTests->addTest( new CppUnit::TestCaller<ComplexNumberTest>(
"testAddition",
&ComplexNumberTest::testAddition ) );
return suiteOfTests;
}
আপনি কোনটি পড়তে এবং বজায় রাখতে পছন্দ করবেন?
আর একটি উদাহরণ মাইক্রোসফ্ট এমএফসি ফ্রেমওয়ার্কে রয়েছে, যেখানে আপনি বার্তাগুলিতে ফাংশনগুলি ম্যাপ করেন:
BEGIN_MESSAGE_MAP( CMyWnd, CMyParentWndClass )
ON_MESSAGE( WM_MYMESSAGE, OnMyMessage )
ON_COMMAND_RANGE(ID_FILE_MENUITEM1, ID_FILE_MENUITEM3, OnFileMenuItems)
// ... Possibly more entries to handle additional messages
END_MESSAGE_MAP( )
সুতরাং, "গুড ম্যাক্রোস" কে ভয়াবহ অশুভ প্রকারের থেকে পৃথককারী জিনিসগুলি কী কী?
তারা এমন একটি কার্য সম্পাদন করে যা অন্য কোনও উপায়ে সরলীকৃত করা যায় না। দুটি উপাদানের মধ্যে সর্বাধিক নির্ধারণ করতে ম্যাক্রো লেখা ভুল, কারণ আপনি একটি টেম্পলেট পদ্ধতি ব্যবহার করে এটি অর্জন করতে পারেন। তবে কিছু জটিল কাজ রয়েছে (উদাহরণস্বরূপ, সদস্য ফাংশনে মেসেজ কোডগুলি ম্যাপিং) যা সি ++ ভাষা কেবল মার্জিতভাবে পরিচালনা করে না।
তাদের একটি অত্যন্ত কঠোর, আনুষ্ঠানিক ব্যবহার রয়েছে। এই উভয় উদাহরণে ম্যাক্রো ব্লকগুলি ম্যাক্রোগুলি শুরু এবং শেষ করে ঘোষণা করা হয় এবং ইনবেটউইন ম্যাক্রোগুলি কেবল এই ব্লকের অভ্যন্তরে প্রদর্শিত হবে। আপনার স্বাভাবিক সি ++ রয়েছে, আপনি সংক্ষিপ্তভাবে নিজেকে ম্যাক্রোগুলির একটি ব্লক দিয়ে ক্ষমা করবেন এবং তারপরে আপনি আবার স্বাভাবিক হয়ে যান। "অশুভ ম্যাক্রোস" উদাহরণগুলিতে ম্যাক্রোগুলি পুরো কোড জুড়ে ছড়িয়ে পড়েছে এবং সি ++ বিধি কখন প্রয়োগ হয় এবং কখন তা কার্যকর হয় না তা হতাশ পাঠকের জানার উপায় নেই।