آشنایی با زبان برنامه نویسی محبوب کوتلین (Kotlin)
بلاگ آکادمی لرن فایلز
طرح تخفیف «به افتخار کوروش بزرگ» فعال شد با ۷۵و۸۵ درصد تخفیف-۴۸ساعته
دریافتبلاگ آکادمی لرن فایلز
در این مقاله می خواهیم به آموزش زبان برنامه نویسی کوتلین بپردازیم پس اگر می خواهید بدانید که کوتلین چیست و چه مزایا و کاربرد هایی دارد تا انتها این مقاله همراه لرن فایلز باشید.
کوتلین جایگزینی برای زبان جاوا است و مزایا زیادی را بیش از جاوا برای توسعه دهندگان JVM وAndroid ارائه می دهد و به سادگی با جاوا در پروژه های مشابه رقابت می کند.چرا آن را امتحان نمیکنید؟
کوتلین همه جامع تر، اپن سورس،استاتیک تایپ شده عملگرا،زبان برنامه نویسی برای JVM وAndroid است. که ترکیبی از ویژگی های برنامه نویسی شی گرا و کاربردی است.این زبان متمرکز برقابلیت همکاری،ایمنی،وضوح و پشتیبانی ابزار شده است. نسخه های Kotlin برای جاوا اسکریپت (ECMAScript 5.1) و کد بومی (با استفاده از LLVM) به کار می روند.
Kotlin در سال ۲۰۱۰ در JetBrains، شرکتی از IntelliJ IDEA اختراع شد و از سال ۲۰۱۲، Open Source بوده است. تیم Kotlin در حال حاضر دارای بیش از ۲۰ عضو تمام وقت از JetBrains است و پروژه Kotlin در GitHub حدود ۱۰۰ شرکت کننده دارد. JetBrains از کوتلین در بسیاری از محصولاتش استفاده می کند که شامل IntelliJ IDEA است.پیگیری آنچه درجاوا۹ در تغییرات زنده اطلاعات جهانی تغییر یافته است چیز جدیدی در جاوا است.
در نگاه اول، Kotlin به نظر می رسد یک نسخه ساده از جاوا است. تصویر بالا را در نظر بگیرید، جایی که من نمونه کد جاوا (سمت چپ) را به طور خودکار به Kotlin تبدیل کرده ام. توجه داشته باشید که تکرار ذهنی ذاتی در اثبات متغیرهای جاوا از بین رفته است.
اصطلاح جاوا
StringBuilder sb = new StringBuilder();
در کوتلین به کد زیر تبدیل می شود :
val sb = StringBuilder()
شما می توانید ببینید که توابع با کلمه کلیدی سرگرم کننده تعریف شده است و سمیکالن(;) ها وقتی که خطوط جدید هستند اختیاری می باشند.کلمه کلیدی val، ویژگی فقط خواندنی یا متغیر محلی شبیه به کلمه var که برای متغیر محلی و قابل تغییر است را اعلان می کند.کلمه val وvar را تنها زمانی میتوانید استفاده کنید که نوع متغیر مشخص است، در غیراین صورت شما به اعلان نوع آن احتیاج دارید.در نتیجه به نظرمی رسد که با هر نسخه از کوتلین قابل بهبود یافتن است.نگاهی به اعلامیه عملکرد در بالای هر دو صفحه داشته باشید. نوع بازگشت در جاوا پیش از نمونه اولیه قرار دارد، اما در Kotlin، نمونه اولیه را که با کولون به عنوان پاسکال تعریف شده است، موفق می کند.این مثال خیلی واضح نیست اما کوتلین به توابع جاوا که عضوی از کلاس هستند احتیاج دارد. در Kotlin، توابع می توانند در یک فایل درسطح بالا، به طور محلی در داخل توابع دیگر، به عنوان یک تابع عضو در داخل یک کلاس یا شی و به عنوان یک تابع فراخوانی اعلان شوند. توابع فراخوانی قابلیت C-like را برای گسترش کلاس با قابلیت های جدید بدون نیاز به ارث بردن از کلاس و یا استفاده از هر نوع الگوی طراحی مانند تزئین کننده فراهم می کنند.
برای طرفداران Groovy کوتلین سازنده ها استفاده می کند. در حقیقت می توان سازنده های کوتلین را از لحاظ تایپی بررسی کرد. کوتلین از خصیصه های مشاور نیز پشتیبانی می کند که با کمک آنها میتوان خصیصه های تنبل، خصیصه های قابل مشاهده و قابل وتو و یافته شده را اجرا نمود.
بسیاری از مکانیسم های ناهمگام موجود در زبان های دیگر می توانند به عنوان کتابخانه هایی با استفاده از کورتین کوتلین اجرا شوند که در Kotlin 1.1 تجربی هستند. این شامل Async/await از C # و ECMAScript، کانال ها و انتخاب از Go، و generators/yieldاز C # و پایتون.
اجازه دادن به توابع سطح بالا فقط آغاز داستان برنامه نویسی کاربردی برای Kotlin است.این زبان همچنین از توابع مرتبه بالاتر، توابع ناشناس، Lambdas، توابع درون خطی، بسته شدن، بازگشت به عقب و عمومی پشتیبانی می کند. به عبارت دیگر، کوتلین دارای تمام ویژگی ها و مزایای یک زبان کاربردی است. برای مثال، مفاهیم کوتلین کاربردی زیر را در نظر بگیرید.
برای بیان حتی کوتاهتر، آن را در زمانی که تنها یک پارامتر در تابع lambda وجود دارد استفاده کنید:
val positives = list.filter { it > ۰ }
پیمودن یک نقشه / لیستی از جفت ها در Kotlin
k و v میتواند هر چیزی را نام ببرد:
for (i in ۱ until ۱۰۰) { … } // half-open range: does not include 100
for (x in ۲..۱۰ step 2) { … }
for (x in ۱۰ downTo 1) { … }
if (x in ۱..۱۰) { … }
مثالهای بالا برای کلید واژه و همچنین استفاده از محدوده ها را نشان می دهد.
اگرچه Kotlin یک زبان برنامه نویسی تکامل یافته است، اما بسیاری از ماهیت های جاوااسکریپت، جاوا را به عنوان یک سبک برنامه نویسی جایگزین در هنگام تبدیل کد جاوا موجود، حفظ می کند که بسیار مفید است.
Kotlin کلاس هایی با سازنده ها دارد، همراه با کلاس های درونی داخلی، داخلی و ناشناس، و دارای رابط هایی مانند Java 8. کوتلین یک کلمه کلیدی جدید ندارد. برای ایجاد نمونه ای از کلاس، سازنده را مانند یک عملکرد منظم بنامید . ما در تصویر بالا دیدیم.
Kotlin دارای وراثت تک از یک سوپر کلاس نامیده شده است، و تمام کلاس های کوتلین هیچ سوپراکلاس پیش فرض ندارند که مشابه کلاس جاوا java.lang.Object باشد. هر کدام شامل تنها سه تابع عضو از پیش تعریف شده است:
()equals() – hashCode و ()toString .
کلاس های Kotlin باید با کلید واژه باز مشخص شوند تا دیگر کلاس ها بتوانند از آنها به ارث برده شوند؛ کلاس های جاوا به نوعی مخالف هستند، به عنوان آنها به ارث برده می شود مگر اینکه با کلید واژه نهایی مشخص شده باشد. برای ترکیب روش سوپر کلاس , باید ابتدا آن را به عنوان ” باز ” علامت گذاری کنیم و سپس به شکل override . این بخشی از فلسفه ی کوتلین است که همه جیز را با جزییات و نه به شکل پیش فرض ارائه کند در موارد خاص دیده ام که زیر مجموعه های سوپر کلاس با ” Open ” علامت گذاری شده اند که نهایتا باعث می شود خیلی از خطاهای رایج در جاوا در این جا رخ ندهند.
در بحث خودداری از خطاهای معمولی، کوتلین طوری طراحی شده است تا از نشانه گر های مرجع NULL یا صفر جلوگیری کند و آن ها را از بین ببرد. این کار با کمک فرمان null انجام می شود که برای انواع استاندارد و پیاده سازی آزمون های اعلان غیر مجاز است. برای مثال یک متغیر معمولی string نمی تواند null داشته باشد.
var a : String =”abc”
a = null // compilation error
پس اگر مثلا برای نتایج جستجوی sql نیاز به null داشته باشید ، می توانید با اضافه کردن علامت سوال به متغیر برایش نوع NULL تعریف کنید. مثال ?String
var b: String? =”abc”
b = null // ok
محافظت ها کمی بیشتر میشود .می توان از یک نوع non-nullable با مصونیت استفاده نمود ولی باید نوع nullable را برای مقادیر صفر با استفاده از آن بررسی کنید.
برای این که از قواعد فعلی مورد نیاز برای آزمون null استفاده نکنیم، kotlin یک فراخوان مطمئن با علامت سوال را معرفی میکند ؟ . برای مثال b?.length. می شود b.length اگر b، نول (null)نباشد . نوع این جمله Int?. می باشد.
یعنی که b?.length میان بری برای if (b != null) b.length else null میباشد. این نوع نوشتن بخوبی هم خوانی می شود و خیلی از منطق هایپرولیکس را از میان می برد. مخصوصا زمانی که یک شی به خاطر مجموعه ای از جستجو ها انباشته می شود و پایگاه داده ای آن با خطا مواجه می شود. برای مثال bob?.department?.head?.name می شود نام قسمت bob رابه ما می دهد اگر که آن قسمت و سر قسمت آن غیر از null باشند.
برای این که عملیات فقط برای مقادیر غیر NULL انجام بشوند می توانید از فراخوان امنیتی ؟ با let استفاده کنید:
val listWithNulls: List<String?> = listOf(“A”, null)
for (item in listWithNulls) {
item?.let { println(it) } // prints A and ignores null }
اغلب ممکن است بخواهید یک مقداری از یک عبارت nullable داشته باشید پس باید آن را به شکل یک نوع non-nullable ذخیره کنید. برای این منظور می توانید از عملگر Elvis ( شوخی ندارم) استفاده کنید به شکل ؟:
val l = b?.length ?: -1
که برابر است با
val l: Int = if (b != null) b.length else -۱
در همان مسیر kotlin فاقد عبارت های چک شده ی java می باشد که شرایطی هستند که باید در نظر گرفته شوند. برای مثال jdk در مثال زیر:
Appendable append(CharSequence csq) throws IOException;
نیاز دارد تا شما هر بار که append را فرا می خوانید از IOException استفاده کنید
try {
log.append(message)
}
catch (IOException e) {
// Do something with the exception
}
طراحان جاوا فکر می کنند که این یک ایده ی خوب است و برای آن ها برگ برنده ای است البته تا زمانی که برنامه نویس از یک عبارت catch خوب استفاده کند.
اغلب برنامه های بیش از حد بزرگ جاوا یک عبارت اجباری catch دارند که شامل فقط یک دستور //todo: handle this می باشد . این به کسی کمکی نمی کند و عبارت های چک شده در جاوا برای برنامه های بزرگ ضرر کامل هستند.
تا May سال ۲۰۱۷ تنها برنامه ی رسمی که برای برنامه نویسی اندروید استفاده می شد جاوا و c++ بودند.گوگل بعد از آن اعلام کرد که می توان از کوتلین با استودیوی اندروید ۳.۰ استفاده نمود. در مجموعه ی ابزار اندرویدی وجود دارد کوتلین را می توان به ورژن های قبلی اندروید استودیو با کمک یک افزونه اضافه نمود.
کوتلین از همان کد های بایتی جاوا استفاده می کند و کلاس های جاوا را به شکل معمولی و طبیعی در خود جای می دهد . به خاطر این که هیچ سقفی برای فراخوان بین کوتلین و جاوا وجود ندارد می توان کوتلین را به خوبی به برنامه های کنونی جاوا اضافه و جایگزین نمود. تنها جایی که انتقال بین جاوا و کوتلین خوب عمل نمی کند یعنی خصیصه های Set-only در جاوا به ندرت با مشکل رو به رو می شوند.
Pinterest اولین ارائه کننده ی کوتلین برای اندروید درنوامبر ۲۰۱۶ بود و در ۲۰۱۷ و مراسم معرفی گوگل به خوبی معرفی شد. به علاوه, تیم کوتلین مایل است تا برنامه های trrelo, square , courser را برای اندروید معرفی کند.
بعد از اعلان گوگل سوالی که برای همه پیش آمده است انتخاب بین جاوا و کوتلین برای توسعه در برنامه های آتی اندرویدی می باشد. . البته این سوال از قبل از اعلان ارائه ی نسخه ی ۱.۰ کوتلین در فوریه ی ۲۰۱۶ هم وجود داشت. جواب کوتاهش این است که کوتلین امن تر و دقیق تر از جاوا است و کوتلین و جاوا می توانند در اندروید هم زیستی داشته باشند ولی کوتلین فقط برای برنامه های جدید نیست و می توان در برنامه های جاوا موجود نیز از آن ها استفاده نمود.
تنها بحثی که می ماند در زمینه ی کامل شدن نوبی های اندرویدی است. برای آن ها هنوز ممکن است بیشتر سند سازی ها و مثال ها در جاوا باشند. اما از سویی, تبدیل جاوا به کوتلین در استودیو اندروید فقط نیاز به past کردن کد های جاوا در فایل کوتلین دارد.
برای همه که به دنبال برنامه نویسی در اندروید هستند کوتلین مزیت های زیادی دارد. یک برنامه نویس جاوا در چند ساعت می تواند کار با کوتلین را فرا بگیرد که برای او امتیازات زیادی خواهد داشت کثل توسعه تابع ها , پشتیبانی برای برنامه نویسی تابعی و اضافه کردن کوروتن ها.
این سوال که از کوتلین یا اسکالا استفاده کنیم در جامعه ی اندرویدی معمولا اتفاق نمی افتد چون که ابزار های اندروید که اسکالا را پشتیبانی می کنند خیلی خوب نیستند و کتابخانه ی اسکالا برای اندروید بسیار بزرگ است. از سویی دیگر جامعه ی اسکالا این مشکلات را بخوبی می داند و به دنبال راه حل هایی برای آن هاست.
در محیط های دیگر , شرایط کمی متفاوت است. برای مثال apache spark اغلب در اسکالا نوشته می شود و برنامه ها داده ای حجیم آن باید در اسکالا نوشته شوند.
در خیلی از روش های توصیف شده کوتلین و اسکالا ترکیبی از برنامه نویسی شی محور را ارائه می کنند که در جاوا هم بود. هر دو زبان از اعلان ها و مفاهیم مشترکی مثل null و var استفاده می کنند اما در بقیه ی موارد با هم فرق می کند. مثل همزمان قرار دادن فلش برای تابع Lambada و فلش تکی یا دو تایی . data class رد کوتلین براحتی بر روی case class در اسکالا قرار می گیرد.
کوتلین مقادیر غیر NULL مثل c++ دارد. بیشتر افراد براحتی از آن ها استفاده می کنند. اسکالا متغیر هایی با کمک option تعریف می کند که آن قدر از آن ها استفاده نشده که برنامه نویسان فکر می کنند اسکالا NULL ندارد.
یکی از بدی های اسکالا زمان اجرا کد هاست که طولانی است و برای برنامه نویسی برنامه های بزرگ اصلا مناسب نیست. اما کوتلین طوری طراحی شده است که سناریو های کد نویسی را سریعا طراحی کند و حتی برخی زمان ها سریع تر از جاوا.
در این جا ممکن است فکر کنید که چگونه کوتلین فراخوان های جاوا انجام می دهد با توجه به این که null در دو برنامه به شکل مختلفی انجام اجرا می شود. کوتلین طوری رفتار می کند که نوع null مثل جاوا است . کوتلین هم چنین می تواند یک کد در زمان اجرا قرار بدهد که null را کنترل کند. هیچ زبانی وجود ندارد که بتواند در زمان اجرا این کار را انجام دهد ولی کوتلین می تواند با ! این کار را انجام دهد .
در خیلی از موارد کد های جاوا از کوتلین به شکلی که می خواهید اجرا خواهند شد. برای مثال هر گیرنده و فرستنده در جاوا با یک نام و خصیصه در کوتلین مورد استفاده هستند. به همین شکل روش های بولین(Boolean) نیز به شکل خصیصه هایی با همان در روش فرستنده معرفی می شوند . برای مثال
import java.util.Calendar
fun calendarDemo() {
val calendar = Calendar.getInstance()
if (calendar.firstDayOfWeek == Calendar.SUNDAY) { // call getFirstDayOfWeek()
calendar.firstDayOfWeek = Calendar.MONDAY // call setFirstDayOfWeek()
}
if (!calendar.isLenient) { // call isLenient()
calendar.isLenient = true // call setLenient()
}
}
این طرح در خصیصه های set only جاوا با خطا مواجه خواهد شد که در کوتلین پشتیبانی نخواهند شد. اگر یک جاوا فقط فرستنده باشد در خصیصه های کوتلین قابل رویت نخواهد بود.
کوتلین در راستای جاوا از ابزار آن استفاده می کند کوتلین ide های خودش را ندارد. از افزونه برای ویرایش کننده های های معروف جاوا مثل ideو studi, elcipes , IDEA استفاده می کند. کوالین برای سیستم ساخت خود را ندارد و از Gradle, Maven, and Ant استفاده می کند.
به خاطر این که جاوا اسکریپت برنامه ای پویا است کوتلین یک نوع پویا برای jvm در کوتلین اضافه می کند.
val dyn: dynamic = …
Checker یا بررسی کننده متغیر ها در کوتلین نوع dynamic را در نظر نمی گیرد و جاوا اسکریپت در زمان اجرا به آن ها رسیدگی می کند. معادله هایی که از مقدار dynamic استفاده می کنند برای جاوا اسکریپت ترجمه می شود. دوباره کوتلین به جاوا اجازه می دهد در زمان اجرا به فرمان ها رسیدگی کند.
می توانید جاوا اسکریپت را با دو روش فرا بخوانید :با استفاده از dynamic درکتابخانه ی javascript. برای دسترسی به چارچوب های ثالث معروف جاوا با یک API قوی می توانید تعاریف را با کمک DefinitelyTyped برای استفاده در کوتلین با ابزار ts2kt تبدیل کنید.
می توانید کد ها را به شکل متن با استفاده از تابع js(“…”) در یک خط قرار دهید. باید اعلان ها را در کد های کوتلین به شکل کد های خالص جاوا با external بنویسید. ولی باید از نام های خوب و کامل استفاده کنید.
به طور کلی کوتلین مزیت های زیادی نسبت به جاوا در کد نویسی ارائه می کند که می توان از آن ها در JVMاستفاده کرد و می تواند کد های اصلی جاوا را نیز تولید کند. در مقایسه با جاوا، کوتلین امنیت بیشتری دارد و دقیق تر است. برنامه نویسی تابعی نیز در کنار برنامه نویسی شی محور در کوتلین قابل پشتیبانی است و امنیت null از طریق ارائه ی متغیر های nullable و non-nullable امکان پذیر شده است. از همه بهتر اگر شما از جاوا استفاده می کنید می توانید خیلی سریع در کوتلین برنامه نویسی کنید.
چه ترجمهی بدی |-:
سلام بر شما. حق با شماست 🙂 اصلاح می کنیم…