हम वीसी 6 कंपाइलर के साथ सी ++ में लागू बहुत पुरानी विरासत प्रणाली के साथ काम करते हैं। अब हम कोड को दोबारा करने की प्रक्रिया में हैं। हमने वीसी 9 कंपाइलर पर भी स्विच किया।लीगेसी एपीआई/फ्रेमवर्क (सी ++ मैक्रोज़ बनाम सी ++ टेम्पलेट बनाम कोड जेनरेटर) के लिए बड़ी संख्या में जटिल रैपर को कैसे कार्यान्वित करें?
हम बाहरी मालिकाना ढांचे का उपयोग करते हैं, जो विरासत कोड भी है और इकाई परीक्षण योग्य नहीं है। ताकि हमारे कोड इकाई परीक्षण योग्य बनाने के लिए, हम फ्रेमवर्क वर्गों के लिए इंटरफेस और रैपर शुरू की (संकेत: देखने मार्टिन Fowler द्वारा "परंपरागत कोड के साथ काम करना"):
अब हम इंटरफेस पर निर्भर करते हैं। रैपर ढांचे के तरीकों को बुलाते हैं और हम खुशी से हमारे यूनिट परीक्षणों में मोजे का उपयोग कर सकते हैं।
और यहाँ हम अपने समस्या के लिए आते हैं ...
फ्रेमवर्क वर्गों कई तरीके लपेटा जाता है और मज़ाक उड़ाया करने की आवश्यकता है होते हैं। इस लक्ष्य को प्राप्त करने के लिए, हमारी सप्लायर टीम ने एक एपीआई लिखा जो सी ++ मैक्रोज़ के उपयोग के साथ इंटरफेस, रैपर और मैक्स कार्यान्वयन उत्पन्न करता है। आवरण हेडर फाइल के
उदाहरण:
class PlanWrapper : public IPlan
{
// ...
WRP_DECLARE_DEFAULTS(FrameworkPlan); // macro
WRP_DECLARE_CSTR_ATTR(FrameworkPlanLabel); // macro
// ...
};
मैक्रो WRP_DECLARE_CSTR_ATTR इस तरह परिभाषित किया गया है:
#define WRP_DECLARE_CSTR_ATTR(AttrName) \
virtual bool set##AttrName (LPCTSTR Value_in); \
virtual bool get##AttrName (CString& Value_out); \
virtual bool unset##AttrName(); \
virtual bool isSet##AttrName()
आवरण cpp फ़ाइल का उदाहरण:
#include "StdAfx.h"
using namespace SomeNamespace;
WRP_IMPLEMENT_MODDICOM_DEFAULTS(FrameworkPlan)
WRP_IMPLEMENT_W_CSTR_ATTR (FrameworkPlan,FrameworkType1, FrameworkPlanLabel)
// ...
मैक्रो WRP_IMPLEMENT_W_CSTR_ATTR परिभाषित किया गया है इस तरह:
#define WRP_IMPLEMENT_W_CSTR_ATTR(ClassName,AtrTypeObj,AttrName) \
bool ClassName##Wrapper::set##AttrName (LPCTSTR Value_in) { \
AtrTypeObj aValue = Value_in; \
FrameworkLink<ClassName> convertedObj = NULL_LINK; \
framework_cast(convertedObj, m_Object); \
return convertedObj != NULL_LINK ? \
convertedObj->set##AttrName (aValue) : false; \
}
// ...
हमारे पास और भी जटिल सामग्री का एक गुच्छा है, लेकिन मुझे लगता है कि आपको यह विचार मिलता है।
एपीआई के साथ समस्या यह है कि यह बेहद जटिल है, पठनीय नहीं है, डिबग करने योग्य नहीं है और परीक्षण योग्य नहीं है।
हम एक ही लक्ष्य को प्राप्त करने के लिए एक बेहतर तंत्र के साथ आना चाहते हैं। विचार यह था कि हम उन्नत टेम्पलेट्स, टाइपलिस्ट, लक्षण इत्यादि जैसे नए कंपाइलर के साथ आए कुछ उन्नत फीचर्स का उपयोग करते हैं।
टेम्पलेट्स के साथ हम लगभग अपना लक्ष्य प्राप्त कर सकते हैं, लेकिन हम विधि नामों से फंस गए हैं। हम प्रकारों के लिए सामान्यीकृत कर सकते हैं, लेकिन हम विशेषता नामों से कैसे निपट सकते हैं?
हमने रैपर + इंटरफेस + मैक्स कोड स्वचालित रूप से उत्पन्न करने के लिए टूल बनाने के बारे में भी सोचा। हालांकि, हमारे बाहरी ढांचे का एपीआई बेहद जटिल है और इस तरह के एक उपकरण को लिखना बहुत महंगा होगा।
आपको ऐसी समस्या का समाधान करने का सबसे अच्छा तरीका क्या है? हो सकता है कि आप पहले से ही इस तरह से निपटा चुके हैं और अच्छे संकेत प्रदान कर सकते हैं? हम आपके उत्तरों को देखने की उम्मीद कर रहे हैं!
Thx। हम निश्चित रूप से क्लैंग और सीटीएजी पर एक नज़र डालेंगे। – nowaq