लीगेसी PHP कोड का रीफैक्टरिंग: उन्नत तकनीकें और रणनीतियाँ

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

लीगेसी PHP कोड का रीफैक्टरिंग: उन्नत स्तर

\n\n

PHP पर पुराने (legacy) कोड के साथ काम करना कई डेवलपर्स के लिए एक अपरिहार्य वास्तविकता है। अक्सर ऐसा कोड परीक्षणों के बिना, वैश्विक निर्भरताओं और व्यावसायिक तर्क के प्रस्तुतीकरण के साथ मिश्रण वाला एक मोनोलिथिक एप्लिकेशन होता है। "आँख से" सरल रीफैक्टरिंग घातक त्रुटियों का कारण बन सकती है। इस लेख में, हम रीफैक्टरिंग की उन्नत तकनीकों पर विचार करेंगे जो आपको legacy सिस्टम को सुरक्षित और कुशलता से आधुनिक बनाने की अनुमति देंगी।

\n\n

1. "Seam" रणनीति: ब्रेक पॉइंट बनाना

\n\n

लीगेसी कोड के रीफैक्टरिंग में पहला कदम सीम (seams) बनाना है। सीम एक ऐसी जगह है जहाँ आप कोड को सीधे संपादित किए बिना उसके व्यवहार को बदल सकते हैं। यह विशेष रूप से महत्वपूर्ण है जब कोड परीक्षणों द्वारा कवर नहीं किया गया है और आप इसे अलगाव में नहीं चला सकते हैं।

\n\n

एक क्लासिक उदाहरण पर विचार करें: विधि के अंदर डेटाबेस के साथ सीधा काम।

\n\n
<?php\n// Legacy कोड\nclass UserReport {\n    public function getActiveUsers() {\n        $db = new PDO('mysql:host=localhost;dbname=test', 'root', '');\n        $stmt = $db->query("SELECT * FROM users WHERE active = 1");\n        return $stmt->fetchAll();\n    }\n}\n?>
\n\n

समस्या: new PDO(...) एक कठोर निर्भरता बनाता है। इस विधि का परीक्षण करने के लिए, आपके पास एक वास्तविक डेटाबेस होना चाहिए।

\n\n

समाधान: कंस्ट्रक्टर के माध्यम से निर्भरता इंजेक्शन।

\n\n
<?php\n// रीफैक्टरिंग: DI के माध्यम से सीम बनाना\nclass UserReport {\n    private PDO $pdo;\n\n    public function __construct(PDO $pdo) {\n        $this->pdo = $pdo;\n    }\n\n    public function getActiveUsers(): array {\n        $stmt = $this->pdo->query("SELECT * FROM users WHERE active = 1");\n        return $stmt->fetchAll();\n    }\n}\n\n// उपयोग\n$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');\n$report = new UserReport($pdo);\n?>
\n\n

अब आप परीक्षणों में PDO को मॉक-ऑब्जेक्ट से बदल सकते हैं। यह एक सरल लेकिन प्रभावी सीम है।

\n\n

2. "Sprout Method" और "Sprout Class" पैटर्न

\n\n

जब आप मौजूदा विधि को बदल नहीं सकते (उदाहरण के लिए, परीक्षणों की कमी के कारण), तो "Sprout" रणनीति का उपयोग करें - पुराने कोड के बगल में नया कोड बनाएं, धीरे-धीरे कॉल को स्विच करें।

\n\n

उदाहरण: हमारे पास एक बहुत बड़ी विधि है जो उपयोगकर्ता को मान्य और सहेजती है।

\n\n
<?php\nclass UserService {\n    public function saveUser(array $data): bool {\n        // सत्यापन, लॉगिंग और सेविंग की 100 पंक्तियाँ\n        $email = $data['email'] ?? '';\n        if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {\n            throw new InvalidArgumentException('Invalid email');\n        }\n        // ... बहुत सारा अन्य कोड\n        $db = new PDO(...);\n        $stmt = $db->prepare("INSERT INTO users ...");\n        // ...\n    }\n}\n?>
\n\n

पूरी विधि को एक साथ रीफैक्टर करने के बजाय, सत्यापन के लिए एक नया वर्ग बनाएं।

\n\n
<?php\nclass UserValidator {\n    public function validate(array $data): void {\n        if (!filter_var($data['email'] ?? '', FILTER_VALIDATE_EMAIL)) {\n            throw new InvalidArgumentException('Invalid email');\n        }\n        // अन्य जाँचें जोड़ें\n    }\n}\n\nclass UserService {\n    private UserValidator $validator;\n\n    public function __construct(UserValidator $validator) {\n        $this->validator = $validator;\n    }\n\n    public function saveUser(array $data): bool {\n        $this->validator->validate($data);\n        // बाकी कोड अभी के लिए रहता है\n    }\n}\n?>
\n\n

अब आप पुराने कोड को छुए बिना UserValidator के लिए यूनिट टेस्ट लिख सकते हैं। धीरे-धीरे आप saveUser से तर्क को नए वर्गों में निकालेंगे।

\n\n

3. वैश्विक अवस्थाओं और स्टैटिक्स से छुटकारा

\n\n

लीगेसी कोड अक्सर वैश्विक चर, सिंगलटन और स्थैतिक विधियों का उपयोग करता है। यह कोड को लगभग असंभव बना देता है

ब्लॉग

पुस्तक अनुशंसाएँ