التحقق والتعيين المعتمدان على الانعكاس
أنشئ أداة تحقق بسيطة أو معين كائنات باستخدام الانعكاس المعتمد على التعليقات التوضيحية.
التحقق والتعيين المعتمدان على الانعكاس درس مجاني في Kotlin Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Kotlin Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
ما المشكلة التي يحلها هذا النمط؟
تقرأ عملية التحقق المستندة إلى الانعكاس التعليقات التوضيحية من خصائص الصنف في وقت التشغيل، ثم تطبق قواعد التحقق تلقائيًا، من دون إجراء فحوص يدوية لكل حقل. وتستخدم محوّلات ORM التقنية نفسها للتحويل بين الكائنات وصفوف قاعدة البيانات.
التعليق التوضيحي Validate
عرّف تعليقًا توضيحيًا يحتفظ به وقت التشغيل ويستهدف الخصائص:
@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.PROPERTY)
annotation class Validate(
val minLength: Int = 0,
val maxLength: Int = Int.MAX_VALUE,
val pattern: String = ""
)إضافة تعليق توضيحي إلى فئة بيانات
طبّق @Validate على خصائص فئة البيانات. وستفحصها أداة التحقق وقت التشغيل:
data class UserForm(
@Validate(minLength = 2, maxLength = 50) val name: String,
@Validate(pattern = "^[\\w.]+@[\\w]+\\.[a-z]{2,}$") val email: String,
@Validate(minLength = 8) val password: String
)دالة التحقق
استخدم KClass.declaredMemberProperties للتكرار على الخصائص، والعثور على التعليقات التوضيحية، وتجميع الأخطاء:
fun validate(obj: Any): List<String> {
val errors = mutableListOf<String>()
for (prop in obj::class.declaredMemberProperties) {
val ann = prop.findAnnotation<Validate>() ?: continue
val value = (prop as KProperty1<Any, *>).get(obj)?.toString() ?: ""
if (value.length < ann.minLength) errors += "${prop.name}: too short"
if (value.length > ann.maxLength) errors += "${prop.name}: too long"
if (ann.pattern.isNotEmpty() && !value.matches(Regex(ann.pattern)))
errors += "${prop.name}: invalid format"
}
return errors
}تشغيل أداة التحقق
استدعِ validate() مع أي كائن يحتوي على تعليقات توضيحية. تُرجع الدالة قائمة برسائل الخطأ؛ وتشير القائمة الفارغة إلى أن الكائن صالح:
val form = UserForm("A", "not-an-email", "short")
val errors = validate(form)
errors.forEach(::println)
// name: too short
// email: invalid format
// password: too shortتحويل الكائن إلى Map باستخدام @Column
يمكن لنمط آخر من أنماط الانعكاس البرمجي تحويل كائن إلى Map باستخدام تعليق توضيحي @Column لتوفير أسماء الأعمدة:
@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.PROPERTY)
annotation class Column(val name: String)
fun toMap(obj: Any): Map<String, Any?> =
obj::class.declaredMemberProperties
.mapNotNull { prop ->
val col = prop.findAnnotation<Column>() ?: return@mapNotNull null
col.name to (prop as KProperty1<Any, *>).get(obj)
}.toMap()استخدام أداة التحويل
أضف تعليقًا توضيحيًا إلى فئة البيانات واستدعِ toMap() للحصول على خريطة مفاتيحها أسماء الأعمدة، وتكون جاهزة لعبارة INSERT:
data class User(
@Column("user_name") val name: String,
@Column("user_email") val email: String
)
val user = User("Alice", "alice@example.com")
println(toMap(user))
// {user_name=Alice, user_email=alice@example.com}تخزين نتائج الانعكاس البرمجي مؤقتًا
عمليات فحص الانعكاس البرمجي مكلفة. خزّن ربط الخصائص بالتعليقات التوضيحية مؤقتًا عند بدء التشغيل باستخدام ConcurrentHashMap الذي تكون مفاتيحه من النوع KClass:
val cache = ConcurrentHashMap<KClass<*>, List<Pair<KProperty1<Any,*>, Column>>>()
fun columnsOf(klass: KClass<*>) = cache.getOrPut(klass) {
klass.declaredMemberProperties
.mapNotNull { p ->
p.findAnnotation<Column>()?.let { (p as KProperty1<Any,*>) to it }
}
}الجمع بين التحقق والتحويل
يمكنكم تكديس التعليقات التوضيحية على خاصية واحدة ومعالجة كل منها بشكل مستقل. أجروا التحقق أولًا ثم التحويل، أو نفّذوا الأمرين في مرور واحد عبر تجميع كل نوع من أنواع التعليقات التوضيحية:
data class Product(
@Validate(minLength = 1) @Column("product_name") val name: String,
@Column("price") val price: Double
)القيود
يتمتع التحقق المستند إلى الانعكاس البرمجي بقدرات قوية، لكنه ينطوي على بعض المفاضلات: فهو يضيف تكلفة أثناء التشغيل، ويعتمد على الاحتفاظ بالتعليقات التوضيحية، ولا يستطيع اكتشاف الأخطاء وقت الترجمة. بالنسبة إلى التحقق الحساس للأداء أو الآمن وقت الترجمة، فكّروا في استخدام التعليمات البرمجية التي ينشئها KSP بدلًا من ذلك.
متى يُستخدم هذا النمط
يبرع التحقق المستند إلى الانعكاس البرمجي في تعليمات الأطر البرمجية التي يجب أن تتعامل مع فئات يعرّفها المستخدمون بشكل عشوائي، مثل ORMs وأدوات التسلسل وأدوات التحقق من النماذج وأدوات ربط الإعدادات. أما تعليمات التطبيق التي تملك أنواعها، فيُفضّل أن تستخدم التحقق الصريح لتحقيق السرعة والوضوح.
تحقق سريع
ما سياسة الاحتفاظ بالتعليق التوضيحي المطلوبة حتى يمكن قراءة تعليق توضيحي للتحقق وقت التشغيل؟
مراجعة: التحقق والتحويل المستندان إلى الانعكاس البرمجي
أهم النقاط:
- تعريف تعليقات توضيحية يحتفظ بها وقت التشغيل وتستهدف الخصائص
- استخدام
declaredMemberPropertiesمعfindAnnotationلتنفيذ التحقق أو التحويل - تخزين النتائج مؤقتًا لكل
KClassلتجنب تكلفة الانعكاس البرمجي المتكررة - تكديس عدة تعليقات توضيحية على خاصية للحصول على سلوك مركب
- التفكير في استخدام KSP كبديل وقت الترجمة في المسارات الحساسة للأداء
الأسئلة الشائعة
هل درس «التحقق والتعيين المعتمدان على الانعكاس» مجاني؟
نعم — نص درس «التحقق والتعيين المعتمدان على الانعكاس» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Kotlin Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
ماذا ستتعلم في «التحقق والتعيين المعتمدان على الانعكاس»؟
أنشئ أداة تحقق بسيطة أو معين كائنات باستخدام الانعكاس المعتمد على التعليقات التوضيحية. تتمرن على Kotlin Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Kotlin Academy؟
لا تُشترط خبرة سابقة. Kotlin Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «التحقق والتعيين المعتمدان على الانعكاس»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Kotlin Academy هذا؟
نعم. كل درس في Kotlin Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- انعكاس Kotlin: KClass وKFunction وKProperty
- إنشاء التعليقات التوضيحية المخصصة وتحديد أهدافها
- قراءة التعليقات التوضيحية وقت التشغيل
- التحقق والتعيين المعتمدان على الانعكاس