ورتیکال اسلایس: وقتی یه اسلایس به بیرون از خودش نیاز داره
خلاصهٔ کاملتر
اسکار دودیچ توی این نوشته سراغ سؤالی میره که مدام دربارهٔ ورتیکال اسلایسها پرسیده میشه: وقتی یه اسلایس به چیزی بیرون از خودش نیاز داره، چیکار باید بکنه؟ به گفتهٔ نویسنده، فرضِ نگفتهای که بیشترین آسیب رو میزنه اینه که اسلایس باید کاملاً خودکفا باشه، پس هر نیاز بیرونی یعنی برش رو اشتباه زدی. خودش هم یه مدت همین فرض رو داشته.
اول سراغ واژهها میره. اسلایس یه تیکه فانکشنالیتیه که از بالا تا پایین اپلیکیشن بریده شده — مثلاً «تأیید سفارش حمل» — و بیشتر شبیه یه فانکشنه تا یه انتیتی. ماژول یه گروهبندی منطقی از اسلایسهاست و معیار گروهبندی هم اینه که چی با چی با هم تغییر میکنه. باندد کانتکست توی DDD یه مرز زبانیه: جایی که یه کلمه همیشه یه معنی میده. نویسنده میگه فرانتاند و بکاند دو تا کانتکست نیستن، دو تا هدف دیپلویان؛ و هفت تا فیچرِ یه اپلیکیشن تقریباً همیشه اسلایس یا نهایتاً ماژولن، پس اصلاً قرار نبوده مستقل باشن.
راهحل پیشنهادیش اینه که هندلر دو تا آرگومان بگیره: اول وابستگیها، بعد پیام. خود اسلایس تایپ باریکِ چیزی که لازم داره رو کنار خودش و با واژگان خودش تعریف میکنه، نه یه اینترفیس پهن با پونزده متد که یکی دیگه طراحی کرده:
export type ContractorStatus = 'Active' | 'Unknown' | 'Suspended';
export type DriverStatus = 'Licensed' | 'Unknown' | 'Expired';
export type CheckContractor = (id: ContractorId) => Promise<ContractorStatus>;
export type CheckDriver = (id: DriverId) => Promise<DriverStatus>;سیستم شرکت حملونقل قطعاً مدل خیلی غنیتری از یه طرف قرارداد داره، ولی تأیید سفارش فقط لازمه بدونه این سفارش میتونه جلو بره یا نه. چون تایپاسکریپت تایپینگ ساختاری داره، هیچجا لازم نیست چیزی اعلام کنه که این تایپ رو پیادهسازی میکنه؛ هر تابعی با شکل سازگار کافیه. به گفتهٔ نویسنده همین باعث میشه بشه نیاز و هندلر و تست رو نوشت قبل از اینکه اصلاً معلوم بشه کی قراره تأمینش کنه. وصلکردن واقعی هم توی یه فایل نزدیک نقطهٔ ورود انجام میشه؛ همونجا کلاینت واقعی ساخته میشه و به شکلی که اسلایس خواسته درمیاد. نه کانتینری لازمه، نه ثبت وابستگی.
نویسنده معتقده همین الگو چند تا گره قدیمی رو هم باز میکنه: سیکل بین ماژولها از بین میره، چون هیچ ماژولی اون یکی رو ایمپورت نمیکنه و هر کدوم نیاز باریک خودش رو اعلام میکنه. دربارهٔ دیتابیس سه چیز رو از هم جدا میکنه: منطق کسبوکار بهازای هر انتیتی، مدل خوندن بهازای هر کوئری، و اسکیما بهازای هر ماژول — نه یه جدول برای هر اسلایس. توی فرانتاند هم اصرار به تناظر یکبهیک با بکاند رو اشتباه میدونه و میگه یا صفحه رو از چند اندپوینت بساز، یا یه اسلایس مخصوص همون صفحه بنویس.
نکات کلیدی:
- از داخل یه اسلایس، همهچیز بیرونیه؛ فرقی نمیکنه فولدر بغلی باشه یا یه سیستم دیگه
- تایپ باریکِ وابستگی رو همونجایی تعریف کن که مصرف میشه، با واژگان خودت
- ترکیب وابستگیها توی یه فایل نزدیک نقطهٔ ورود؛ بدون کانتینر و لایفتایم اسکوپ
- api.ts چیزیه که ماژول ارائه میده، تایپ نیاز چیزیه که اسلایس میخواد؛ هر دو لازمن
- منطق کسبوکار بهازای انتیتی، مدل خوندن بهازای کوئری، اسکیما بهازای ماژول




