Spring Boot / الأساسي: التركيب وعقود HTTP / الدرس 6
خدمات التطبيق وحدود المجال
أظهر حالة الاستخدام بين النقل وقرار المجال والتعديل والرد، ولا تعتبر وسم الخدمة عملية عمل ذرية تلقائياً.
في هذه الصفحة
أهداف الدرس
- فصل القرار من الانتقال المخزن.
- تحديد المدخل والخرج والرفض للخدمة.
- اختبار المجال دون ادعاء دليل إطار أو قاعدة.
سمّ عملية العمل وحدودها
تنسق خدمة التطبيق حالة استخدام: نطاقاً موثوقاً وأمراً متحققاً وقراراً وحد حفظ ونتيجة. تتيح @Service الاكتشاف ولا تضيف التفويض أوالإعادة أوالمعاملة وحدها. حدد المالك كيلا تتجاوز جدولة أو عملية استيراد القاعدة بمجرد تخطي المتحكم.
أظهر القيم والنتائج؛ فيحتاج السعر عملة ووحدة والحجز منتجاً وكمية وهوية. قد تخفي Map خام أو رقم سالب حالات النجاح والرفض وفشل البنية. اختر عقداً مستقراً وحوله إلى HTTP مستقلاً، ولا تنشر حالات النقل في كل حساب مجال.
اجعل النتيجة المبدئية واضحة
يفحص الجزء أهلية المخزون من لقطة مقدمة ويعيد باقياً مقترحاً دون حجز أوحفظ. يرفض الكمية السالبة كمخالفة، ويجعل النقص نتيجة قرار معلنة. يحتاج السياق المُدار فيبقى غير منفذ، ولا تحول @Service اللقطة إلى قيمة راهنة محجوزة.
لا يعلن المستدعي «حُجز» لأن السياسة وافقت؛ فقد يغير طلب آخر المخزون قبل الكتابة. احم الانتقال بعملية قاعدة مشروطة وعقد معاملة كامل. يساعد فصل القرار على الفهم، لكن تثبيت الحالة المشتركة يظل موضع الصحة المتزامنة.
package training.catalog;
import org.springframework.stereotype.Service;
record StockDecision(String code, int proposedRemaining) {}
@Service
class StockPolicy {
StockDecision evaluate(int available, int requested) {
if (available < 0) throw new IllegalStateException("invalid stock snapshot");
if (requested <= 0) throw new IllegalArgumentException("quantity");
return available >= requested
? new StockDecision("eligible", available - requested)
: new StockDecision("insufficient", available);
}
}
النتيجة قرار على لقطة فقط، ولا يثبت الجزء اكتشاف الكائن أو انتقال الحفظ.
اختبر الحساب وحد ادعائه
يفحص نموذج JDK لقطة خمس وحدات وطلب اثنتين؛ فينتج eligible وباقياً مقترحاً ثلاثة، وتبقى اللقطة خمسة. هذا دليل حساب محلي فعلي ولا مخزون مشترك تغير. لا يفحص المسح أوالنصيحة أوالمستودع أو HTTP.
اختبر الصفر والسالب والمساوي والنقص واللقطة التالفة. وافحص ثبات الحالة بعد الرفض عند حد التعديل الفعلي أيضاً؛ فلا يثبت رمي خطأ التراجع من اختبار مجال. وضح نطاق الدليل واجمعه باختبار استمرارية وإطار عندما تدخل تلك الحدود.
public class Main {
record Decision(String code,int proposedRemaining) {}
static Decision decide(int available,int requested) {
if(available<0) throw new IllegalStateException("snapshot");
if(requested<=0) throw new IllegalArgumentException("quantity");
return available>=requested?new Decision("eligible",available-requested):new Decision("insufficient",available);
}
public static void main(String[] args) throws Exception {
int available=5;
Decision answer=decide(available,2);
System.out.println(answer.code()+" "+answer.proposedRemaining());
System.out.println("snapshot "+available);
}
}
eligible 3
snapshot 5
الباقي المقترح 3 وتبقى اللقطة 5؛ وليس ذلك حجزاً مخزناً.
ميّز رفض المجال من فشل البنية
تختلف سياسة منتج غائب ومخزون ناقص وحساب ممنوع ومستودع متعطل. لا تعِد صفراً أوفراغاً لكل استثناء. احفظ السبب في سجل مقيد وأظهر نتيجة عامة ثابتة؛ ويحدد مالك المعاملة التراجع والإعادة الآمنة للعمل كله.
صف المتعاون بقدرة ويتولى المحول القاعدة أوالساعة أوالنقل. يفيد البديل الذاكري للحتمية ولا يعيد بالضرورة دلالة الاستعلام والتزامن. وضح هل يعيد لقطة أوبيانات متغيرة مملوكة أوكياناً حياً، ولا تسرّب حالة الاستمرارية المُدارة للنقل عرضاً.
راجع المسار الكامل قبل إضافة الوسوم
اكتب التسلسل وحدد مواضع الفشل. إذا تغير المخزون وفشل حفظ الطلب فلا تترك جزئية بلا تفسير. تعالج المعاملة عمل القاعدة المرتبط، وتحتاج الإشعارات تنسيقاً آخر؛ ولا تستدعي Java رسالة سُلّمت أوتثبت أن فعلاً بعيداً لم يقع.
اختبر المقبول وكل رفض والفشل بين الآثار وهوية الإعادة والتنظيف. ستضيف المستويات الاستمرارية والوكلاء والأمان والدليل حول العقد. تأتي الصيانة من معرفة وعد الطبقة والاختبار الذي يراه، لا نشر Transactional و Async أملاً أن تستنتجا معنى العمل.
الأخطاء الشائعة وإصلاحها
عُد قرار الأهلية حجزاً مكتملاً.
- لماذا يحدث؟
- اختلط الحساب بالتغيير المثبت.
- كيف تصلحه؟
- احم وافحص حد التعديل الفعلي.
- كيف تتجنب تكراره؟
- سمّ القرار والإكمال منفصلين.
صار تعطل المصدر سعراً صفرياً.
- لماذا يحدث؟
- حُول الفشل إلى قيمة معقولة.
- كيف تصلحه؟
- احفظه وحوله عند حد التطبيق.
- كيف تتجنب تكراره؟
- اختبر الغياب والصفر والفشل منفصلة.
قُدم اختبار وحدة كبرهان تراجع.
- لماذا يحدث؟
- اختُبر المنطق فقط.
- كيف تصلحه؟
- أضف تكاملاً معزولاً للمعاملة عند السماح.
- كيف تتجنب تكراره؟
- حدد الحد المرصود لكل اختبار.
اختبر فهمك
1. هل أخطأت السياسة إذا وافقت لطلبين 4 من لقطة 5؟
اعرض الحل المشروح
قد يكون الحسابان صحيحين للقطة نفسها. الناقص انتقال ذري للحالة المشتركة؛ احم تحديث القاعدة ونسق العملية ولا تعد القرار حجزاً.
2. ما غموض تغيير المخزون ثم إرسال رسالة قبل حفظ الطلب؟
اعرض الحل المشروح
لا تتراجع الرسالة مع فشل القاعدة. حدد وحدتها الذرية ونسق الخارج بصندوق صادر مثلاً واختبر الفشل دون إرسال فعلي.
أهم ما تعلمته
- لا يحدد وسم الخدمة حالة استخدام كاملة.
- للقرار والتثبيت دليلان مختلفان.
- تجعل الملكية والنتيجة ميزات الإطار أوضح.