محتويات الدورة
Kotlin
أسس اللغة والحالة الصريحة
السلوك القابل للاستخدام والحدود المنمطة
التزامن والتكامل والتصميم المترابط

Kotlin / التزامن والتكامل والتصميم المترابط / الدرس 18

بناء مسار حجز متحقق ومراجعة حدوده

اجمع التحليل ونماذج القيم والنتائج المغلقة وتحويل المجموعات وحدود التنفيذ الصريحة في تصميم محلي صغير.

وقت القراءة التقريبي: 5 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • تتبّع المدخل غير الصالح والبيانات الناجحة عبر مراحل منمطة متميزة.
  • ميّز عرض سياسة محلية مستقلة عن حجز دائم يواجه طلبات متزامنة.

اجعل وعد المشروع الختامي صغيرا عمدا

يستقبل المشروع طلبات مقاعد نصية ثابتة وينتج تسميات لأعداد موجبة صالحة أو لمدخل غير صالح. لا يتصل بخدمة ورش، ولا يخصص سعة فعلية، ولا يخزن حجوزات، ولا يرسل إشعارات. يسمح هذا الوعد الصغير بفحص قرارات الأنواع والتحكم في التدفق دون إخفاء موثوقية غير منفذة خلف أسماء واقعية. يحتاج تطبيق الحجز الحقيقي إلى ملكية موارد مرتبطة بهوية موثقة، وتخصيص ذري، وهوية طلب، وتخزين دائم، واستعادة، وتكامل خارجي. أبق المسؤوليات الناقصة ظاهرة، حتى لا تُفهم نتيجة حساب محلي ناجحة على أنها مسار إنتاج كامل.

استخدم نتائج تحفظ سبب الرفض

يميّز المحلل أدناه النص الصحيح المشوه من قيمة حُللت إلى عدد غير موجب. يمنح الناتج المغلق المدخل الصحيح عددا مطلوبا، والمدخل غير الصحيح سببا مطلوبا. هذه رموز تعليمية اصطناعية ثابتة؛ وتحتاج API عامة عقد نقل منفصلا مصمما لها. يزيل المصنف المسافات المحيطة عمدا، وتوثّق مدخلات الاختبار هذه السياسة. لا تطبّع المعرفات أو النصوص ذات المعنى الثقافي بلا تمييز لمجرد أن trim مريحة للمدخل العددي. التسميات المتوقعة مستنتجة من السياسة المحلية، وليست مشاهدات من تشغيل المترجم.

kotlin مسار تحليل محلي كامل بنتائج منمطة
sealed interface SeatInput
data class ValidSeats(val count: Int) : SeatInput
data class InvalidSeats(val reason: String) : SeatInput
fun parseSeats(text: String): SeatInput {
    val count = text.trim().toIntOrNull()
        ?: return InvalidSeats("not-an-int")
    return if (count > 0) ValidSeats(count) else InvalidSeats("not-positive")
}
fun label(input: SeatInput): String = when (input) {
    is ValidSeats -> "valid:${input.count}"
    is InvalidSeats -> "invalid:${input.reason}"
}
fun main() {
    listOf(" 2 ", "bad", "0").map(::parseSeats).map(::label).forEach(::println)
}
الناتج المتوقع
valid:2
invalid:not-an-int
invalid:not-positive

الأسطر المتوقعة هي valid:2 ثم invalid:not-an-int ثم invalid:not-positive. يحتاج المصدر أدوات Kotlin متوافقة تدعم الواجهات المغلقة، ولم يُترجم.

افصل السياسة الصرفة عن الآثار ودورة الحياة

تستخدم parseSeats وlabel معاملاتهما وقيم الرد فقط، فيستقل سلوكهما عن الساعة الحقيقية والشبكة والمفرد القابل للتعديل. تملك main المدخل الثابت وأثر العرض. إذا نفذت المرحلة التالية حجوزات فعلية، فأدخل حد تطبيق صريحا، بدلا من وضع استدعاء قاعدة أو إطلاق كوروتينات داخل المحلل. يتيح suspend استدعاء عمل معلق، لكنه لا يحدد مالكا أو موزعا أو معاملة. يجب أن يحفظ التصميم عقد التحليل البسيط، ويضيف المسؤوليات التشغيلية المنفصلة في مواضع يمكن اختبارها والإبلاغ عنها بصدق.

اجمع بعد تحديد مسار واضح للبيانات غير الصالحة

يستخدم المثال الثاني mapNotNull للاحتفاظ بالأعداد الصحيحة الموجبة الصالحة فقط، ويعرض مجموع المقبول. هذه سياسة منتج مختلفة عن حفظ أسباب الرفض: إذ تتجاوز العناصر غير الصالحة عمدا. قد يناسب ذلك ملخص معاينة، لكنه يضلل في مسار يجب أن يفسر كل حجز مرفوض. اذكر عدد العناصر المتجاوزة أو احفظ سجلات النتائج عندما يهم الاكتمال. يستخدم المثال قيما صغيرة تقع ضمن Int، ولا يدعي الحماية من التجاوز العددي لمدخلات كبيرة اعتباطية.

kotlin سياسة صريحة للتجاوز والتلخيص
fun positiveCount(text: String): Int? =
    text.toIntOrNull()?.takeIf { it > 0 }
fun main() {
    val source = listOf("2", "bad", "0", "3")
    val accepted = source.mapNotNull(::positiveCount)
    println("accepted=${accepted.size}")
    println("skipped=${source.size - accepted.size}")
    println("seat_total=${accepted.sum()}")
}
الناتج المتوقع
accepted=2
skipped=2
seat_total=5

المخرجات المتوقعة accepted=2 ثم skipped=2 ثم seat_total=5. يصبح تجاوز المدخلات غير الصالحة ظاهرا في العدد. هذا مصدر كامل توضيحي، ولم يُنفّذ.

راجع الصحة والأدلة قبل إضافة الميزات

افحص الصياغة المشوهة وتجاوز مجال العدد الصحيح والصفر والسالب وسياسة المسافات والقيم العادية. راجع فصل رموز الأخطاء عن نصوص العرض ومعالجة كل نتيجة يسمح بها النوع. وافحص المراجع السطحية إذا أدخلت سجلات أغنى قابلة للتعديل. عند إضافة الكوروتينات، تحقق من الإلغاء وملكية النطاق وحماية الحالة بالأدوات المعدة فعليا. تفحص مراجعات التأليف في الدورة البنية والتطابق التقني بين اللغتين فقط؛ ولم تُنفّذ برامج Kotlin أو سلوك الكوروتينات. يذكر التقرير الصادق هذه الحدود والفحوص المعزولة التالية، بدلا من اختراع نجاح اختبار أو جاهزية نشر.

الأخطاء الشائعة وإصلاحها

يُعرض تجاوز الطلبات غير الصالحة كأنها عولجت كلها بنجاح.

لماذا يحدث؟
محَت سياسة الترشيح أدلة الرفض التي يحتاجها المسار.
كيف تصلحه؟
احتفظ بنتيجة لكل مدخل، أو اذكر المتجاوز وفقا لعقد المنتج.
كيف تتجنب تكراره؟
حدّد معنى الاكتمال قبل اختيار mapNotNull.

يبدأ المحلل حجوزات خلفية لا يملك أحد عمرها.

لماذا يحدث؟
اختلط تفسير المدخل الصرف بآثار تشغيلية جانبية.
كيف تصلحه؟
انقل الآثار إلى نطاق تطبيق وعقد ذوي ملكية صريحة.
كيف تتجنب تكراره؟
أبق التحليل مستقلا يمكن فحصه ببيانات ثابتة.

يُعرض المخرج المحلي كدليل على حجز إنتاجي صحيح.

لماذا يحدث؟
أُهملت المسؤوليات التي لا يتضمنها العرض.
كيف تصلحه؟
اذكر نطاق المثال المحلي، واطلب أدلة منفصلة على الدوام والتزامن.
كيف تتجنب تكراره؟
لا تذكر سوى الاختبارات المنفذة فعليا في البيئة المعلنة.

اختبر فهمك

1. لماذا لا تكون mapNotNull بديلا مباشرا مكافئا للمحلل المغلق؟

اعرض الحل المشروح

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

2. اذكر ثلاثة فحوص تالية قبل تكييف المشروع الختامي لخدمة حقيقية.

اعرض الحل المشروح

ترجم المصدر بأدوات المشروع المعلنة المتوافقة وافحص حالات الحدود؛ واختبر معاملة التخصيص المرجعية الفعلية تحت تزامن مضبوط؛ وتحقق من هوية الطلب والتفويض وسلوك الإلغاء والاستعادة عند الحدود الخاصة بكل منها. قد تحتاج المجموعة الأخيرة عدة اختبارات. لا يمكن استنتاج أي من هذه الضمانات من طباعة valid:2 في مثال محلي.

أهم ما تعلمته

  • توضح المراحل المنمطة المعنى عندما يحتفظ كل حد بمسؤوليته.
  • يفصل التقرير النهائي المفيد الأمثلة المحللة والفحوص المنفذة والأدلة التشغيلية الناقصة.

المراجع الرسمية