SDP सह सर्कुलर डिपेंडन्सीज (Circular Dependencies) थांबवा
सर्कुलर डिपेंडन्सीज हे शांत मारेकरी आहेत. ते बिल्ड एरर्स (build errors) निर्माण करत नाहीत. इम्पोर्ट करताना ते रनटाइम एक्सेप्शन (runtime exceptions) देखील देत नाहीत. त्याऐवजी, ते सूक्ष्म 'undefined' व्हॅल्यूज निर्माण करतात, ज्या काही आठवड्यांनंतर प्रोडक्शनमध्ये दिसून येतात.
जेव्हा मॉड्यूल A, मॉड्यूल B मधून इम्पोर्ट करते आणि मॉड्यूल B पुन्हा मॉड्यूल A मधून इम्पोर्ट करते, तेव्हा सायकल (cycle) तयार होते.
JavaScript या इम्पोर्ट्सना शांतपणे रिझॉल्व्ह (resolve) करते. जर मॉड्यूल B ने मागणी केली आणि तोपर्यंत मॉड्यूल A लोड होत असेल, तर JavaScript एक रिकामे ऑब्जेक्ट (empty object) रिटर्न करते. यामुळे तुमचा कोड नंतर फेल होतो आणि स्टॅक ट्रेस (stack trace) चुकीच्या ठिकाणी निर्देश करतो.
तुम्ही dependency-cruiser वापरून हे सुधारू शकता. हे टूल तुमच्या फाइल्स स्कॅन करते आणि तुमच्या डिपेंडन्सी ग्राफचा (dependency graph) नकाशा तयार करते. हे TypeScript आणि monorepos सोबत काम करते.
ते कसे सेट करायचे:
- तुमच्या dev dependencies मध्ये ते जोडा:
yarn add -D dependency-cruiser - तुमच्या
package.jsonमध्ये एक स्क्रिप्ट जोडा:"depcruise": "depcruise packages --config .dependency-cruiser.js" - सायकल पकडण्यासाठी एक
.dependency-cruiser.jsफाईल तयार करा.
पण सायकल शोधणे हा केवळ अर्धा लढा आहे. तुम्हाला त्या तयार होऊ नयेत म्हणून थांबवावे लागेल.
Stable Dependencies Principle (SDP) वापरा. हा नियम सांगतो की तुम्ही स्थिरतेच्या (stability) दिशेने अवलंबून असायला हवे.
स्थिरता (Stability) हा एक स्ट्रक्चरल गुणधर्म आहे. जेव्हा इतर अनेक मॉड्यूल्स एखाद्या मॉड्यूलवर अवलंबून असतात, तेव्हा ते मॉड्यूल 'स्टेबल' (stable) असते. जर तुम्ही एखादे स्टेबल मॉड्यूल बदलले, तर त्याचा परिणाम अनेक लोकांवर होतो. हा खर्च (cost) त्याला स्टेबल बनवतो.
Instability फॉर्म्युला वापरा:
I = Fan-Out / (Fan-In + Fan-Out)
• I = 0 म्हणजे मॉड्यूल जास्तीत जास्त स्टेबल आहे. सर्व काही त्यावर अवलंबून आहे आणि ते कशावरही अवलंबून नाही.
• I = 1 म्हणजे मॉड्यूल जास्तीत जास्त अनस्टेबल (unstable) आहे. ते अनेक गोष्टींवर अवलंबून आहे आणि त्यावर कोणीही अवलंबून नाही.
नियम: एखाद्या मॉड्यूलचा इन्स्टॅबिलिटी स्कोअर (instability score) त्याने इम्पोर्ट केलेल्या प्रत्येक मॉड्यूलच्या स्कोअरपेक्षा जास्त असावा. तुमचे बाण (arrows) कमी इन्स्टॅबिलिटीकडे निर्देश करणारे असावेत.
तुमचे लो-लेव्हल युटिलिट्स (low-level utils) (I ≈ 0) तुमच्या हाय-लेव्हल पेजेस (high-level pages) (I ≈ 1) मधून कधीही इम्पोर्ट करू नयेत.
तुम्ही dependency-cruiser वापरून या तत्त्वाचे रूपांतर एका ऑटोमेटेड नियमात करू शकता. फक्त सायकल तपासण्याऐवजी, दिशा तपासा:
- युटिलिट्सना फीचर्समधून (features) इम्पोर्ट करण्यापासून रोखा.
- फीचर्सना पेजेसमधून (pages) इम्पोर्ट करण्यापासून रोखा.
यामुळे सायकल तयार करणाऱ्या स्ट्रक्चरल परिस्थिती थांबतात. तुम्ही बग्सवर प्रतिक्रिया देणे थांबवता आणि ते रोखण्यास सुरुवात करता.
