CodeShot

Vertical Slice Architecture در مقابل Layered (N-Tier) Architecture

در Vertical Slice Architecture کد بر اساس هر قابلیت (Feature) سازمان‌دهی می‌شود و همه چیز مربوط به آن قابلیت (Controller، منطق، دسترسی به داده) در یک پوشه کنار هم قرار می‌گیرد، در حالی که در معماری لایه‌ای سنتی کد بر اساس نوع فنی (Controllers، Services، Repositories) در پوشه‌های جداگانه سازمان‌دهی می‌شود و هر قابلیت در چند لایه پخش است.

ویژگیVertical Slice ArchitectureLayered (N-Tier) Architecture
مبنای سازمان‌دهیقابلیت (Feature)نوع فنی (Layer)
کوپلینگ بین قابلیت‌هاکمبیشتر
تکرار کدقابل قبولبه حداقل می‌رسد

کِی از Vertical Slice Architecture استفاده کنیم؟

وقتی می‌خواهید تغییر یا افزودن یک قابلیت را بدون لمس کردن فایل‌های مرتبط با قابلیت‌های دیگر انجام دهید و کوپلینگ بین قابلیت‌ها را کم نگه دارید.

کِی از Layered (N-Tier) Architecture استفاده کنیم؟

وقتی تیم به ساختار سنتی و آشنا عادت دارد یا منطق مشترک زیادی بین قابلیت‌های مختلف باید در لایه‌های مشترک (مثل یک Service پایه) قرار گیرد.

مثال Vertical Slice Architecture

/Features/CreateOrder/
  CreateOrderEndpoint.cs
  CreateOrderHandler.cs
  CreateOrderValidator.cs
# همه‌چیز مربوط به یک قابلیت کنار هم

مثال Layered (N-Tier) Architecture

/Controllers/OrderController.cs
/Services/OrderService.cs
/Repositories/OrderRepository.cs
# منطق «ایجاد سفارش» در سه فایل پخش است

اشتباه رایج

اشتباه رایج تلاش برای اشتراک‌گذاری بیش از حد کد بین Slice های مختلف در Vertical Slice Architecture است که به‌تدریج آن را به همان معماری لایه‌ای قدیمی با یک لایه اشتراکی بزرگ تبدیل می‌کند؛ کمی تکرار کد بین Slice ها در این الگو قابل قبول و حتی مطلوب است.

جمع‌بندی

برای پروژه‌هایی با قابلیت‌های نسبتاً مستقل و تیم‌های بزرگ که هم‌زمان روی قابلیت‌های مختلف کار می‌کنند Vertical Slice و برای پروژه‌های ساده‌تر با منطق مشترک زیاد بین بخش‌ها معماری لایه‌ای سنتی مناسب‌تر است.