نمط البناء في Kotlin: دليل خطوة بخطوة مع الكود

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

لماذا Builder في Kotlin ليس مجرد "نسخ ولصق" من Java؟



إذا كنت قد كتبت بلغة Java من قبل، فبالتأكيد صادفت نمط Builder الكلاسيكي. عشرات الأسطر من الكود، فئات داخلية ثابتة، دوال set ودالة build() النهائية. كل هذا يعمل، لكنه يبدو ضخمًا.



والآن تخيل أنك انتقلت إلى Kotlin. لغة صُممت لتكون موجزة ومعبرة. وهنا تواجه مهمة: إنشاء كائن بالعديد من المعاملات، بعضها اختياري. تمتد يدك لكتابة Builder الكلاسيكي من Java...



توقف! في Kotlin، يمكن تنفيذ هذا النمط بطريقة أبسط بعشر مرات، وأكثر أناقة وأمانًا. في هذه المقالة، سنستعرض 4 طرق لتنفيذ نمط Builder في Kotlin - من الأبسط إلى الأكثر تقدمًا باستخدام نهج DSL.



هذه المادة مبنية على سؤال حقيقي من Stack Overflow حصل على آلاف المشاهدات. قمنا بتكييفه لمحتوى تعليمي لتتمكن من تطبيق المعرفة فورًا.



المشكلة: متى نحتاج Builder؟



تخيل أن لديك كلاس Pizza:



class Pizza(    val size: String,    val cheese: Boolean = false,    val pepperoni: Boolean = false,    val mushrooms: Boolean = false,    val olives: Boolean = false,    val extraCheese: Boolean = false)


يبدو كل شيء جيدًا. ولكن عندما تنشئ بيتزا بـ 5 معاملات اختيارية، يصبح الكود غير قابل للقراءة:



val pizza = Pizza("Large", true, false, true, false, true)


البحث بالعين عن معنى كل معامل - أمر شاق. هنا يأتي نمط Builder للإنقاذ.



الطريقة 1. Builder الكلاسيكي على نمط Java (للتوافق)



إذا كنت بحاجة لدعم كود Java أو تريد واجهة برمجة تطبيقات واضحة للغاية، يمكنك استخدام النهج الكلاسيكي:



class Pizza private constructor(    val size: String,    val cheese: Boolean,    val pepperoni: Boolean,    val mushrooms: Boolean,    val olives: Boolean,    val extraCheese: Boolean) {    class Builder(private val size: String) {        private var cheese: Boolean = false        private var pepperoni: Boolean = false        private var mushrooms: Boolean = false        private var olives: Boolean = false        private var extraCheese: Boolean = false

fun cheese(value: Boolean) = apply { cheese = value } fun pepperoni(value: Boolean) = apply { pepperoni = value } fun mushrooms(value: Boolean) = apply { mushrooms = value } fun olives(value: Boolean) = apply { olives = value } fun extraCheese(value: Boolean) = apply { extraCheese = value }

fun build() = Pizza(size, cheese, pepperoni, mushrooms, olives, extraCheese) }}

// الاستخدام:val pizza = Pizza.Builder("Large") .cheese(true) .pepperoni(true) .mushrooms(true) .build()


الإيجابيات: كود واضح، مفهوم لمطوري Java.
السلبيات: الكثير من الكود التكراري، لا يستخدم إمكانيات Kotlin.



الطريقة 2. أسلوب Kotlin مع الوسائط المسماة والقيم الافتراضية



أبسط طريقة وغالبًا الأفضل هي عدم استخدام Builder مطلقًا، والاعتماد على إمكانيات اللغة نفسها:



data class Pizza(    val size: String,    val cheese: Boolean = false,    val pepperoni: Boolean = false,    val mushrooms: Boolean = false,    val olives: Boolean = false,    val extraCheese: Boolean = false)

// الاستخدام:val pizza = Pizza( size = "Large", cheese = true, pepperoni = true, mushrooms = true)


هذا كود نظيف، قابل للقراءة، وآمن من حيث النوع. الوسائط المسماة في Kotlin تحل مشكلة "الأرقام السحرية" وترتيب المعاملات.



المدونات

توصيات الكتب