Stop Circular Dependencies With SDP

سرکلر ڈیپینڈینسیز (Circular dependencies) خاموش قاتل ہیں۔ یہ بلڈ ایررز (build errors) کا باعث نہیں بنتیں۔ یہ امپورٹ کے وقت رن ٹائم استثنا (runtime exceptions) بھی پیدا نہیں کرتیں۔ اس کے بجائے، یہ ایسی باریک undefined ویلیوز پیدا کرتی ہیں جو ہفتوں بعد پروڈکشن میں ظاہر ہوتی ہیں۔

ایک سائیکل تب بنتا ہے جب ماڈیول A، ماڈیول B سے امپورٹ کرتا ہے، اور ماڈیول B واپس ماڈیول A سے امپورٹ کرتا ہے۔

JavaScript ان امپورٹس کو خاموشی سے حل کرتا ہے۔ اگر ماڈیول 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) ایک ساختی خصوصیت ہے۔ ایک ماڈیول تب مستحکم ہوتا ہے جب بہت سے دوسرے ماڈیولز اس پر انحصار (depend) کرتے ہیں۔ اگر آپ ایک مستحکم ماڈیول کو تبدیل کرتے ہیں، تو آپ بہت سے لوگوں کو متاثر کرتے ہیں۔ یہی قیمت اسے مستحکم بناتی ہے۔

Instability فارمولا استعمال کریں: I = Fan-Out / (Fan-In + Fan-Out)

• I = 0 کا مطلب ہے کہ ماڈیول انتہائی مستحکم ہے۔ ہر چیز اس پر انحصار کرتی ہے، اور یہ کسی چیز پر انحصار نہیں کرتا۔ • I = 1 کا مطلب ہے کہ ماڈیول انتہائی غیر مستحکم ہے۔ یہ بہت سی چیزوں پر انحصار کرتا ہے، اور کوئی چیز اس پر انحصار نہیں کرتی۔

اصول: ایک ماڈیول کا ان سٹیبلٹی اسکور (instability score) ان تمام ماڈیولز کے اسکور سے زیادہ ہونا چاہیے جنہیں وہ امپورٹ کرتا ہے۔ آپ کے تیر (arrows) کم ان سٹیبلٹی کی طرف اشارہ کرنے چاہئیں۔

آپ کے low-level utils (I ≈ 0) کو کبھی بھی آپ کے high-level pages (I ≈ 1) سے امپورٹ نہیں کرنا چاہیے۔

آپ dependency-cruiser کے ذریعے اس اصول کو ایک خودکار اصول میں بدل سکتے ہیں۔ صرف سائیکلز کو چیک کرنے کے بجائے، سمت (direction) کو چیک کریں:

  • utils کو features سے امپورٹ کرنے سے روکیں۔
  • features کو pages سے امپورٹ کرنے سے روکیں۔

یہ ان ساختی حالات کو روکتا ہے جو سائیکلز پیدا کرتے ہیں۔ آپ بگ (bugs) پر ردعمل دینا بند کر دیتے ہیں اور انہیں روکنا شروع کر دیتے ہیں۔

ماخذ: https://dev.to/wojciech_kot_b82f5d7cbfc6/stop-circular-dependencies-before-they-stop-you-dependency-cruiser-the-stable-dependencies-34ho