SDP ಮೂಲಕ ಸರ್ಕ್ಯುಲರ್ ಡಿಪೆಂಡೆನ್ಸಿಗಳನ್ನು (Circular Dependencies) ತಡೆಯಿರಿ
ಸರ್ಕ್ಯುಲರ್ ಡಿಪೆಂಡೆನ್ಸಿಗಳು ಮೌನ ಕೊಲೆಗಾರರಿದ್ದಂತೆ. ಅವು ಬಿಲ್ಡ್ ದೋಷಗಳನ್ನು (build errors) ಉಂಟುಮಾಡುವುದಿಲ್ಲ. ಇಂಪೋರ್ಟ್ ಮಾಡುವಾಗ ರನ್ಟೈಮ್ ಎಕ್ಸೆಪ್ಶನ್ಗಳನ್ನು (runtime exceptions) ಉಂಟುಮಾಡುವುದಿಲ್ಲ. ಬದಲಾಗಿ, ಅವು ವಾರಗಳ ನಂತರ ಪ್ರೊಡಕ್ಷನ್ನಲ್ಲಿ ಕಾಣಿಸಿಕೊಳ್ಳುವ ಸೂಕ್ಷ್ಮವಾದ 'undefined' ಮೌಲ್ಯಗಳಿಗೆ ಕಾರಣವಾಗುತ್ತವೆ.
ಮಾಡ್ಯೂಲ್ A ಎಂಬುದು B ಇಂದ ಇಂಪೋರ್ಟ್ ಮಾಡಿದಾಗ ಮತ್ತು B ಎಂಬುದು ಮತ್ತೆ A ಇಂದ ಇಂಪೋರ್ಟ್ ಮಾಡಿದಾಗ ಸೈಕಲ್ (cycle) ಉಂಟಾಗುತ್ತದೆ.
JavaScript ಈ ಇಂಪೋರ್ಟ್ಗಳನ್ನು ಮೌನವಾಗಿ ನಿರ್ಧರಿಸುತ್ತದೆ. ಮಾಡ್ಯೂಲ್ B ವಿನಂತಿಸಿದಾಗ ಮಾಡ್ಯೂಲ್ A ಇನ್ನೂ ಲೋಡ್ ಆಗುತ್ತಿದ್ದರೆ, JavaScript ಖಾಲಿ ಆಬ್ಜೆಕ್ಟ್ ಅನ್ನು (empty object) ನೀಡುತ್ತದೆ. ಇದರಿಂದ ನಿಮ್ಮ ಕೋಡ್ ನಂತರ ವಿಫಲವಾಗುತ್ತದೆ ಮತ್ತು ಸ್ಟ್ಯಾಕ್ ಟ್ರೇಸ್ (stack trace) ತಪ್ಪಾದ ಸ್ಥಳವನ್ನು ತೋರಿಸುತ್ತದೆ.
ನೀವು ಇದನ್ನು dependency-cruiser ಮೂಲಕ ಸರಿಪಡಿಸಬಹುದು. ಈ ಟೂಲ್ ನಿಮ್ಮ ಫೈಲ್ಗಳನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡುತ್ತದೆ ಮತ್ತು ನಿಮ್ಮ ಡಿಪೆಂಡೆನ್ಸಿ ಗ್ರಾಫ್ ಅನ್ನು ಮ್ಯಾಪ್ ಮಾಡುತ್ತದೆ. ಇದು 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) ದಿಕ್ಕಿನಲ್ಲಿ ಡಿಪೆಂಡ್ ಆಗಬೇಕು ಎಂದು ಹೇಳುತ್ತದೆ.
ಸ್ಥಿರತೆಯು ಒಂದು ರಚನಾತ್ಮಕ ಗುಣಲಕ್ಷಣವಾಗಿದೆ (structural property). ಅನೇಕ ಇತರ ಮಾಡ್ಯೂಲ್ಗಳು ಒಂದು ಮಾಡ್ಯೂಲ್ ಮೇಲೆ ಡಿಪೆಂಡ್ ಆಗಿದ್ದಾಗ, ಆ ಮಾಡ್ಯೂಲ್ ಸ್ಥಿರವಾಗಿರುತ್ತದೆ. ನೀವು ಒಂದು ಸ್ಥಿರ ಮಾಡ್ಯೂಲ್ ಅನ್ನು ಬದಲಾಯಿಸಿದರೆ, ಅದು ಅನೇಕ ಜನರನ್ನು ಬಾಧಿಸುತ್ತದೆ. ಈ ವೆಚ್ಚವೇ ಅದನ್ನು ಸ್ಥಿರವಾಗಿಸುತ್ತದೆ.
Instability ಫಾರ್ಮುಲಾವನ್ನು ಬಳಸಿ: I = Fan-Out / (Fan-In + Fan-Out)
• I = 0 ಎಂದರೆ ಮಾಡ್ಯೂಲ್ ಗರಿಷ್ಠ ಮಟ್ಟದಲ್ಲಿ ಸ್ಥಿರವಾಗಿದೆ ಎಂದರ್ಥ. ಎಲ್ಲವೂ ಅದರ ಮೇಲೆ ಡಿಪೆಂಡ್ ಆಗಿವೆ ಮತ್ತು ಅದು ಯಾವುದರ ಮೇಲೂ ಡಿಪೆಂಡ್ ಆಗಿಲ್ಲ. • I = 1 ಎಂದರೆ ಮಾಡ್ಯೂಲ್ ಗರಿಷ್ಠ ಮಟ್ಟದಲ್ಲಿ ಅಸ್ಥಿರವಾಗಿದೆ ಎಂದರ್ಥ. ಅದು ಅನೇಕ ವಿಷಯಗಳ ಮೇಲೆ ಡಿಪೆಂಡ್ ಆಗಿದೆ ಮತ್ತು ಅದರ ಮೇಲೆ ಯಾವುದೂ ಡಿಪೆಂಡ್ ಆಗಿಲ್ಲ.
ನಿಯಮ: ಒಂದು ಮಾಡ್ಯೂಲ್ನ ಅಸ್ಥಿರತೆಯ ಸ್ಕೋರ್ (instability score), ಅದು ಇಂಪೋರ್ಟ್ ಮಾಡುವ ಪ್ರತಿಯೊಂದು ಮಾಡ್ಯೂಲ್ನ ಸ್ಕೋರ್ಗಿಂತ ಹೆಚ್ಚಿರಬೇಕು. ನಿಮ್ಮ ಬಾಣದ ಗುರುತುಗಳು ಕಡಿಮೆ ಅಸ್ಥಿರತೆಯ ಕಡೆಗೆ ಇರಬೇಕು.
ನಿಮ್ಮ low-level utils (I ≈ 0) ಎಂದಿಗೂ ನಿಮ್ಮ high-level pages (I ≈ 1) ಇಂದ ಇಂಪೋರ್ಟ್ ಮಾಡಬಾರದು.
ನೀವು dependency-cruiser ಬಳಸಿ ಈ ತತ್ವವನ್ನು ಸ್ವಯಂಚಾಲಿತ ನಿಯಮವನ್ನಾಗಿ ಪರಿವರ್ತಿಸಬಹುದು. ಕೇವಲ ಸೈಕಲ್ಗಳನ್ನು ಪತ್ತೆಹಚ್ಚುವ ಬದಲು, ದಿಕ್ಕನ್ನು (direction) ಪರೀಕ್ಷಿಸಿ:
- utilsಗಳು features ಇಂದ ಇಂಪೋರ್ಟ್ ಮಾಡುವುದನ್ನು ತಡೆಯಿರಿ.
- featuresಗಳು pages ಇಂದ ಇಂಪೋರ್ಟ್ ಮಾಡುವುದನ್ನು ತಡೆಯಿರಿ.
ಇದು ಸೈಕಲ್ಗಳನ್ನು ಸೃಷ್ಟಿಸುವ ರಚನಾತ್ಮಕ ಪರಿಸ್ಥಿತಿಗಳನ್ನು ತಡೆಯುತ್ತದೆ. ನೀವು ಬಗ್ಗಳಿಗೆ ಪ್ರತಿಕ್ರಿಯಿಸುವುದನ್ನು ನಿಲ್ಲಿಸಿ, ಅವುಗಳನ್ನು ತಡೆಯಲು ಪ್ರಾರಂಭಿಸುತ್ತೀರಿ.
