SDPతో సర్క్యులర్ డిపెండెన్సీలను (Circular Dependencies) ఆపండి

సర్క్యులర్ డిపెండెన్సీలు నిశ్శబ్ద హంతకులు. ఇవి బిల్డ్ ఎర్రర్లను కలిగించవు. ఇంపోర్ట్ చేసినప్పుడు రన్‌టైమ్ ఎక్సెప్షన్లను కూడా కలిగించవు. దానికి బదులుగా, ఇవి కొన్ని వారాల తర్వాత ప్రొడక్షన్‌లో కనిపించే సూక్ష్మమైన '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). చాలా ఇతర మాడ్యూల్స్ ఒక మాడ్యూల్‌పై ఆధారపడి ఉన్నప్పుడు, ఆ మాడ్యూల్ స్థిరంగా (stable) ఉన్నట్లు లెక్క. మీరు ఒక స్థిరమైన మాడ్యూల్‌ను మారిస్తే, అది చాలా మందిని ప్రభావితం చేస్తుంది. ఈ ఖర్చు (cost) వల్ల అది స్థిరంగా మారుతుంది.

Instability ఫార్ములాను ఉపయోగించండి: I = Fan-Out / (Fan-In + Fan-Out)

• I = 0 అంటే ఒక మాడ్యూల్ గరిష్టంగా స్థిరంగా (maximally stable) ఉందని అర్థం. అంతా దానిపై ఆధారపడి ఉంటుంది, కానీ అది దేనిపైనా ఆధారపడదు. • I = 1 అంటే ఒక మాడ్యూల్ గరిష్టంగా అస్థిరంగా (maximally unstable) ఉందని అర్థం. అది చాలా విషయాలపై ఆధారపడి ఉంటుంది, కానీ దానిపై ఏదీ ఆధారపడదు.

నియమం: ఒక మాడ్యూల్ యొక్క అస్థిరత స్కోరు (instability score), అది ఇంపోర్ట్ చేసే ప్రతి మాడ్యూల్ యొక్క స్కోరు కంటే ఎక్కువగా ఉండాలి. మీ బాణాలు (arrows) తక్కువ అస్థిరత వైపు ఉండాలి.

మీ low-level utils (I ≈ 0) ఎప్పుడూ మీ high-level pages (I ≈ 1) నుండి ఇంపోర్ట్ చేయకూడదు.

మీరు dependency-cruiserతో ఈ సూత్రాన్ని ఒక ఆటోమేటెడ్ నియమంగా మార్చవచ్చు. కేవలం సైకిల్‌లను మాత్రమే కాకుండా, దిశను (direction) కూడా తనిఖీ చేయండి:

  • utils ఫీచర్‌ల (features) నుండి ఇంపోర్ట్ చేయకుండా నిరోధించండి.
  • ఫీచర్‌లు పేజీల (pages) నుండి ఇంపోర్ట్ చేయకుండా నిరోధించండి.

ఇది సైకిల్‌లను సృష్టించే నిర్మాణపరమైన పరిస్థితులను ఆపుతుంది. దీనివల్ల మీరు బగ్‌లకు ప్రతిస్పందించడం మానేసి, వాటిని నివారించడం ప్రారంభిస్తారు.

మూలం: https://dev.to/wojciech_kot_b82f5d7cbfc6/stop-circular-dependencies-before-they-stop-you-dependency-cruiser-the-stable-dependencies-34ho