<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Refactoring on kenji.blog</title><link>http://kenji.blog/hi/tags/refactoring/</link><description>Recent content in Refactoring on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>hi</language><copyright>kenjinote</copyright><lastBuildDate>Sat, 12 Sep 2026 20:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/hi/tags/refactoring/index.xml" rel="self" type="application/rss+xml"/><item><title>रीफैक्टरिंग का रहस्य: लिगेसी C++ कोड को सुरक्षित रूप से सुधारना</title><link>http://kenji.blog/hi/p/refactoring-legacy-cpp-code-safely/</link><pubDate>Sat, 12 Sep 2026 20:00:00 +0900</pubDate><guid>http://kenji.blog/hi/p/refactoring-legacy-cpp-code-safely/</guid><description>&lt;img src="http://kenji.blog/p/refactoring-legacy-cpp-code-safely/img/eyecatch.jpg" alt="Featured image of post रीफैक्टरिंग का रहस्य: लिगेसी C++ कोड को सुरक्षित रूप से सुधारना" />&lt;h1 id="रफकटरग-क-रहसय-लगस-c-कड-क-सरकषत-रप-स-सधरन">रीफैक्टरिंग का रहस्य: लिगेसी C++ कोड को सुरक्षित रूप से सुधारना
&lt;/h1>&lt;p>आधुनिक सॉफ्टवेयर विकास में, &amp;ldquo;लिगेसी कोड&amp;rdquo; के साथ संघर्ष एक अपरिहार्य मार्ग है। विशेष रूप से C++ जैसी भाषा में, लिगेसी कोड किसी भी अन्य भाषा की तुलना में बहुत बड़ा खतरा पैदा करता है। मैन्युअल मेमोरी प्रबंधन (कच्चे पॉइंटर्स और &lt;code>new&lt;/code> / &lt;code>delete&lt;/code> का तूफान), ग्लोबल वेरिएबल्स का दुरुपयोग, अपवाद सुरक्षा का अभाव, और सबसे महत्वपूर्ण बात, &amp;ldquo;कोई परीक्षण नहीं&amp;rdquo; होने का तथ्य। माइकल फेदर्स ने अपनी उत्कृष्ट पुस्तक &amp;lsquo;वर्किंग इफेक्टिवली विद लिगेसी कोड&amp;rsquo; में स्पष्ट रूप से कहा है: &amp;ldquo;बिना परीक्षण वाले कोड को लिगेसी कोड कहा जाता है।&amp;rdquo;&lt;/p>
&lt;p>इस लेख में, हम दशकों से जमा हुए लिगेसी C++ कोडबेस को सुरक्षित और मज़बूती से मॉडर्न C++ (C++11/14/17/20) में माइग्रेट और रीफैक्टर करने के रहस्यों को सिद्धांत और व्यवहार दोनों पहलुओं से विस्तार से समझेंगे। तकनीकी ऋण के गणितीय मॉडल से शुरू करते हुए, सुरक्षित निर्भरता अलगाव, और आधुनिक भाषा सुविधाओं का उपयोग करके कोड को साफ करने तक के व्यावहारिक दृष्टिकोण शामिल होंगे।&lt;/p>
&lt;hr>
&lt;h2 id="1-जटलत-और-तकनक-ऋण-क-गणतय-मडल">1. जटिलता और तकनीकी ऋण का गणितीय मॉडल
&lt;/h2>&lt;p>रीफैक्टरिंग को उचित ठहराने के लिए, वर्तमान कोडबेस की समस्याओं को मापना आवश्यक है। कोड की संरचनात्मक जटिलता को मापने के लिए सबसे आम मीट्रिक &amp;ldquo;साइक्लोमेटिक जटिलता (Cyclomatic Complexity)&amp;rdquo; है। यह जटिलता नियंत्रण प्रवाह ग्राफ के ग्राफ सिद्धांत के आधार पर निम्नलिखित सूत्र द्वारा परिभाषित की गई है:&lt;/p>
$$ M = E - N + 2P $$&lt;p>यहाँ,&lt;/p>
&lt;ul>
&lt;li>$M$ साइक्लोमेटिक जटिलता है&lt;/li>
&lt;li>$E$ ग्राफ के किनारों (प्रसंस्करण प्रवाह, संक्रमण) की संख्या है&lt;/li>
&lt;li>$N$ ग्राफ के नोड्स (प्रसंस्करण के बुनियादी ब्लॉक) की संख्या है&lt;/li>
&lt;li>$P$ जुड़े घटकों की संख्या है (आमतौर पर, एकल फ़ंक्शन या विधि के लिए $P=1$)&lt;/li>
&lt;/ul>
&lt;p>जटिलता $M$ जितनी अधिक होगी, उस फ़ंक्शन का व्यापक रूप से परीक्षण करने के लिए आवश्यक परीक्षण मामलों की संख्या रैखिक रूप से, या सशर्त शाखाओं के संयोजन के आधार पर घातीय रूप से बढ़ेगी। इसके अलावा, एक अनुभवजन्य नियम है कि बग होने की संभावना $P(bug)$, जटिलता $M$ के सापेक्ष घातीय रूप से बढ़ती है। यदि इसे पॉइसन वितरण के समान आकार में मॉडल किया जाए, तो यह इस प्रकार होगा:&lt;/p>
$$ P(bug) = 1 - e^{-\lambda \cdot M} $$&lt;p>(यहाँ $\lambda$ एक स्थिरांक है जो विकास टीम के कौशल और डोमेन की कठिनाई पर निर्भर करता है।)&lt;/p>
&lt;p>साथ ही, तकनीकी ऋण की लागत चक्रवृद्धि ब्याज की तरह बढ़ती है। यदि प्रारंभिक तकनीकी ऋण को $C_0$ और प्रति पुनरावृत्ति ब्याज दर (कोड को बदलने में कठिनाई के कारण उत्पादकता में कमी का प्रतिशत) को $r$ मान लिया जाए, तो $t$ अवधि के बाद संशोधन लागत $Cost(t)$ को इस प्रकार व्यक्त किया जा सकता है:&lt;/p>
$$ Cost(t) = C_0 \times (1 + r)^t $$&lt;p>यह सूत्र स्पष्ट रूप से एक क्रूर सच्चाई को दर्शाता है: &amp;ldquo;लिगेसी कोड को अनदेखा करने से समय के साथ लागत में घातीय वृद्धि होती है।&amp;rdquo; इसलिए, ऋण को जल्दी चुकाना (रीफैक्टरिंग) आवश्यक है।&lt;/p>
&lt;hr>
&lt;h2 id="2-रफकटरग-क-परण-सदधत-टसट-फरसट">2. रीफैक्टरिंग का पूर्ण सिद्धांत: &amp;ldquo;टेस्ट-फर्स्ट&amp;rdquo;
&lt;/h2>&lt;p>लिगेसी कोड को बदलते समय सबसे बड़ा डर यह होता है कि &amp;ldquo;क्या मौजूदा सामान्य कार्यक्षमता टूट (रिग्रेशन) तो नहीं जाएगी?&amp;rdquo; इस डर को दूर करने का एकमात्र तरीका &amp;ldquo;स्वचालित परीक्षण&amp;rdquo; है।&lt;/p>
&lt;p>हालाँकि, लिगेसी कोड में कोई परीक्षण नहीं होता है। यहीं पर &amp;ldquo;कैरेक्टराइजेशन टेस्ट (Characterization Test)&amp;rdquo; शुरू करने का महत्व आता है। कैरेक्टराइजेशन टेस्ट एक ऐसा परीक्षण है जो सिस्टम &amp;ldquo;कैसा व्यवहार करना चाहिए&amp;rdquo; के बजाय &amp;ldquo;वर्तमान में कैसे व्यवहार कर रहा है&amp;rdquo; को रिकॉर्ड करता है।&lt;/p>
&lt;p>निम्नलिखित फ्लोचार्ट सुरक्षित रीफैक्टरिंग के जीवनचक्र को दर्शाता है।&lt;/p>
&lt;pre class="mermaid">
flowchart TD
A[&amp;#34;लक्षित लिगेसी कोड की पहचान करें&amp;#34;] --&amp;gt; B[&amp;#34;कैरेक्टराइजेशन टेस्ट लिखें&amp;#34;]
B --&amp;gt; C[&amp;#34;पुष्टि करें कि सभी परीक्षण पास हो गए हैं&amp;#34;]
C --&amp;gt; D[&amp;#34;छोटा रीफैक्टरिंग करें&amp;#34;]
D --&amp;gt; E[&amp;#34;परीक्षण फिर से चलाएं&amp;#34;]
E -- विफल (Red) --&amp;gt; F[&amp;#34;परिवर्तन वापस लें (Revert)&amp;#34;]
F --&amp;gt; D
E -- सफल (Green) --&amp;gt; G[&amp;#34;कोड कमिट करें&amp;#34;]
G --&amp;gt; H{&amp;#34;क्या अगला सुधार क्षेत्र है?&amp;#34;}
H -- हाँ --&amp;gt; D
H -- नहीं --&amp;gt; I[&amp;#34;रीफैक्टरिंग पूरी हुई&amp;#34;]
&lt;/pre>
&lt;p>इस चक्र को घुमाकर, डेवलपर्स हमेशा सुरक्षा जाल पर कोड बदल सकते हैं। यदि परीक्षण विफल हो जाता है, तो कारण का गहराई से पता लगाए बिना तुरंत &lt;code>Revert&lt;/code> (वापस लेना) करना महत्वपूर्ण है।&lt;/p>
&lt;hr>
&lt;h2 id="3-परकषण-कषमत-बनन-क-लए-समस-seams-क-अवधरण">3. परीक्षण क्षमता बनाने के लिए &amp;ldquo;सीम्स (Seams)&amp;rdquo; की अवधारणा
&lt;/h2>&lt;p>जब आप लिगेसी कोड में परीक्षण जोड़ने का प्रयास करते हैं, तो सबसे पहली बाधा &amp;ldquo;निर्भरता&amp;rdquo; होती है। यदि डेटाबेस से सीधा कनेक्शन, नेटवर्क संचार, या हार्ड-कोडेड फाइल सिस्टम एक्सेस मजबूती से जुड़े हुए हैं, तो यूनिट टेस्ट (Unit Test) लिखना असंभव है।&lt;/p>
&lt;p>यहीं पर &amp;ldquo;सीम (Seam)&amp;rdquo; की अवधारणा आती है। सीम उस स्थान को संदर्भित करता है &amp;ldquo;जहां आप कोड को संपादित किए बिना सिस्टम के व्यवहार को बदल सकते हैं।&amp;rdquo; C++ में, हम मुख्य रूप से निम्नलिखित तीन सीम्स का उपयोग ঘনত্ব का उपयोग करते हैं:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>ऑब्जेक्ट सीम्स (Object Seams)&lt;/strong>: वर्चुअल फ़ंक्शंस (Virtual Functions) का उपयोग करके बहुरूपता (Polymorphism)।&lt;/li>
&lt;li>&lt;strong>कंपाइल-टाइम सीम्स (Compile-time Seams)&lt;/strong>: टेम्प्लेट्स (Templates) या &lt;code>#include&lt;/code> को स्विच करना।&lt;/li>
&lt;li>&lt;strong>लिंक-टाइम सीम्स (Link-time Seams)&lt;/strong>: बिल्ड के समय लिंक किए गए लाइब्रेरी या ऑब्जेक्ट फ़ाइलों को स्विच करना।&lt;/li>
&lt;/ol>
&lt;p>इनका उपयोग करके, हम उत्पादन पर्यावरण के मॉड्यूल को परीक्षण पर्यावरण के लिए मॉक (Mock) ऑब्जेक्ट्स से बदल सकते हैं, जिससे निर्भरता अलग हो जाती है।&lt;/p>
&lt;hr>
&lt;h2 id="4-घनषठ-यगमन-tight-coupling-क-तडन-डपडस-इजकशन-dependency-injection">4. घनिष्ठ युग्मन (Tight Coupling) को तोड़ना: डिपेंडेंसी इंजेक्शन (Dependency Injection)
&lt;/h2>&lt;p>डिपेंडेंसी इंजेक्शन (DI) ऑब्जेक्ट निर्माण की जिम्मेदारी को क्लास के अंदर से बाहर निकालने का एक शक्तिशाली पैटर्न है।&lt;/p>
&lt;p>आइए सबसे पहले लिगेसी और कसकर जुड़े (tightly coupled) C++ क्लास डिज़ाइन को देखें।&lt;/p>
&lt;pre class="mermaid">
classDiagram
class LegacyOrderProcessor {
-DatabaseConnection* db
-FileLogger* logger
+LegacyOrderProcessor()
+processOrder(int orderId) void
}
class DatabaseConnection {
+DatabaseConnection()
+save(int orderId) void
}
class FileLogger {
+FileLogger()
+log(string msg) void
}
LegacyOrderProcessor --&amp;gt; DatabaseConnection : &amp;#34;सीधा निर्माण (new का उपयोग करके)&amp;#34;
LegacyOrderProcessor --&amp;gt; FileLogger : &amp;#34;सीधा निर्माण (new का उपयोग करके)&amp;#34;
&lt;/pre>
&lt;p>यह &lt;code>LegacyOrderProcessor&lt;/code>, कंस्ट्रक्टर के अंदर &lt;code>DatabaseConnection&lt;/code> और &lt;code>FileLogger&lt;/code> को सीधे &lt;code>new&lt;/code> करता है, इसलिए इसे मॉक से बदलने के लिए कोई सीम नहीं है। इसे इंटरफ़ेस (शुद्ध वर्चुअल क्लास) का उपयोग करके ढीले युग्मित (loosely coupled) डिज़ाइन में रीफैक्टर करते हैं।&lt;/p>
&lt;pre class="mermaid">
classDiagram
class IDatabase {
&amp;lt;&amp;lt;interface&amp;gt;&amp;gt;
+save(int orderId) void
}
class ILogger {
&amp;lt;&amp;lt;interface&amp;gt;&amp;gt;
+log(string msg) void
}
class ModernOrderProcessor {
-std::unique_ptr~IDatabase~ db
-std::shared_ptr~ILogger~ logger
+ModernOrderProcessor(std::unique_ptr~IDatabase~ db, std::shared_ptr~ILogger~ logger)
+processOrder(int orderId) void
}
class DatabaseConnection {
+save(int orderId) void
}
class FileLogger {
+log(string msg) void
}
IDatabase &amp;lt;|.. DatabaseConnection : &amp;#34;कार्यान्वयन&amp;#34;
ILogger &amp;lt;|.. FileLogger : &amp;#34;कार्यान्वयन&amp;#34;
ModernOrderProcessor --&amp;gt; IDatabase : &amp;#34;DI (कंस्ट्रक्टर इंजेक्शन)&amp;#34;
ModernOrderProcessor --&amp;gt; ILogger : &amp;#34;DI (कंस्ट्रक्टर इंजेक्शन)&amp;#34;
&lt;/pre>
&lt;h3 id="लगस-कड-क-उदहरण-c03">लिगेसी कोड का उदाहरण (C++03)
&lt;/h3>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">LegacyOrderProcessor&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">private&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DatabaseConnection&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="n">db_&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">FileLogger&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="n">logger_&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">LegacyOrderProcessor&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">db_&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">DatabaseConnection&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;localhost&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">3306&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">logger_&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">FileLogger&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;/var/log/app.log&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">~&lt;/span>&lt;span class="n">LegacyOrderProcessor&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">delete&lt;/span> &lt;span class="n">db_&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">delete&lt;/span> &lt;span class="n">logger_&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">void&lt;/span> &lt;span class="nf">processOrder&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">orderId&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// प्रोसेसिंग...
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">db_&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">save&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">orderId&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">logger_&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Order processed&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="रफकटरग-क-बद-modern-c">रीफैक्टरिंग के बाद (Modern C++)
&lt;/h3>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// इंटरफ़ेस परिभाषा (ऑब्जेक्ट सीम)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">class&lt;/span> &lt;span class="nc">IDatabase&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">virtual&lt;/span> &lt;span class="o">~&lt;/span>&lt;span class="n">IDatabase&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">default&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">virtual&lt;/span> &lt;span class="kt">void&lt;/span> &lt;span class="nf">save&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">orderId&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">ILogger&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">virtual&lt;/span> &lt;span class="o">~&lt;/span>&lt;span class="n">ILogger&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">default&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">virtual&lt;/span> &lt;span class="kt">void&lt;/span> &lt;span class="nf">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">string&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">msg&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// बाहर से निर्भरता को इंजेक्ट करने के लिए डिज़ाइन
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">class&lt;/span> &lt;span class="nc">ModernOrderProcessor&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">private&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">unique_ptr&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">IDatabase&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">db_&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">shared_ptr&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">ILogger&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">logger_&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// कंस्ट्रक्टर इंजेक्शन (Constructor Injection)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">ModernOrderProcessor&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">unique_ptr&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">IDatabase&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">db&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">shared_ptr&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">ILogger&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">logger&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">:&lt;/span> &lt;span class="n">db_&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">move&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">db&lt;/span>&lt;span class="p">)),&lt;/span> &lt;span class="n">logger_&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">move&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">logger&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="p">{}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">void&lt;/span> &lt;span class="nf">processOrder&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">orderId&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">db_&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">save&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">orderId&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">logger_&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Order processed&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>इस तरह से डिज़ाइन को संशोधित करने से, Google Mock (gmock) जैसे फ्रेमवर्क का उपयोग करके आसानी से &lt;code>IDatabase&lt;/code> के मॉक ऑब्जेक्ट्स बनाए जा सकते हैं, जिससे टेस्ट ड्रिवन डेवलपमेंट (TDD) संभव हो जाता है।&lt;/p>
&lt;hr>
&lt;h2 id="5-खतरनक-गलबल-वरएबलस-और-सगलटन-क-नषट-करन">5. खतरनाक ग्लोबल वेरिएबल्स और सिंगलटन को नष्ट करना
&lt;/h2>&lt;p>लिगेसी C++ में सबसे अधिक परेशान करने वाली बात ग्लोबल वेरिएबल्स और &amp;ldquo;सिंगलटन (Singleton) पैटर्न&amp;rdquo; का दुरुपयोग है। सिंगलटन पहली नज़र में एक सुविधाजनक डिज़ाइन पैटर्न लग सकता है, लेकिन वास्तव में यह &amp;ldquo;ऑब्जेक्ट-ओरिएंटेड आवरण में छिपा एक ग्लोबल वेरिएबल&amp;rdquo; मात्र है।&lt;/p>
&lt;p>ग्लोबल अवस्था, परीक्षण मामलों के बीच स्थिति को साझा करती है, जिससे परीक्षणों का समानांतर निष्पादन असंभव हो जाता है और अज्ञात कारणों से फ्लेकी टेस्ट्स (Flaky Tests) होते हैं।&lt;/p>
&lt;p>समाधान यह है कि निहित ग्लोबल अवस्था पर निर्भरता को खत्म किया जाए और आवश्यक स्थिति को फ़ंक्शन तर्कों के रूप में स्पष्ट रूप से पास किया जाए (पैरामीटराइजेशन)। इसे &amp;ldquo;कंटेक्स्ट पासिंग (Context Passing)&amp;rdquo; कहा जाता है।&lt;/p>
&lt;hr>
&lt;h2 id="6-ममर-परबधन-क-आधनककरण-और-raii-क-सर">6. मेमोरी प्रबंधन का आधुनिकीकरण और RAII का सार
&lt;/h2>&lt;p>C++98/03 युग के कोड में, &lt;code>new&lt;/code> और &lt;code>delete&lt;/code> कोड में हर जगह बिखरे होते थे, जो मेमोरी लीक और डैंगलिंग पॉइंटर्स का एक प्रमुख कारण है। मॉडर्न C++ (C++11 और बाद) में, &lt;strong>स्वामित्व (Ownership)&lt;/strong> की अवधारणा को भाषा स्तर पर समर्थित किया गया है, और स्मार्ट पॉइंटर्स का उपयोग करके सुरक्षित संसाधन प्रबंधन एक मानक बन गया है।&lt;/p>
&lt;h3 id="raii-resource-acquisition-is-initialization">RAII (Resource Acquisition Is Initialization)
&lt;/h3>&lt;p>RAII C++ में सबसे महत्वपूर्ण इडियॉम है। यह संसाधन के आवंटन को ऑब्जेक्ट के आरंभीकरण (कंस्ट्रक्टर) के साथ जोड़ता है, और संसाधन की मुक्ति को ऑब्जेक्ट के विनाश (डिस्ट्रक्टर) के साथ जोड़ता है। यह सुनिश्चित करता है कि स्कोप से बाहर निकलने पर संसाधन निश्चित रूप से मुक्त हो जाएंगे।&lt;/p>
&lt;p>यदि कोई अपवाद (Exceptions) उत्पन्न होता है, तब भी स्टैक अनवाइंडिंग (Stack Unwinding) प्रक्रिया के दौरान स्थानीय वेरिएबल्स के डिस्ट्रक्टर स्वचालित रूप से कॉल किए जाते हैं, जिससे संसाधन रिसाव को रोका जा सकता है।&lt;/p>
&lt;p>&lt;strong>पहले (खतरनाक लिगेसी कोड)&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">processFile&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="kt">char&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="n">filename&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">FILE&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="n">file&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">fopen&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">filename&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;r&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="n">file&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">return&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Data&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="n">data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">Data&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="n">readData&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">file&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">data&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">delete&lt;/span> &lt;span class="n">data&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// भूलने की संभावना
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">fclose&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">file&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// भूलने की संभावना
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">return&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">process&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span> &lt;span class="k">catch&lt;/span> &lt;span class="p">(...)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">delete&lt;/span> &lt;span class="n">data&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// अपवाद के दौरान मेमोरी लीक से बचाव
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">fclose&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">file&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">throw&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">delete&lt;/span> &lt;span class="n">data&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">fclose&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">file&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>इस कोड में, नियंत्रण प्रवाह की हर शाखा पर मैन्युअल रूप से संसाधनों को मुक्त करना पड़ता है, जो एक अत्यंत नाजुक संरचना है।&lt;/p>
&lt;p>&lt;strong>बाद में (RAII और स्मार्ट पॉइंटर्स का उपयोग)&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">processFile&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">string&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">filename&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// std::ifstream फ़ाइल हैंडल को RAII के माध्यम से प्रबंधित करता है
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">ifstream&lt;/span> &lt;span class="n">file&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">filename&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="n">file&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">is_open&lt;/span>&lt;span class="p">())&lt;/span> &lt;span class="k">return&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// std::unique_ptr हीप मेमोरी को RAII के माध्यम से प्रबंधित करने वाला अनन्य स्वामी (exclusive owner) है
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">auto&lt;/span> &lt;span class="n">data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">make_unique&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">Data&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="n">readData&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">file&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// स्कोप छोड़ने पर स्वचालित रूप से मुक्त हो जाता है
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// अपवाद होने पर भी, unique_ptr और ifstream के डिस्ट्रक्टर
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// निश्चित रूप से संसाधनों को मुक्त करते हैं, इसलिए यह सुरक्षित है (शून्य मेमोरी लीक की गारंटी)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">process&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>इस रीफैक्टरिंग से, कोड की मात्रा काफी कम हो जाती है, इरादा भी स्पष्ट हो जाता है, और सबसे महत्वपूर्ण बात यह है कि अपवाद सुरक्षा (Exception Safety) की पूरी तरह से गारंटी दी जाती है।&lt;/p>
&lt;hr>
&lt;h2 id="7-मडरन-c-सवधओ-दवर-अभवयकत-म-सधर">7. मॉडर्न C++ सुविधाओं द्वारा अभिव्यक्ति में सुधार
&lt;/h2>&lt;p>लिगेसी कोड को रीफैक्टर करते समय, भाषा सुविधाओं के अपडेट के साथ आने वाले लाभों का पूरा उपयोग किया जाना चाहिए।&lt;/p>
&lt;h3 id="71-auto-क-सथ-परकर-अनमन-type-inference">7.1. &lt;code>auto&lt;/code> के साथ प्रकार अनुमान (Type Inference)
&lt;/h3>&lt;p>लंबे इटरेटर प्रकार नामों जैसे अनावश्यक विवरणों को &lt;code>auto&lt;/code> से बदलकर पठनीयता में सुधार होता है। हालाँकि, हर चीज़ को &lt;code>auto&lt;/code> बनाना सबसे अच्छा अभ्यास नहीं है, इसे केवल &amp;ldquo;उन मामलों तक सीमित करना सबसे अच्छा है जहाँ दाईं ओर देखने पर प्रकार स्पष्ट हो।&amp;rdquo;&lt;/p>
&lt;h3 id="72-constexpr-और-consteval-क-सथ-कपइल-टइम-गणन">7.2. &lt;code>constexpr&lt;/code> और &lt;code>consteval&lt;/code> के साथ कंपाइल-टाइम गणना
&lt;/h3>&lt;p>रनटाइम ओवरहेड को कम करने और कंपाइल टाइम पर त्रुटियों का पता लगाने के लिए &lt;code>constexpr&lt;/code> का सक्रिय रूप से उपयोग करें।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// लिगेसी कोड (मैक्रोज़ या रनटाइम गणना)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="cp">#define MAX_BUFFER_SIZE 1024
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="kt">double&lt;/span> &lt;span class="n">PI&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">3.1415926535&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">double&lt;/span> &lt;span class="nf">calculateCircleArea&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">double&lt;/span> &lt;span class="n">radius&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">PI&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">radius&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">radius&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// मॉडर्न C++ (C++20 और बाद) की शैली
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">constexpr&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">size_t&lt;/span> &lt;span class="n">MaxBufferSize&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1024&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">constexpr&lt;/span> &lt;span class="kt">double&lt;/span> &lt;span class="n">Pi&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">3.14159265358979323846&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// consteval (C++20) यह गारंटी देता है कि मूल्यांकन कंपाइल टाइम पर किया जा सकता है
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">consteval&lt;/span> &lt;span class="kt">double&lt;/span> &lt;span class="nf">calculateCircleArea&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">double&lt;/span> &lt;span class="n">radius&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">Pi&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">radius&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">radius&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// रनटाइम लागत शून्य है। संकलन के समय परिणामी स्थिरांक सीधे बाइनरी में एम्बेड हो जाता है।
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">constexpr&lt;/span> &lt;span class="kt">double&lt;/span> &lt;span class="n">area&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">calculateCircleArea&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mf">10.0&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="73-nodiscard-वशषत-attribute">7.3. &lt;code>[[nodiscard]]&lt;/code> विशेषता (Attribute)
&lt;/h3>&lt;p>फ़ंक्शंस के रिटर्न वैल्यू (विशेषकर एरर कोड या महत्वपूर्ण अवस्थाओं) को अनदेखा करने वाले बग्स को रोकने के लिए &lt;code>[[nodiscard]]&lt;/code> एट्रिब्यूट जोड़ें। ऐसा करने से, कंपाइलर उन कॉल्स के लिए चेतावनी जारी करेगा जो रिटर्न वैल्यू प्राप्त नहीं करते हैं।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="na">[[nodiscard]]&lt;/span> &lt;span class="kt">bool&lt;/span> &lt;span class="n">initializeSystem&lt;/span>&lt;span class="p">();&lt;/span> &lt;span class="c1">// रिटर्न वैल्यू को अनदेखा करना निषिद्ध है
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h2 id="8-ऑटमशन-टलस-क-उपयग-और-नरतर-सधर">8. ऑटोमेशन टूल्स का उपयोग और निरंतर सुधार
&lt;/h2>&lt;p>बड़े पैमाने पर लिगेसी कोडबेस को मैन्युअल रूप से संशोधित करना अवास्तविक है। टूलचेन की मदद लेना सफलता का शॉर्टकट है।&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Clang-Tidy&lt;/strong>: एक शक्तिशाली C++ लिंटर और स्टैटिक एनालिसिस टूल। &lt;code>modernize-*&lt;/code> चेक को सक्षम करके, यह स्वचालित रूप से &lt;code>auto&lt;/code> लागू करता है, &lt;code>nullptr&lt;/code> से बदलता है, &lt;code>override&lt;/code> जोड़ता है आदि (Fix-it)।&lt;/li>
&lt;li>&lt;strong>AddressSanitizer (ASan)&lt;/strong>: कंपाइल विकल्प (&lt;code>-fsanitize=address&lt;/code>) के रूप में शामिल करके, यह निष्पादन के दौरान मेमोरी लीक और बफर ओवररन्स की सटीक पहचान करता है। परीक्षण चलाते समय इसे हमेशा सक्षम किया जाना चाहिए।&lt;/li>
&lt;li>&lt;strong>CI/CD पाइपलाइन का निर्माण&lt;/strong>: GitHub Actions या GitLab CI का उपयोग करके सभी पुल अनुरोधों (Pull Requests) के लिए बिल्ड, स्वचालित परीक्षण और स्थिर विश्लेषण (static analysis) चलाएं, ताकि नए तकनीकी ऋण को प्रवेश करने से रोका जा सके।&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="9-नषकरष">9. निष्कर्ष
&lt;/h2>&lt;p>लिगेसी C++ कोड को रीफैक्टर करना एक रात में पूरा होने वाला काम नहीं है। यह सिस्टम पर सर्जरी करने जैसा एक नाजुक लेकिन साहसिक कार्य है।&lt;/p>
&lt;p>कृपया इस लेख में समझाए गए निम्नलिखित चरणों को ध्यान में रखें:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>जटिलता को मापें और तथ्यों के आधार पर रणनीति बनाएं&lt;/strong>&lt;/li>
&lt;li>&lt;strong>सीम्स खोजें और कैरेक्टराइजेशन टेस्ट के साथ सिस्टम को सुरक्षित करें&lt;/strong>&lt;/li>
&lt;li>&lt;strong>DI के साथ घनिष्ठ युग्मन (tight coupling) को तोड़ें और ग्लोबल अवस्था को खत्म करें&lt;/strong>&lt;/li>
&lt;li>&lt;strong>RAII और स्मार्ट पॉइंटर्स के माध्यम से मेमोरी प्रबंधन की चिंताओं को दूर करें&lt;/strong>&lt;/li>
&lt;li>&lt;strong>मॉडर्न C++ सुविधाओं का उपयोग करें और कंपाइलर को काम करने दें&lt;/strong>&lt;/li>
&lt;/ol>
&lt;p>&amp;ldquo;बॉय स्काउट नियम (कैंपग्राउंड को आपके आने से अधिक साफ छोड़कर जाएं)&amp;rdquo; की भावना रखें, और दैनिक विकास कार्यों में धीरे-धीरे लेकिन लगातार कोड में सुधार करना ही रीफैक्टरिंग का सच्चा रहस्य है।&lt;/p></description></item></channel></rss>