كتاب "كوتلين. البرمجة للمحترفين "

صورة مرحبا ، habrozhiteli! يستند كتاب Josh Skin و David Greenhall إلى دورة Kotlin Essentials الشهيرة من Big Nerd Ranch. أمثلة حية ومفيدة ، وشروحات واضحة للمفاهيم الأساسية وواجهات برمجة التطبيقات الأساسية ، لا تقدم لغة Kotlin فحسب ، بل تعلم أيضًا كيفية استخدام قدراتها بفعالية ، وتتيح لك أيضًا إتقان بيئة تطوير JetBrains IntelliJ IDEA.

لا يهم إذا كنت مطورًا ذو خبرة يريد تجاوز Java أو يتعلم لغة البرمجة الأولى. سوف يرشدك Josh و David من المبادئ الأساسية إلى الاستخدام المطول لـ Kotlin حتى تتمكن من إنشاء تطبيقات موثوقة وفعالة.


من هو هذا الكتاب ل؟


نحن (المؤلفون) كتبنا هذا الكتاب للمطورين ذوي الكفاءات المختلفة: مطورو Android ذوي الخبرة الذين يفتقرون إلى ميزات Java ، ومطوري كود الخادم المهتمين بميزات Kotlin ، وكذلك للمبتدئين الذين يقررون تعلم لغة مترجمة فعالة.

قد يثير اهتمامك هذا الكتاب بدعم Android ، ولكنه لا يقتصر على البرمجة على Kotlin لنظام Android. علاوة على ذلك ، في هذا الكتاب ، يناقش فصل واحد فقط - الفصل 21 - تقنيات البرمجة Kotlin لنظام Android. ومع ذلك ، إذا كنت مهتمًا بموضوع استخدام Kotlin لتطوير تطبيقات Android ، فسيقدم لك هذا الكتاب التقنيات الأساسية التي من شأنها تبسيط عملية كتابة تطبيقات Android على Kotlin.

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

كيفية استخدام هذا الكتاب


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

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

نريد أن نضيف أنه لا يجب عليك التعجيل : تطوير واستخدام وثائق Kotlin على الرابط: kotlinlang.org/docs/reference ، حيث توجد إجابات للعديد من الأسئلة التي تنشأ أثناء التجارب.

مقتطفات. توسع


تتيح لك الإضافات إضافة وظائف إلى نوع دون تغيير إعلان النوع بشكل صريح. استخدم الملحقات ذات الأنواع المخصصة ، وكذلك الأنواع التي لا يمكنك التحكم بها ، مثل List و String وأنواع أخرى من مكتبة Kotlin القياسية.
الامتدادات هي بديل للميراث. إنها مناسبة تمامًا لإضافة وظيفة إلى نوع ما إذا كان تعريف الفئة غير متاح لك أو لم يكن للفصل معدل مفتوح يسمح لك بإنشاء فئات فرعية.

غالبًا ما تستخدم مكتبة Kotlin القياسية ملحقات. على سبيل المثال ، الوظائف القياسية التي تعلمتها في الفصل 9 هي امتدادات معلنة ، وفي هذا الفصل سترى بعض الأمثلة على إعلانها.

في هذا الفصل ، سنعمل أولاً على مشروع Sandbox ، ثم نطبق هذه المعرفة لتحسين كود NyetHack. بادئ ذي بدء ، افتح مشروع Sandbox وقم بإنشاء ملف جديد يسمى Extensions.kt.

إعلان وظيفة التمديد


التمديد الأول يسمح لك بإضافة أي درجة من الحماس إلى String. أعلن ذلك في Extensions.kt.

القائمة 18.1. إضافة ملحق لنوع String (Extensions.kt)

fun String.addEnthusiasm(amount: Int = 1) = this + "!".repeat(amount) 

يتم الإعلان عن وظائف الامتداد بالطريقة نفسها التي يتم بها الإعلان عن الوظائف الأخرى ، ولكن مع وجود اختلاف واحد: عند تحديد دالة الامتداد ، يمكنك أيضًا تحديد نوع يعرف بنوع الاستلام الذي يضيف إليه الملحق ميزات. (أذكر الفصل 9 ، حيث أطلقنا على الأنواع القابلة للامتداد "مستقبلات".) لوظيفة addEnthusiasm ، يتم تحديد سلسلة قبول.

نص الدالة addEnthusiasm هو عبارة عن تعبير واحد فقط يقوم بإرجاع سلسلة: محتويات هذا و 1 أو أكثر من علامات التعجب ، اعتمادًا على قيمة وسيطة الكمية (1 هي القيمة الافتراضية). تشير هذه الكلمة الأساسية إلى مثيل كائن الوجهة الذي يسمى الامتداد (في هذه الحالة ، مثيل السلسلة).
الآن يمكنك استدعاء وظيفة addEnthusiasm لأي مثيل من سلسلة. جرِّب وظيفة ملحق جديدة بإعلان سطر في الوظيفة الرئيسية واستدعاء وظيفة ملحق addEnthusiasm لعرض النتيجة.

القائمة 18.2. استدعاء ملحق جديد لمثيل كائن مستقبل السلسلة (Extensions.kt)

 fun String.addEnthusiasm(amount: Int = 1) = this + "!".repeat(amount) fun main(args: Array<String>) { println("Madrigal has left the building".addEnthusiasm()) } 

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

هل من الممكن إضافة فئة فرعية إلى هذه السلسلة إلى مثيلات السلسلة؟ في IntelliJ ، انظر إلى الكود المصدر لإعلان String بالضغط على مفتاح Shift مرتين لفتح مربع الحوار Search Everywhere وأدخل "String.kt" في مربع البحث. سترى إعلان الفصل هذا:

 public class String : Comparable<String>, CharSequence { ... } 

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

إعلان تمديد Superclass


لا تعتمد الامتدادات على الميراث ، ولكن يمكن دمجها مع الميراث لزيادة النطاق. جرِّب ذلك في Extensions.kt: قم بتعريف امتداد لنوع أي باسم easyPrint. منذ الإعلان عن الامتداد لـ Any ، سيكون متاحًا لجميع الأنواع. بشكل رئيسي ، استبدل استدعاء دالة println بدعوة ملحق easyPrint إلى String.

ادراج 18.3. أي امتداد (Extensions.kt)

 fun String.addEnthusiasm(amount: Int = 1) = this + "!".repeat(amount) fun Any.easyPrint() = println(this) fun main(args: Array<String>) { println("Madrigal has left the building".addEnthusiasm()).easyPrint() } 

تشغيل Extensions.kt وتأكد من أن الإخراج لم يتغير.

نظرًا لأنك أضفت ملحق "أي نوع" ، فهو متاح أيضًا للأنواع الفرعية. إضافة مكالمة ملحق لـ Int.

ادراج 18.4. easyPrint متاح لجميع الأنواع الفرعية (Extensions.kt)

 fun String.addEnthusiasm(amount: Int = 1) = this + "!".repeat(amount) fun Any.easyPrint() = println(this) fun main(args: Array<String>) { "Madrigal has left the building".addEnthusiasm().easyPrint() 42.easyPrint() } 

وظائف تمديد عام


ولكن ماذا لو كنت تريد طباعة السطر "Madrigal قد غادر المبنى" قبل وبعد addEnthusiasm؟

للقيام بذلك ، أضف القدرة على الاتصال في السلسلة إلى وظيفة easyPrint. لقد رأيت بالفعل سلاسل لاستدعاءات الوظائف: يمكن أن تشارك الوظائف في سلسلة إذا أعادت كائن استقبال أو كائن آخر يمكن استدعاء وظائف لاحقة له.
ترقية easyPrint للاتصال بالسلاسل.

ادراج 18.5. تغيير easyPrint إلى استدعاء تسلسل (Extensions.kt)

 fun String.addEnthusiasm(amount: Int = 1) = this + "!".repeat(amount) fun Any.easyPrint()= println(this): Any { println(this) return this } ... 

الآن حاول استدعاء وظيفة easyPrint مرتين: قبل وبعد addEnthusiasm.

ادراج 18.6. استدعاء easyPrint مرتين (Extensions.kt)

 fun String.addEnthusiasm(amount: Int = 1) = this + "!".repeat(amount) fun Any.easyPrint(): Any { println(this) return this } fun main(args: Array<String>) { "Madrigal has left the building".easyPrint().addEnthusiasm().easyPrint() 42.easyPrint() } 

لم رمز لا ترجمة. تم السماح باستدعاء easyPrint الأول ، ولكن لم يقم addEnthusiasm بذلك. انظر إلى معلومات النوع لفهم سبب حدوث ذلك: انقر فوق easyPrint واضغط على Control-Shift-P (Ctrl-P) ومن قائمة الملحقات التي تظهر ، حدد الأول: ("Madrigal ترك المبنى .easyPrint ()") (الشكل 18.1).

ترجع الدالة easyPrint السلسلة التي تم استدعاؤها لها ، ولكنها تستخدم النوع "Any" لتمثيلها. addEnthusiasm متاح فقط لـ String ، لذلك لا يمكن استدعاؤه بالقيمة التي يتم إرجاعها بواسطة easyPrint.

صورة

لحل هذه المشكلة ، يمكنك إنشاء ملحق معمم. قم بتحديث وظيفة امتداد easyPrint واستخدم النوع العام كمستقبل بدلاً من أي.

ادراج 18.7. تعميم easyPrint (Extensions.kt)

 fun String.addEnthusiasm(amount: Int = 1) = this + "!".repeat(amount) fun <T> AnyT.easyPrint(): AnyT { println(this) return this } ... 

الآن ، عندما يستخدم الامتداد معلمة النوع المعمم T باعتباره المستقبِل ويعيد T بدلاً من Any ، تنتقل المعلومات المتعلقة بالنوع المحدد لكائن المستقبل إلى السلسلة (الشكل 18.2).

صورة

حاول تشغيل Extensions.kt مرة أخرى. هذه المرة سيتم إخراج الخط مرتين:

 Madrigal has left the building Madrigal has left the building! 42 

تعمل وظيفة الامتداد المعمم الجديدة الخاصة بك مع أي نوع ، وتعالج أيضًا معلومات عنها. تتيح لك الإضافات التي تستخدم أنواعًا عامة كتابة وظائف يمكنها العمل مع مجموعة واسعة من الأنواع في البرنامج.

ملحقات الأنواع العامة متوفرة أيضًا في مكتبة Kotlin القياسية. على سبيل المثال ، انظر إلى إعلان الدالة let:

 public inline fun <T, R> T.let(block: (T) -> R): R { return block(this) } 

يتم إعلان let كدالة امتداد عامة ، مما يسمح لها بالعمل مع جميع الأنواع. يستغرق لامدا يأخذ كائن المتلقي كوسيطة (T) وإرجاع قيمة بعض نوع جديد R.

انتبه إلى الكلمة الأساسية المضمّنة ، التي علمنا بها في الفصل 5. تنطبق نفس النصيحة التي قدمناها سابقًا هنا: إعلان أن وظيفة الإضافة مدمجة ، إذا قبلت lambda ، فستقلل من تكاليف الذاكرة.

»يمكن الاطلاع على مزيد من المعلومات حول الكتاب على موقع الناشر
» المحتويات
» مقتطفات

خصم 25 ٪ على كوبون Khabrozhitel - Kotlin
عند دفع النسخة الورقية من الكتاب ، يتم إرسال كتاب إلكتروني عبر البريد الإلكتروني.

Source: https://habr.com/ru/post/ar464177/


All Articles