Stop Circular Dependencies dengan SDP
Circular dependencies adalah pembunuh senyap. Ia tidak menyebabkan ralat binaan (build errors). Ia tidak menyebabkan pengecualian masa larian (runtime exceptions) semasa import. Sebaliknya, ia menyebabkan nilai undefined yang halus yang muncul dalam produksi beberapa minggu kemudian.
Kitaran berlaku apabila Modul A mengimport daripada B, dan B mengimport semula daripada A.
JavaScript menyelesaikan import ini secara senyap. Jika Modul A masih dalam proses pemuatan apabila Modul B memintanya, JavaScript akan mengembalikan objek kosong. Kod anda akan gagal kemudian, dan jejak timbunan (stack trace) akan menunjukkan ke tempat yang salah.
Anda boleh membaiki perkara ini dengan dependency-cruiser. Alat ini mengimbas fail anda dan memetakan graf kebergantungan anda. Ia berfungsi dengan TypeScript dan monorepo.
Cara untuk menyediakannya:
- Tambah ia ke dalam dev dependencies anda:
yarn add -D dependency-cruiser - Tambah skrip ke dalam
package.jsonanda:"depcruise": "depcruise packages --config .dependency-cruiser.js" - Cipta fail
.dependency-cruiser.jsuntuk mengesan kitaran.
Tetapi mencari kitaran hanyalah separuh daripada perjuangan. Anda mesti menghalangnya daripada terbentuk.
Gunakan Prinsip Kebergantungan Stabil (Stable Dependencies Principle - SDP). Peraturan ini menyatakan bahawa anda mesti bergantung mengikut arah kestabilan.
Kestabilan adalah sifat struktur. Sesuatu modul adalah stabil apabila banyak modul lain bergantung kepadanya. Jika anda mengubah modul yang stabil, anda akan menjejaskan ramai orang. Kos ini menjadikannya stabil.
Gunakan formula Ketidakstabilan (Instability): I = Fan-Out / (Fan-In + Fan-Out)
• I = 0 bermaksud modul tersebut adalah paling stabil. Segalanya bergantung kepadanya, dan ia tidak bergantung kepada apa-apa. • I = 1 bermaksud modul tersebut adalah paling tidak stabil. Ia bergantung kepada banyak perkara, dan tiada apa yang bergantung kepadanya.
Peraturannya: Skor ketidakstabilan sesuatu modul mestilah lebih tinggi daripada skor setiap modul yang diimportnya. Anak panah anda mestilah menghala ke arah ketidakstabilan yang lebih rendah.
Utiliti tahap rendah anda (I ≈ 0) tidak sepatutnya mengimport daripada halaman tahap tinggi anda (I ≈ 1).
Anda boleh menukarkan prinsip ini kepada peraturan automatik dengan dependency-cruiser. Daripada sekadar menyemak kitaran, semak arahnya:
- Halang utiliti daripada mengimport daripada ciri (features).
- Halang ciri (features) daripada mengimport daripada halaman (pages).
Ini menghentikan keadaan struktur yang mencipta kitaran. Anda berhenti bertindak balas terhadap pepijat (bugs) dan mula mencegahnya.
