أنماط reified العملية: التحليل وDI والتسلسل
طبّق الأنواع العامة reified لتحليل JSON وحل الاعتماديات ومساعدات الانعكاس.
أنماط reified العملية: التحليل وDI والتسلسل درس مجاني في Kotlin Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Kotlin Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
حالات الاستخدام الثلاث الرئيسية
تتألق معاملات النوع reified في ثلاثة أنماط متكررة في Kotlin: تحليل JSON والبيانات، وحقن الاعتماديات، ودوال المساعدة للتسلسل. ويلغي كل نمط منها الحاجة إلى تمرير وسيطات ::class.java النمطية.
النمط 1 — تحليل JSON الآمن النوع
غلّف Gson أو Jackson داخل دالة امتداد تستخدم reified، حتى لا يضطر المستدعون إلى تمرير Class صراحةً:
inline fun <reified T> String.parseJson(): T =
Gson().fromJson(this, T::class.java)
val user: User = jsonString.parseJson()تحليل المجموعات
يتطلب تحليل قائمة عامة استخدام TypeToken. وباستخدام reified يمكنك إخفاء هذا التعقيد:
inline fun <reified T> String.parseList(): List<T> {
val type = object : TypeToken<List<T>>() {}.type
return Gson().fromJson(this, type)
}
val users: List<User> = jsonString.parseList()نهج kotlinx.serialization
يستخدم kotlinx.serialization بالفعل reified داخليًا. وتعتمد الدالة ذات المستوى الأعلى decodeFromString على serializer، وهي دالة reified inline.
val user = Json.decodeFromString<User>(jsonString)
// equivalent to: Json.decodeFromString(serializer<User>(), jsonString)النمط 2 — Service Locator / DI
يمكن لـ Service Locator بسيط حلّ الاعتماديات حسب النوع، من دون مطالبة المستدعين بتمرير KClass:
object ServiceLocator {
val registry = mutableMapOf<KClass<*>, Any>()
inline fun <reified T : Any> get(): T =
registry[T::class] as? T ?: error("No binding for ${T::class}")
inline fun <reified T : Any> bind(instance: T) {
registry[T::class] = instance
}
}استرجاع ViewModel في Android
أكثر أنماط reified شيوعًا في Android:
inline fun <reified VM : ViewModel> ComponentActivity.viewModel(): VM =
ViewModelProvider(this)[VM::class.java]
// Usage
val vm: MyViewModel by lazy { viewModel() }النمط 3 — دالة مساعدة للتحويل الآمن
تكون دالة مساعدة للتحويل باستخدام reified مع قيمة احتياطية أوضح وأنظف من استخدام as? صراحةً في كل مكان:
inline fun <reified T> Any?.safeCast(): T? = this as? T
val name: String? = someAny.safeCast<String>()التحقّق من أنواع المجموعات
تُعد filterIsInstance القياسية مرشح المجموعات المعتمد الذي يستخدم reified. ويمكنك بناء صيغ ذات مستوى أعلى اعتمادًا عليها:
inline fun <reified T> List<Any>.onlyInstancesOf(block: (T) -> Unit) =
filterIsInstance<T>().forEach(block)
items.onlyInstancesOf<Button> { it.setEnabled(true) }تسجيل مستمعي الأحداث حسب النوع
يصبح ناقل الأحداث الذي يوزّع الأحداث حسب النوع سهل الاستخدام مع reified:
class EventBus {
val handlers = mutableMapOf<KClass<*>, (Any) -> Unit>()
inline fun <reified E : Any> on(noinline handler: (E) -> Unit) {
handlers[E::class] = { handler(it as E) }
}
fun post(event: Any) = handlers[event::class]?.invoke(event)
}الجمع بين reified ودوال الامتداد
تمنح دوال الامتداد التي تستخدم reified على مستقبلات عامة واجهات البرمجة طابعًا انسيابيًا، مع الحفاظ على أمان النوع:
inline fun <reified T : Any> SharedPreferences.get(key: String, default: T): T = when (T::class) {
Int::class -> getInt(key, default as Int) as T
String::class -> getString(key, default as String) as T
Boolean::class -> getBoolean(key, default as Boolean) as T
else -> error("Unsupported type ${T::class}")
}قيود يجب تذكّرها
تذكّر أن reified يعمل فقط في دوال inline. ولا يمكن للأصناف والواجهات امتلاك معاملات نوع reified. إذا احتجت إلى معلومات النوع وقت التشغيل داخل صنف، فخزّن خاصية من النوع KClass بدلًا من ذلك.
اختبار دوال reified المساعدة
من السهل اختبار دوال reified — استدعها باستخدام معاملات نوع ملموسة في اختبارات الوحدة، ثم تحقّق من نوع الناتج وقيمته. ولا حاجة إلى محاكاة مراجع الأصناف.
val result: List<String> = """["a","b","c"]""".parseList<String>()
assertEquals(listOf("a","b","c"), result)اختبار سريع
أي عبارة عن دوال reified صحيحة؟
مراجعة: أنماط reified العملية
الأنماط الأساسية:
- تحليل JSON: إخفاء وسيطات Class/TypeToken
- DI/Service Locator: الحل حسب النوع من دون معاملات KClass
- التحويل الآمن وتصفية المجموعات
- توزيع ناقل الأحداث حسب نوع الحدث
- SharedPreferences / مخازن المفتاح والقيمة ذات الأنواع
الأسئلة الشائعة
هل درس «أنماط reified العملية: التحليل وDI والتسلسل» مجاني؟
نعم — نص درس «أنماط reified العملية: التحليل وDI والتسلسل» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Kotlin Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
ماذا ستتعلم في «أنماط reified العملية: التحليل وDI والتسلسل»؟
طبّق الأنواع العامة reified لتحليل JSON وحل الاعتماديات ومساعدات الانعكاس. تتمرن على Kotlin Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Kotlin Academy؟
لا تُشترط خبرة سابقة. Kotlin Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «أنماط reified العملية: التحليل وDI والتسلسل»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Kotlin Academy هذا؟
نعم. كل درس في Kotlin Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- دوال inline: إزالة الحمل الزائد لـ Lambda
- معدّلا noinline وcrossinline
- معاملات النوع reified: الوصول إلى T وقت التشغيل
- أنماط reified العملية: التحليل وDI والتسلسل