SDP দিয়ে সার্কুলার ডিপেন্ডেন্সি (Circular Dependencies) বন্ধ করুন
সার্কুলার ডিপেন্ডেন্সি হলো এক ধরণের নিঃশব্দ ঘাতক। এগুলো বিল্ড এরর (build errors) তৈরি করে না। ইমপোর্ট করার সময় এগুলো রানটাইম এক্সেপশন (runtime exceptions) তৈরি করে না। পরিবর্তে, এগুলো এমন কিছু সূক্ষ্ম 'undefined' ভ্যালু তৈরি করে যা কয়েক সপ্তাহ পর প্রোডাকশনে ধরা পড়ে।
একটি সাইকেল তখনই ঘটে যখন Module A থেকে B ইমপোর্ট করা হয়, এবং B আবার A থেকে ইমপোর্ট করে।
JavaScript এই ইমপোর্টগুলোকে নিঃশব্দে সমাধান করে। যদি Module B যখন Module A-কে রিকোয়েস্ট করে তখন Module 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) দিকে ডিপেন্ড করতে হবে।
স্থিতিশীলতা হলো একটি স্ট্রাকচারাল বৈশিষ্ট্য। একটি মডিউল তখন স্থিতিশীল হয় যখন আরও অনেক মডিউল তার ওপর ডিপেন্ড করে। আপনি যদি একটি স্থিতিশীল মডিউল পরিবর্তন করেন, তবে আপনি অনেককেই প্রভাবিত করবেন। এই পরিবর্তনের খরচ বা প্রভাবই একে স্থিতিশীল করে তোলে।
Instability ফর্মুলাটি ব্যবহার করুন: I = Fan-Out / (Fan-In + Fan-Out)
• I = 0 মানে একটি মডিউল সর্বোচ্চ স্থিতিশীল। সবকিছু এর ওপর ডিপেন্ড করে, কিন্তু এটি কোনো কিছুর ওপর ডিপেন্ড করে না। • I = 1 মানে একটি মডিউল সর্বোচ্চ অস্থির (unstable)। এটি অনেক কিছুর ওপর ডিপেন্ড করে, কিন্তু কোনো কিছুই এর ওপর ডিপেন্ড করে না।
নিয়মটি হলো: একটি মডিউলের instability score অবশ্যই তার ইমপোর্ট করা প্রতিটি মডিউলের score-এর চেয়ে বেশি হতে হবে। আপনার অ্যারো (arrows) অবশ্যই কম অস্থিরতার (lower instability) দিকে নির্দেশ করবে।
আপনার low-level utils (I ≈ 0) কখনোই আপনার high-level pages (I ≈ 1) থেকে ইমপোর্ট করা উচিত নয়।
আপনি dependency-cruiser দিয়ে এই নীতিটিকে একটি অটোমেটেড নিয়মে রূপান্তর করতে পারেন। শুধু সাইকেল চেক করার পরিবর্তে, দিক (direction) চেক করুন:
- utils যাতে features থেকে ইমপোর্ট না করে তা নিশ্চিত করুন।
- features যাতে pages থেকে ইমপোর্ট না করে তা নিশ্চিত করুন।
এটি সেই স্ট্রাকচারাল কন্ডিশনগুলো বন্ধ করে দেয় যা সাইকেল তৈরি করে। আপনি তখন বাগের (bug) প্রতিকার করার পরিবর্তে সেগুলো প্রতিরোধ করতে শুরু করবেন।
