چرا کاتلین؟ ۸ دلیل که میتواند برنامهنویسان جاوا را برای تغییر قانع کند (قسمت اول)
جاوا به چه شکلی در میآمد اگر کسی آن را امروز از نو طراحی میکرد؟ احتمالا چیزی شبیه کاتلین

اولین نسخه رسمی کاتلین در سال 2016 منتشر شد. در این سالها توجهات بسیاری را جلب کرده مخصوصا از زمانی که گوگل اعلام کرد که میتوان از کاتلین هم برای توسعه برنامههای اندروید استفاده کرد و حتی زبان توصیهشده برای اندروید را کاتلین معرفی کرد. در صورتی که فکر میکنید زمان یادگرفتن زبان جدیدی فرا رسیده، ادامه این مطلب را دنبال کنید.
کاتلین در سال ۲۰۱۱ معرفی شد ولی اولین نسخه پایدار آن (نسخه ۱.۰) سال ۲۰۱۶ منتشر شد. کاتلین زبان متنباز و رایگانی است که توسط مهندسان JetBrains توسعه یافته است.
پیشتر در مورد قابلیت همکاری زبانهای مختلفِ بر پایه JVM در جاواکاپ، مطلبی را منتشر کردیم.
درباره کاتلین
کاتلین یک زبان مدرن با تایپ ایستا است. این زبان هم قابلیت نوشتن برنامههای شیگرا و هم تابعی را برای برنامهنویس فراهم میکند.
کاتلین میتواند در پلتفرمهای گوناگونی از جمله JVM اجرا شود. همانطور که از زبانهای بر پایه JVM انتظار داریم، قابلیت همکاری بسیار خوبی با جاوا دارد. همین موضع باعث شده فکر کنیم اگر جاوا امروز طراحی میشد چه شکل و شمایلی داشت.
در این مطلب ۸ قابلیت جذابی که فکر میکنیم برای برنامهنویسان جاوا جالب خواهد بود را معرفی میکنیم.
- سینتکس تمیز و جمعوجور
- (تقریبا) یک تایپسیستم
- امنیت در برابر null
- توابع و برنامهنویسی تابعی
- کلاسهای داده
- توابع extension
- سربار کردن اپراتورها
- اشیا سطح بالا و الگوی سینگلتون
«سلام دنیا!» در کاتلین
در اولین مثال، کد «سلام دنیا!» را در کاتلین بررسی میکنیم.
fun main() { println("Hello, world!") }
به همین سادگی! با همین مثال برخی تفاوتهای بنیادین سینتکس کاتلین و جاوا را بررسی میکنیم.
- تابع main، تابع سطح بالاست، در واقع به این معنی است که نیازی نیست توابع حتما در کلاسها قرار گرفته باشند.
- از کلیدواژه public static خبری نیست. اگرچه کاتلین کلیدواژههایی برای تغییر سطح دسترسی (visibility modifier) دارد اما نیازی به نوشتن public نیست. همچنین کاتلین از static پشتیبانی نمیکند اما در این مورد اصلا نیاز هم نیست چرا که main به عنوان یک تابع سطح بالا تعریف شده است.
- از نسخه 1.3 کاتلین، پارامتر «آرایهای از رشتهها» اجباری نیست و میتواند حذف شود. همچنین اگر نیاز باشد میتواند به شکل args : Array<String>m تعریف شود.
- اگر تابع قرار نیست چیزی برگرداند، نوشتن تایپ خروجی اجباری نیست. البته کاتلین از کلیدواژه Unit به جای void استفاده میکند که میتواند حذف شود.
- سمیکالنها (; یا نقطهویرگول) اجباری نیستند اما در مقابل، خطوط جدید در کد معنادار هستند.
تا اینجا یک مرور خیلی سریع داشتیم اما تفاوتها به اینجا محدود نمیشود و چیزهای بسیار زیادی است که کاتلین در آنها با جاوا تفاوت دارد.
۱- سینتکس تمیز و جمعوجور
یکی از نقدهایی که به جاوا وارد میشود این است که کدهای آن بیشاز حد طولانیاند. اما گاهی این طولانی بودن میتواند کمککننده باشد و مثلا میتواند باعث افزایش خوانایی کد شما شود. یکی از چالشهای طراحی زبان برنامهنویسی، حفظ خوانایی و شفافیت، در عین کاهش طول کد است. به نظر من کاتلین در این چالش موفق بوده است.
همانطور که در مثال «سلام دنیا!» دیدیم، کاتلین به سمیکالنها احتیاجی ندارد و اجازه میدهد تایپ برگشتی تابع (در صورتی که Unit باشد) را ننویسیم. بیاید باقی تفاوتهایی که باعث میشود کاتلین زبانی با سینتکس کوتاهتر و واضحتر از جاوا باشد را نیز ببینیم.
استنباط تایپ
تعریف متغیر در کاتلین به صورت var x : Int = 5 انجام میشود. همچنین میتوانید به کمک استنباط تایپ از نسخه کوتاهتر var x = 5 استفاده کنید. اگرچه جاوا هم در نسخه ۱۰ چنین قابلیتی را اضافه کرد ولی برای مدتی طولانی پیش از جاوا، این قابلیت در کاتلین وجود داشت.
همچنین کلیدواژه val در کاتلین وجود دارد که با آن میتوان متغیرهای «فقط خواندنی» را تعریف کرد. مشابه چیزی که با کلیدواژه final در جاوا داشتیم و به این معنا که این متغیرها نمیتوانند به صورت مجدد مقداردهی شوند.
val x = 5 ... x = 6 // ERROR: WILL NOT COMPILE
خصوصیات در مقابل فیلدها
در جاوا فیلدها وجود دارند. اما در کاتلین به جای فیلد، خصوصیتها (property) وجود دارند. تعریف و استفاده از خصوصیتها مثل فیلدهای پابلیک جاواست با این تفاوت که خود کاتلین متدهای get و set را برای ما تعریف میکند. (برای val فقط get و برای var هردو). البته همچنان میتوانیم در صورت نیاز نسخههای خودمان از این متدها را بنویسیم.
بیشتر خصوصیتها در کالتین، پشتوانهای از نوع فیلد دارند اما میتوان خصوصیتی تعریف کرد که هربار از روی یک تابع محاسبه شود. در واقع فقط یه متد get دارد بدون اینکه فیلد خاصی را برگرداند. برای مثال کلاسی برای نشان دادن یک «شخص» میتواند یک خصوصیت «تاریخ تولد» داشته باشد و یک خصوصیت بدون فیلد (محاسبهای) برای سن.
ایمپورتهای پیشفرض در مقابل ایمپورتهای صریح
جاوا به صورت ضمنی کلاسهای داخل پکیج java.lang را ایمپورت میکند اما تمام کلاسهای دیگر باید به صورت صریح ایمپورت شوند. در نتیجه بسیار مرسوم است که در بالای فایلهای جاوا، چندین خط ایمپورت کلاسهای مختلف از java.io و java.util ببینیم.
اما در کاتلین علاوه بر kotlin.* که معادل java.lang.* است، kotlin.io.* و kotlin.collections.* و کلاسهایی از پکیجهای دیگر ایمپورت میشوند تا در نتیجه در هر فایل کاتلین، شاهد ایمپورتهای تکراری کمتری باشیم؛ مخصوصا برای کلاسهایی که از کالکشنها و IO استاندارد استفاده میکنند.
عدم نیاز به new برای سازنده
در کاتلین، استفاده از کلیدواژه new برای ساخت شی جدید ضروری نیست. بنابراین کدهای زیر با هم معادل هستند:
// java Student s = new Student(...); // or var s = new Student(...); // kotlin var s = Student(...)
قالبهای رشته
رشتهها میتوانند شامل عبارتهایی باشند که محاسبه میشوند و حاصل آنها در رشته جای میگیرد.
یک عبارت درون رشته، با علامت $ شروع میشود و شامل نام یک متغیر یا یک عبارت قابل محاسبه درون { } است. قالبهای رشته میتوانند باعث کوتاه شدن طول کد شوند زیرا معادل جاوا باید از الحاق رشته استفاده کند.
//java println("Name: " + name + ", Department: " + dept); // kotlin println("Name: $name, Department: $dept")
در این مثال به جای name$ و dept$، در زمان اجرا مقادیر متغیرهای name و dept قرار خواهد گرفت.
کلیدواژههای extends و implements
برنامهنویسان جاوا میدانند که یک کلاس جاوا میتواند از کلاس دیگر ارثبری کند (extends) و یک یا بیشر interface را پیادهسازی کند (implements). در کاتلین تفاوت سینتکسی بین این دو وجود ندارد. برای هر دو مورد کاتلین از «دو نقطه» استفاده میکند.
// java public class Student extends Person implements Comparable<Student> // kotlin class Student : Person, Comparable<Student>
استثناهای چکشده وجود ندارند
استثناهای کاتلین مشابه آنچه در جاوا داریم وجود دارند. همچنان میتوانیم استثناها را پرتاب و دریافت کنیم. اما هیچ استثنایی چکشده نیست. به بیان دیگر کامپایلر کاتلین شما را مجبور نمیکند که هیچ استثنایی را دریافت یا تصریح کنید.
شکستن به اجزای سازنده (Destructing)
تکنیک destructing را میتوان به عنوان شکستن یک شی به اجزای سازنده معنی کرد. با یک دستور «شکستن» چند متغیر مختلف با هم تعریف میشوند.
در کد زیر چند نمونه از کاربردهای «شکستن» را میبینیم.
برای مثال، اول فرض کنید متغیر student یک شی از نوع Student است.
val (_, lName, fName) = student // extract first and last name from student object // underscore means we don't need student.id for ((key, value) in map) { // do something with the key and the value }
عبارت if قابل تبدیل به مقدار
در کاتلین، if معمولی (statement) مانند آنچه در جاوا هست وجود دارد اما همچنین if قابل تبدیل به مقدار (expression) نیز وجود دارد. سینتکس جاوا (مانند سی) برای if قابل تبدیل به مقدار، عملگر سهعملوندی ( : ? ) است اما برای خوانایی بیشتر در کاتلین با این نوع if جایگزین شدهاست.
برای مثال کد جاوای زیر
double max = x >= y ? x : y
با تبدیل به معادل خود در کاتلین، شفافتر نوشته میشود.
val max = if (x >= y) then x else y
اگرچه در اینجا سینتکس کاتلین کمی طولانیتر است اما باعث خوانایی بیشتر میشود.
(یادداشت نویسنده: در اینجا «if قابل تبدیل به مقدار» همان if expression است و در مقابل if statement آمده که قابل تبدیل به مقدار نیست. در مورد این تفاوت میتوانید اینجا مطالعه کنید.)
when جایگزین switch
برای من، دوست نداشتنیترین قابلیت در زبانهای مشابه C، عبارت switch است. کاتلین عبارت switch را با when جایگزین میکند. به مثال زیر دقت کنید. توجه کنید که نیازی به break نیست و به راحتی میتوان چندین مقدار را برای یک case در نظر بگیرید.
when (x) { in 1..10 -> print("x is in the range") in validNumbers -> print("x is valid") !in 10..20 -> print("x is outside the range") else -> print("none of the above") }
اگر تلاش کنید که عبارت بالا را با امکانات C یا جاوا پیادهسازی کنید، متوجه میشوید که when در کاتلین چقدر بهتر است. همچنین عبارت when قابل تبدیل به مقدار (expression) نیز هست بنابراین مقدار حاصل از caseی که واردش شویم، به عنوان مقدار کل عبارت when تعیین میشود.
یادداشت: از جاوا ۱۴ هم عبارتهای switch بهبود یافتهاند و امکاناتی مشابه when کاتلین ارائه میدهند. چند نمونه از این بهبودها را میتوانید در این مطلب از جاواکاپ ببینید.
۲- (تقریبا) یک تایپسیستم
همانطور که میدانید در جاوا ۲ تایپسیستم متفاوت وجود دارد. نوع دادههای ابتدایی (primitive) و تایپهای رفرنس (اشیا).
اما جاوا به چه دلیل هنوز نوع دادههای ابتدایی را نگه داشته و آنها را با کلاسهای لفاف (wrapper class) معادل خود جایگزین نکرده است؟ کارایی. (بنچمارک و برخی توضحات را میتوانید اینجا بخوانید)
کاتلین مانند اسکالا تنها یک تایپسیستم دارد و جداسازیای بین نوع دادههای اولین و رفرنسها وجود ندارد. البته کامپایلر تلاش میکند جایی که ممکن است از نوع دادههای اولیه استفاده کند.
منبع: https://www.infoworld.com/article/3396141/why-kotlin-eight-features-that-could-convince-java-developers-to-switch.html
با اندکی تغییر و تلخیص
.
.
.
.
با ما همراه باشید
آدرس کانال تلگرام: JavaCupIR@
آدرس اکانت توییتر: JavaCupIR@
آدرس صفحه اینستاگرام: javacup.ir
صفحه ویرگول: javcup
آدرس گروه لینکدین: Iranian Java Developers
سلام من میخوام برنامه نویسی اندروید یاد بگیرم دوستان گفتن پکیج صفر تا صد جاوا شما را دانلود کنم و همین کار را کردم الان دیدم تو سایت زدین کاتلین میخوام بدون من میخوام یه برنامه نویس خوب شم تو حوزه نرم افزار ها اندرویدی ایا جاوا بهتره یا کاتلین نمیدونم هیچی از برنامه نویسی یاد ندارم ممنونم بهم کمک کنید لطفا دوستانی که حرفه ایی هستند پاسخ منو بدن نه اماتور ها متشکرم
سلام روزتون بخیر باشه
پاسخ سوال شما یه مقدار جنبه سلیقهای داره، سعی میکنم بدون طرفداری پاسخ دهم اما شما هم خوب است از بزرگان دیگر مشورت بگیرید.
این سلسله مطالب ما جنبه معرفی زبانهای برنامهنویسیای که پیرامون JVM شکل گرفتهاند را دارد و برای آگاهی بخشی است، به این معنی که همه باید کاتلین یا گرووی یا … را یاد بگیرند نیست، فقط با توجه به اینکه در این زبانها میتوانید از کتابخانههای جاوا استفاده کنید و نیازی به تغییر خاصی روی سرورهای ارائهدهندهی محصول نیست میتواند به عنوان یادگیری زبان جدید برای برنامهنویسان جاوا جذاب باشد.
یادمان نرود که زبانهای برنامهنویسی برای برنامهنویسان حکم ابزار در جعبه ابزار را دارند.
برای برنامهنویسی اندروید از قدیم حاوا زبان مناسبی برای این کار بود اما اخیرا شرکت گوگل زبان اصلی را کاتلین قرار داده ولی جاوا هم به عنوان زبان دیگر پشتیبانی میشود. مثلا مستندات برای هردو زبان موجود است اما پیشفرض زبان کاتلین است.
با توجه به این مورد، اگر هدف شما فقط برنامهنویسی اندروید است توصیه میشود زبان کاتلین را پیگیری کنید چرا که از نظر گوگل (سازندهی اندروید) برای اندروید آیندهدارتر است.
البته میتوانید با جاوا شروع کنید و حتی ادامه دهید ولی در آینده احتمالا تشویق خواهید شد کاتلین را نیز یاد بگیرید. برای همین گفتم سلیقهای است.
سلام خسته نباشید
ببخشید آزمون جاواکاپ بعدی کی برگذار میشه؟
سلام
حتما از چند ماه قبل در رسانههای جاواکاپ (سایت و شبکههای اجتماعی) اطلاعرسانی خواهد شد.
در حال حاضر، زمان برگزاری آزمون بعدی قطعی نیست.
یک دلیل که نمیام سمت کاتلین. سینتکس مضخرف. سمت پایتون میرم ولی کاتلین نه