यह प्रश्न एक स्पष्ट उदाहरण देता है कि आप मैक्रोज़ का बुरी तरह से कैसे उपयोग कर सकते हैं। अन्य उदाहरण देखने के लिए (और मनोरंजन किया जाना चाहिए) इस प्रश्न को देखें ।
ऐसा कहने के बाद, मैं वास्तविक दुनिया के उदाहरण दूंगा कि मैं मैक्रों के अच्छे समावेश को क्या मानता हूं।
पहला उदाहरण कैप्पुनिट में दिखाई देता है , जो एक इकाई परीक्षण रूपरेखा है। किसी भी अन्य मानक परीक्षण ढांचे की तरह, आप एक परीक्षण वर्ग बनाते हैं और फिर आपको किसी तरह निर्दिष्ट करना होता है कि परीक्षण के भाग के रूप में कौन सी विधियाँ चलाई जानी चाहिए।
#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;
}
जिसे आप पढ़ना और बनाए रखना पसंद करेंगे?
एक अन्य उदाहरण Microsoft MFC फ्रेमवर्क में है, जहाँ आप संदेशों के लिए कार्य करते हैं:
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( )
तो, वे कौन सी चीजें हैं जो "गुड मैक्रोज़" को भयानक बुरी तरह से अलग करती हैं?
वे एक कार्य करते हैं जिसे किसी अन्य तरीके से सरल नहीं किया जा सकता है। दो तत्वों के बीच अधिकतम निर्धारित करने के लिए मैक्रो लिखना गलत है, क्योंकि आप टेम्पलेट पद्धति का उपयोग करके समान प्राप्त कर सकते हैं। लेकिन कुछ जटिल कार्य हैं (उदाहरण के लिए, सदस्य कार्यों के लिए संदेश कोड को मैप करना) जो कि C ++ भाषा सिर्फ सुंदर तरीके से नहीं संभालती है।
उनके पास एक अत्यंत सख्त, औपचारिक उपयोग है। इन दोनों उदाहरणों में मैक्रो को मैक्रो शुरू करने और समाप्त करने की घोषणा की जाती है, और इनबॉइट मैक्रोज़ केवल इन ब्लॉकों के अंदर दिखाई देंगे। आपके पास सामान्य सी ++ है, आप संक्षेप में मैक्रोज़ के ब्लॉक के साथ खुद को बहलाते हैं, और फिर आप फिर से सामान्य हो जाते हैं। "दुष्ट मैक्रो" उदाहरणों में, मैक्रोज़ पूरे कोड में बिखरे हुए हैं और असहाय पाठक के पास यह जानने का कोई तरीका नहीं है कि C ++ नियम कब लागू होते हैं और कब नहीं।