मैं कई अस्थायी कॉन्फ़िगरेशन चेक को हटाने के लिए बहुत अधिक मात्रा में कोड, अधिकतर सी ++ को पुन: सक्रिय करने की प्रक्रिया में हूं जो स्थायी मानों को स्थायी रूप से सेट कर दिया गया है। उदाहरण के लिए, मैं निम्नलिखित कोड होगा:सी ++ रिफैक्टरिंग: सशर्त विस्तार और ब्लॉक उन्मूलन
#include <value1.h>
#include <value2.h>
#include <value3.h>
...
if (value1())
{
// do something
}
bool b = value2();
if (b && anotherCondition)
{
// do more stuff
}
if (value3() < 10)
{
// more stuff again
}
जहां मूल्य वापसी के लिए कॉल या तो एक bool या किसी पूर्णांक। जब से मैं मान कि इन कॉल हमेशा लौट पता है, मैं अपने सामान्य मूल्यों के लिए कॉल विस्तार करने के लिए कुछ regex प्रतिस्थापन किया है:
// where:
// value1() == true
// value2() == false
// value3() == 4
// TODO: Remove expanded config (value1)
if (true)
{
// do something
}
// TODO: Remove expanded config (value2)
bool b = false;
if (b && anotherCondition)
{
// do more stuff
}
// TODO: Remove expanded config (value3)
if (4 < 10)
{
// more stuff again
}
नोट हालांकि मूल्यों तय कर रहे हैं, वे संकलन समय पर सेट नहीं हैं कि लेकिन साझा स्मृति से पढ़े जाते हैं इसलिए संकलक वर्तमान में दृश्यों के पीछे कुछ भी अनुकूलित नहीं कर रहा है।
हालांकि परिणामी कोड थोड़ी मूर्खतापूर्ण दिखता है, फिर भी यह रेगेक्स दृष्टिकोण बहुत कुछ हासिल करता है क्योंकि यह लागू करना आसान है और कॉल पर निर्भरता को हटाता है, जबकि कोड के व्यवहार को नहीं बदलता है और यह भी संभावना है कि संकलक इसके बाद यह जानकर बहुत कुछ अनुकूलित हो सकता है कि एक ब्लॉक कभी नहीं बुलाया जा सकता है या एक चेक हमेशा सच हो जाएगा। यह भी बनाता है यह काफी आसान (खासकर जब संस्करण नियंत्रण के खिलाफ diffing) क्या बदल गया है देख सकते हैं और यह सफाई के अंतिम चरण में लेने के लिए इतना कोड ऊपर कोड अंत में इस प्रकार है:
// do something
// DONT do more stuff (b being false always prevented this)
// more stuff again
दिक्कत यह है कि मैं है अंतिम साफ कोड प्राप्त करने के लिए दूसरे, सही लेकिन मूर्ख, चरण से प्राप्त करने के लिए सैकड़ों (संभवतः हजारों) परिवर्तन हैं।
मुझे आश्चर्य हुआ कि अगर कोई रिफैक्टरिंग टूल के बारे में जानता है जो इसे या किसी भी तकनीक को लागू कर सकता है जिसे मैं लागू कर सकता हूं। मुख्य समस्या यह है कि सी ++ वाक्यविन्यास पूर्ण विस्तार या उन्मूलन को हासिल करने में काफी मुश्किल बनाता है और ऊपर दिए गए कोड में कई क्रमपरिवर्तन हैं। मुझे लगता है कि मुझे सिंटैक्स की विविधता से निपटने के लिए लगभग एक कंपाइलर की आवश्यकता है जिसे मुझे कवर करने की आवश्यकता होगी।
मुझे पता है कि ऐसे ही प्रश्न हैं लेकिन मुझे इस तरह की कोई आवश्यकता नहीं मिल रही है और यह भी सोचा कि क्या कोई उपकरण या प्रक्रियाएं तब से उभरीं जब से उनसे पूछा गया था?
हां, यह वही है जो मैं चाहता हूं। Regexes मुझे थोड़ा सा मिल सकता है, लेकिन वे अपरिचित हैं और जैसा कि आप कहते हैं, महत्वपूर्ण रूप से, वे भाषा 'नहीं' जानते हैं। बहुत बहुत धन्यवाद। Btw (अपने "डीएमएस सॉफ्टवेयर पुनर्रचना टूलकिट" लिंक टूट गया है) –
मूलरूप regexes कुछ भी घोंसले को शामिल के साथ सौदा नहीं कर सकते। (बूलियन) अभिव्यक्तियों में घोंसला शामिल है। QED: regexes स्वयं अभिव्यक्तियों पर काम नहीं कर सकते हैं। पीएस: लिंक तय है। –