توسعه دهنده اپلیکیشنهای اندرویدی ازکدام کتابخانههای کاتلین باید استفاده کند؟ کدام کتابخانههای کاتلین بهتر، مفیدتر وکاربردیترند؟
این دو سوال بهظاهر ساده، ممکن است دغدغهی هر توسعهدهندهی اپهای اندرویدی باشد. توسعهدهنده ممکن نیست که بتواند از همهی کتابخانهها استفاده کند. پس مجبور است براساس نیازهایی که در برنامهنویسی دارد، ازمیان کتابخانهها انتخاب کند. دربارهی این موضوع در انجمنها و وبلاگهای تخصصی توسعهدهندگان اندروید بحث فراوان است.
فهرستهای مختلفی، باعناوین متفاوتی مانند مفیدترین کتابخانههای کاتلین یا کتابخانههای کاتلین که هر توسعهدهندهای باید بداند، نیز در آن انجمنهای تخصصی پیشنهاد شده است. در این مطلب، من نیز تلاش کردم تا کاربردیترین کتابخانه های کاتلین را به شما معرفی کنم. قبلاز معرفی کتابخانهها، توضیح میدهم که معیار انتخاب کتابخانههای کاتلین برای معرفی در این مطلب چه بوده است.
آنچه در این نوشته خواهیم داشت
کتابخانه های کاتلین برای توسعهی اندروید
کاتلین را JetBrains (شرکت توسعه نرمافزاری لهستانی) ساخته است. اگر کسی بخواهد کاتلین را بشناسد، علاوهبر وبسایت رسمی کاتلین باید بلاگ کاتلین در JetBrains را نیز مطالعه کند. بنابراین، میشود ادعا کرد که برای کاتلین دو سایت مرجع وجود دارد. در هر دوی این سایتها دربارهی کتابخانههای کاتلین صحبت شده و کتابخانههایی نیز معرفی شده است. مبنای من برای انتخاب کتابخانههایی که درادامه میآیند، دردرجه ی اول این دو سایت مرجع بوده است.
اگر به بخش Documentation سایت کاتلین مراجعه کنید، در منوی سمت راست صفحه این عنوان را پیدا میکنید: Official libraries. زیر این عنوان ۳ کتابخانه معرفی شده است: Kotlinx.coroutines, Kotlinx.serialization & Ktor. البته، Ktor فریمورک کاتلین است (پس از موضوع بحث ما خارج میشود). در بلاگ JetBrains، علاوهبر آن کتابخانههای رسمی ۳ کتابخانهی دیگر نیز معرفی شده است: Multik, Viktor & Kotlinx.datetime. یک کتابخانهی جالب دیگر (MockK) هم برای کاتلین ساخته شده است که توسعهدهندگان اندرویدی از آن استفاده میکنند. دربارهی آن هم توضیحاتی میدهم.
با کتابخانههای رسمی شروع میکنم.
اگر علاقهمند هستید تا بیشتر دربارهی تفاوتهای کاتلین و جاوا بدانید، مقالهی «مقایسه کاتلین و جاوا (بررسی ۸ تفاوت اصلی)» را بخوانید.
۱. Kotlinx.coroutines
اساسا اجرای موازی چند کار بیآنکه خللی به جریان اصلی (نخ اصلی) اجرای کدها وارد کند، از چالشهای برنامهنویسی است. بههمیندلیل، در برنامهنویسی برای سایت یا اپلیکیشن، Asynchronous Programming یا برنامهنویسی ناهمگام بحث مهمی بهحساب میآید. راهحلهای مختلفی برای حل این چالش پیشنهاد شده است. یکی از این راهحلها کوروتینهاست. زبانهای مختلف ازجمله C , Java ,Ruby ,Python & Kotlin از کوروتینها استفاده میکنند. در بیشتر زبانهایی که از کوروتینها کمک میگیرند، این کار ازطریق کتابخانههای آن زبان انجام میشود. کاتلین هم این کار را به مهمترین و غنیترین کتابخانهاش واگذار کرده است: Kotlinx.coroutines. با کوروتینها بهراحتی میشود اجرای موازی چند کار در اپلیکیشن را ممکن کرد. همچنین، کوروتینها بسیار کمحجم و سبک هستند.
نوشتن کوروتینها در کاتلین با قطعهکد زیر شروع میشود:
/* * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ // This file was automatically generated from coroutines-basics.md by Knit tool. Do not edit. package kotlinx.coroutines.guide.exampleBasic01 import kotlinx.coroutines.* fun main() = runBlocking { // this: CoroutineScope launch { // launch a new coroutine and continue delay(1000L) // non-blocking delay for 1 second (default time unit is ms) println("World!") // print after delay } println("Hello") // main coroutine continues while a previous one is delayed }
۲. Kotlinx.serialization
از بحثهای مهم دیگر در برنامهنویسی تبدیلکردن اطلاعات به زبانهای مختلف طوریکه تبادل آنها بین سیستمهای مختلف را امکانپذیر کند است. گاهی نیاز است تا اطلاعاتی که اپلیکیشن اندرویدی از آن استفاده میکند به فرمت دیگری تبدیل شود تا بشود آن را به سیستم دیگری منتقل یا در دیتابیس یا فایل ذخیره کرد. به این روند تغییر فرمت اطلاعات Serialization گفته میشود.
برعکس این وضعیت نیز ممکن است اتفاق بیفتد: Deserialization که در آن اطلاعاتی از منبع خارجی باید تبدیل شود تا اپلیکیشن بتواند آن را بخواند. این تغییر فرمتها برای اپلیکیشنهایی که با سیستم ثالثی تبادل اطلاعات دارند بسیار ضروری است. کتابخانهی Kotlinx.serialization، که مجموعهای از کتابخانههاست، این دو تغییر فرمت اطلاعات را در کاتلین انجام میدهد. کتابخانههای Kotlinx.serialization تبدیل اطلاعات به فرمتهای JSON, Protocol buffers, CBOR, Properties & HOCON را امکانپذیر میکنند.
۳. Multik
این کتابخانه قرار است کار توسعهدهنده اپهای اندرویدی را با آرایههای چند بعدی (Multidimensional Arrays) در کاتلین راحت کند. آرایهها برای جمعکردن چند مقدار درقالب یک متغیر بهکار میروند. در کاتلین میشود آرایههای دو بعدی، سه بعدی و چند بعدی داشت. یک آرایهی ساده به شکل زیر است:
val cars = arrayOf("Volvo", "BMW", "Ford", "Mazda")
هرچه ابعاد آرایه بیشتر شود، کار با آن کمی سختتر و پیچیدهتر میشود و نیاز به محاسبات دارد. اگر توسعهدهند بخواهد روی آرایههای چندبعدی عملیات ریاضی و محاسبات ریاضی انجام دهد هم کار سخت و پیچیده میشود. کتابخانهی Multik ساختن آرایهها (تا چهار بعدی) و کارهای مختلفی را که میشود روی آنها انجام داد راحتتر و سریعتر و سبکتر میکند. ساختن آرایهها در این کتابخانه بهترتیب زیر است (سومین کد برای ساختن آرایهی دو بعدی و آخرین کد برای ساختن آرایهی سه بعدی است):
val a = mk.ndarray(mk[1, 2, 3]) /* [1, 2, 3] */
val myList = listOf(1, 2, 3) val a = mk.ndarray(myList) /* [1, 2, 3] */
val m = mk.ndarray(mk[myList, myList]) /* [[1, 2, 3], [1, 2, 3]] */
mk.d3array(2, 2, 3) { it * it } /* [[[0, 1, 4], [9, 16, 25]], [[36, 49, 64], [81, 100, 121]]] */
۴. Viktor
این کتابخانه هم، که در بخش تحقیقاتی JetBrains ساخته شده است، به راحتتر کارکردن با آرایهها در کاتلین اختصاص دارد. Viktor کتابخانهای متن باز است. این کتابخانهی کاتلین قرار است محاسبات ریاضی مربوطبه آرایهها و آرایههای احتمال (probability arrays) را بهینهتر کند. آرایههای احتمال در کاتلین برای اجرای مدلهایی که به ماشین لرنینگ مربوط است استفاده میشود. کتابخانه Viktor تازه به جامعهی توسعهدهندگان اپهای اندرویدی معرفی شده است (نوامبر ۲۰۲۱). اگر میخواهید بیشتر با این کتابخانه کاتلین آشنا شوید، باید به سایت میزبان آن یعنی، GitHub، مراجعه کنید.
برای اینکه دربارهی انواع منوها در اپلیکیشنهای اندرویدی بیشتر بدانید، توصیه میکنم «منوها در اندروید چگونه ساخته میشوند؟» را بخوانید.
۵. Kotlinx.datetime
آخرین کتابخانهی کاتلین که اینجا معرفی میکنم، برای آسانترشدن کار با زمانها و تاریخها در کاتلین ساخته شده است. این کتابخانه مولتی پلتفرم است و برای کار با آن باید کاتلین نسخهی 1.5.0 و بالاتر را نصب کرده باشید. قابلیت مهمی که در آخرین نسخهی این کتابخانه به آن اضافه شده، سازگاری آن با Kotlinx.serialization است. این کتابخانهی کاتلین Typeهای (انواع دادههای) مخصوصبه خود را برای نشاندادن زمان و تاریخ دارد. نکتهی مهم دربارهی این تایپها (دادهها) این است که برای بیشتر آنها serializer مخصوص تعریف شده است و توسعهدهنده بهراحتی میتواند این دو کتابخانه را باهم استفاده کند. قطعهکد زیر نمونهای از ترکیب دو کتابخانهی کاتلین است.
import kotlinx.datetime.LocalDate import kotlinx.serialization.Serializable import kotlinx.serialization.json.Json import kotlinx.serialization.encodeToString @Serializable class Person(val name: String, val birthDate: LocalDate) fun main() { val harry = Person("Harry", LocalDate(1980, 7, 31)) println(Json.encodeToString(harry)) // {"name":"Harry","birthDate":"1980-07-31"} }
۶. MockK
این کتابخانهی متنباز را توسعهدهندهای بهنام Oleksiy Pylypenko در سال ۲۰۱۸ برای کاتلین ساخته است. کار این کتابخانه شبیه آزمونهای ماک آیلتس است. باکمک این کتابخانه آزمودن عملکردهای مختلف در اپلیکیشن شبیهسازی میشود. کار اصلی این کتابخانه این است که کامپوننتی را که قرار است کاراییاش آزموده شود ازسایر کامپوننتهای وابسته به آن جدا میکند. درواقع، کتابخانهی MockK کار تستکردن کامپوننتها در کاتلین را راحتتر و بهینهتر میکند. به مثال زیر توجه کنید. این مثالی است که سازندهی این کتابخانه برای توضیحدادن کار MockK زده است. قطعهکد سوم تست فانکشنی است که در قطعهکد دوم به class قطعهکد اول اضافه شده است.
class Dependency1(val value1: Int) class Dependency2(val value2: String) class SystemUnderTest( val dependency1: Dependency1, val dependency2: Dependency2 )
fun calculate() = dependency1.value1 + dependency2.value2.toInt()
@Test fun calculateAddsValues() { val doc1 = mockk<Dependency1>() val doc2 = mockk<Dependency2>() every { doc1.value1 } returns 5 every { doc2.value2 } returns "6" val sut = SystemUnderTest(doc1, doc2) assertEquals(11, sut.calculate()) }
جمعبندی و نتیجهگیری
۱. کتابخانههای کاتلین زیاد نیستند. کتابخانههای رسمی و معتبر کاتلین را JetBrains ساخته است و پشتیبانی میکند.
۲. ازمیان ۶ کتابخانهای که معرفی شد، حداقل ۲ کتابخانهی رسمی کاتلین (Kotlinx.coroutines & Kotlinx.serialization) برای هر توسعهدهندهای ضروری و کاربردی است.
۳. در این شکی نیست که کاتلین کار را برای توسعهدهندگان اپهای اندرویدی بسیار راحت کرده است. اما یادگیری کاتلین شاید کار خیلی آسانی برای همه نباشد. بههمیندلیل است که در آموزش برنامهنویسی اندروید، سرفصل مهاجرت از جاوا به کاتلین از بحثهای بسیار مهم آموزشی است.