كل المقالات
تصميم الأنظمةمعمارية البرمجيات

حدود واضحة قبل خدمات أكثر

نظام صغير بمسؤوليات واضحة نقطة بداية تستحقّ الاهتمام.

Read in English
في هذه الصفحة

تقسيم التطبيق إلى خدمات يضيف أماكن جديدة لوضع الكود، لكنه لا يجعل المسؤوليات أوضح تلقائيًا.

قبل أن تختار عدد الأجزاء التي ستنشرها، اسأل: أيّ جزء من النظام يملك كل قرار؟

اجعل لكل قاعدة مكانًا

تخيّل تطبيقًا للحجوزات يسمح بإلغاء الحجز حتى موعد محدّد. تحتاج هذه القاعدة إلى مكان واضح يمكن لكل مسار في التطبيق الرجوع إليه.

إذا طبّقت واجهة الويب القاعدة بطريقتها، وطبّقتها المهمة الخلفية بطريقة أخرى، أصبح لدى النظام إجابتان للسؤال نفسه.

يرسل المستخدم طلبًا إلى التطبيق. تبقى قواعد العمل داخل حدود التطبيق، ويتواصل التطبيق مع قاعدة بيانات منفصلة.
الحدود تصف المسؤولية، ولا يشترط أن تفصل بينها شبكة. في الرسم: المستخدم، ثم التطبيق، ثم قاعدة البيانات.

عبّر عن الحدود بوضوح

يمكن لدالة واحدة أن تعبّر عن السؤال الذي تحتاج بقية أجزاء التطبيق إلى طرحه:

type Booking = {
  status: 'confirmed' | 'cancelled';
  cancellationDeadline: Date;
};

function canCancel(booking: Booking, now: Date): boolean {
  return booking.status === 'confirmed'
    && now < booking.cancellationDeadline;
}

تمرير الوقت الحالي إلى الدالة يجعل فحص القاعدة أسهل. هذه الدالة تفحص الشرط فقط؛ أمّا تغيير الحجز فيحتاج أيضًا إلى التعامل مع الطلبات المتزامنة وحفظ البيانات.

افصل عندما يوجد سبب

قد تتحوّل الوحدة البرمجية إلى خدمة تُنشر بشكل مستقلّ عندما تظهر حاجة محدّدة: توسّع مختلف، أو فريق مسؤول مستقلّ، أو قيد تشغيلي.

وإلى أن يحدث ذلك، تبقى الحدود الواضحة داخل تطبيق واحد مفيدة. اكتب ما الذي تملكه الوحدة، وما الذي تعد به بقية النظام.

مقال تجريبي لهذا الدفتر الجديد. استبدله بكتابتك الخاصة قبل إطلاق الموقع.