دانستنی‌ها

چرا کاتلین؟ ۸ دلیل که می‌تواند برنامه‌نویسان جاوا را برای تغییر قانع کند. (قسمت اول)

جاوا به چه شکلی در می‌آمد اگر کسی آن‌ را امروز از نو طراحی می‌کرد؟ احتمالا چیزی شبیه کاتلین

اولین نسخه رسمی کاتلین در سال ۲۰۱۶ منتشر شد. در این سال‌ها توجهات بسیاری را جلب کرده مخصوصا از زمانی که گوگل اعلام کرد که می‌توان از کاتلین هم برای توسعه برنامه‌های اندروید استفاده کرد و حتی زبان توصیه‌شده برای اندروید را کاتلین معرفی کرد. در صورتی که فکر می‌کنید زمان یادگرفتن زبان جدیدی فرا رسیده، ادامه این مطلب را دنبال کنید.

کاتلین در سال ۲۰۱۱ معرفی شد ولی اولین نسخه پایدار آن (نسخه ۱.۰) سال ۲۰۱۶ منتشر شد. کاتلین زبان اوپن‌سورس و آزاد است که توسط مهندسان JetBrains توسعه یافته‌است.

پیش‌تر در مورد قابلیت‌ همکاری زبان‌های مختلفِ برپایه JVM در جاواکاپ، مطلبی را منتشر کردیم.

درباره کاتلین

کاتلین یک زبان مدرن با تایپ ایستا است. این زبان هم قابلیت نوشتن برنامه‌های شی‌گرا و هم تابعی را برای برنامه نویس فراهم می‌کند.

کاتلین می‌تواند در پلتفرم‌های گوناگونی از جمله JVM اجرا شود. همانطور که از زبان‌های برپایه JVM انتظار داریم، قابلیت همکاری بسیار خوبی با جاوا دارد. همین موضع باعث شده فکر کنیم اگر جاوا امروز طراحی می‌شد چه شکل و شمایلی داشت.

در این مطلب ۸ قابلیت جذابی که فکر می‌کنیم برای برنامه‌نویسان جاوا جالب خواهد بود را معرفی می‌کنیم.

  1. سینتکس تمیز و جمع‌و‌جور
  2. (تقریبا) یک تایپ‌سیستم
  3. امنیت در برابر null
  4. توابع و برنامه نویسی تابعی
  5. کلاس‌های داده
  6. توابع extension
  7. سربار کردن اپراتورها
  8. اشیا سطح بالا و الگوی سینگلتون

نمایی از لوگوی کاتلین

«سلام‌ دنیا!» در کاتلین

در اولین مثال، کد «سلام‌ دنیا!» را در کاتلین بررسی می‌کنیم.

به همین سادگی! با همین مثال برخی تفاوت‌های بنیادین سینتکس کاتلین و جاوا را بررسی می‌کنیم.

  1. تابع main، تابع سطح بالاست، در واقع به این معنی است که نیازی نیست توابع حتما در کلاس‌ها قرار گرفته باشند.
  2. از کلیدواژه public static خبری نیست. اگرچه کاتلین کلیدواژه‌هایی برای تغییر سطح دسترسی (visibility modifier) دارد اما نیازی به نوشتن public نیست. همچنین کاتلین از static پشتیبانی نمی‌کند اما در این مورد اصلا نیاز هم نیست چرا که main به عنوان یک تابع سطح بالا تعریف شده است.
  3. از نسخه ۱٫۳ کاتلین، پارامتر «آرایه‌ای از رشته‌ها» اجباری نیست و می‌تواند حذف شود. همچنین اگر نیاز باشد می‌تواند به شکل args : Array<String>m تعریف شود.
  4. اگر تابع قرار نیست چیزی برگرداند، نوشتن تایپ خروجی اجباری نیست. البته کاتلین از کلیدواژه Unit به جای void استفاده می‌کند که می‌تواند حذف شود.
  5. سمی‌کالن‌ها اجباری نیستند. در مقابل خطوط جدید در کد معنی‌دار هستند.

تا اینجا یک مرور خیلی سریع داشتیم اما تفاوت‌ها به اینجا محدود نمی‌شود و چیزهای بسیار زیادی است که در آن‌ها کاتلین با جاوا متفاوت است.

۱- سینتکس تمیز و جمع‌و‌جور

یکی از نقدهایی که به جاوا وارد می‌شود این است که کدهای آن بیش‌از حد طولانی‌اند. اما گاهی این طولانی بودن می‌تواند کمک‌کننده باشد، مثلا می‌تواند باعث افزایش خوانایی کد شما شود. یکی از چالش‌های طراحی زبان برنامه‌نویسی، حفظ خوانایی و شفافیت، در عین کاهش طول کد است. به نظر من کاتلین در این چالش موفق بوده است.

همانطور که در مثال «سلام دنیا!» دیدیم، کاتلین به سمی‌کالن‌ها احتیاجی ندارد و اجازه می‌دهد تایپ برگشتی تابع (در صورتی که Unit باشد) را ننویسیم. بیاید باقی تفاوت‌هایی که باعث می‌شود کاتلین زبانی با سینتکس کوتاه‌تر و واضح‌تر از جاوا باشد را نیز ببینیم.

استنباط تایپ

تعریف متغیر در کاتلین به صورت var x : Int = 5 انجام می‌شود. همچنین می‌توانید به کمک استنباط تایپ از نسخه کوتاه‌تر var x = 5 استفاده کنید. اگرچه جاوا هم در نسخه ۱۰ چنین قابلیتی را اضافه کرد ولی برای مدتی طولانی پیش از جاوا، این قابلیت در کاتلین وجود داشت.

همچنین کلیدواژه val در کاتلین وجود دارد که با آن می‌توان متغیر‌های «فقط خواندنی» را تعریف کرد. مشابه چیزی که با کلیدواژه final در جاوا داشتیم و به این معنا که این متغیرها نمی‌توانند به صورت مجدد مقداردهی شوند.

 

خصوصیات در مقابل فیلدها

در جاوا فیلد‌ها وجود دارند. اما در کاتلین به جای فیلد، خصوصیت‌ها (property) وجود دارند. تعریف و استفاده از خصوصیت‌ها مثل فیلد‌های پابلیک جاواست با این تفاوت که خود کاتلین متد‌های get و set را برای ما تعریف می‌کند. (برای val فقط get و برای var هردو). البته همچنان می‌توانید در صورت نیاز نسخه‌های خودمان از این متدها را بنویسیم.

بیشتر خصوصیت‌ها در کالتین، پشتوانه‌ای از نوع فیلد دارند اما می‌توان خصوصیتی تعریف کرد که هربار از روی یک تابع محاسبه شود. در واقع فقط یه متد get دارد بدون اینکه فیلد خاصی را برگرداند. برای مثال کلاسی برای نشان دادن یک «شخص» می‌تواند یک خصوصیت «تاریخ تولد» داشته باشد و یک خصوصیت بدون فیلد (محاسبه‌ای) برای سن.

ایمپورت‌های پیش‌فرض در مقابل ایمپورت‌های صریح

جاوا به صورت ضمنی کلاس‌های داخل پکیج java.lang را ایمپورت می‌کند اما تمام کلاس‌های دیگر باید به صورت صریح ایمپورت شوند. در نتیجه بسیار مرسوم است که در بالای فایل‌های جاوا، چندین خط ایمپورت کلاس‌های مختلف از java.io و java.util ببینیم.

اما در کاتلین علاوه بر  kotlin.* که معادل java.lang.* است، kotlin.io.* و kotlin.collections.* و کلاس‌هایی از پکیج‌های دیگر ایمپورت می‌شوند تا در نتیجه در هر فایل کاتلین، شاهد ایمپورت‌های تکراری کم‌تری باشیم؛ مخصوصا برای کلاس‌هایی که از کالکشن‌ها و IO استاندارد استفاده می‌کنند.

عدم نیاز به new برای سازنده‌

در کاتلین، استفاده از کلیدواژه new برای ساخت شی جدید ضروری نیست. بنابراین کدهای زیر با هم معادل هستند:

 

قالب‌های رشته

رشته‌ها می‌تواند شامل عبارت‌هایی باشند که محاسبه می‌شوند و حاصل آن‌ها در رشته جای می‌گیرد.

یک عبارت درون رشته، با علامت $ شروع می‌شود و شامل نام یک متغیر یا یک عبارت قابل محاسبه درون { } است. قالب‌های رشته می‌توانند باعث کوتاه شدن طول کد شوند زیرا معادل جاوا باید از الحاق رشته استفاده کند.

در این مثال به جای $name و $dept، در زمان اجرا مقادیر متغیرهای name و dept قرار خواهد گرفت.

کلیدواژه‌های extends و implements

برنامه‌نویسان جاوا می‌دانند که یک کلاس جاوا می‌تواند از کلاس دیگر ارث‌بری کند (extends) و یک یا بیشر interface را پیاده‌سازی کند (implements). در کاتلین تفاوت سینتکسی بین این دو وجود ندارد. برای هر دو مورد کاتلین از «دو نقطه» استفاده می‌کند.

 

استثناهای چک‌شده وجود ندارند

استثناهای کاتلین مشابه آن‌چه در جاوا داریم وجود دارند. همچنان می‌توانیم استثناها را پرتاب و دریافت کنیم. اما هیچ استثنایی چک‌شده نیست. به بیان دیگر کامپایلر کاتلین شما را مجبور نمی‌کند که هیچ استثنایی را دریافت یا تصریح کنید.

شکستن به اجزای سازنده (Destructing)

تکنیک destructing را می‌توان به عنوان شکستن یک شی به اجزای سازنده معنی کرد. با یک دستور «شکستن» چند متغیر مختلف با هم تعریف می‌شوند.

در کد زیر چند نمونه از کاربرد‌های «شکستن» را می‌بینیم.

برای مثال اول فرض کنید متغیر student یک شی از نوع Student است.

 

عبارت if قابل تبدیل به مقدار

در کاتلین، if معمولی (statement) مانند آن‌چه در جاوا هست وجود دارد اما همچنین if قابل تبدیل به مقدار (expression) نیز وجود دارد. سینتکس جاوا (مانند سی) برای if قابل تبدیل به مقدار، عملگر سه‌عملوندی ( : ? ) است اما برای خوانایی بیشتر در کاتلین با این نوع if جایگزین شده‌است.

برای مثال کد جاوای زیر

با تبدیل به معادل خود در کاتلین، شفاف‌تر نوشته می‌شود.

اگرچه در اینجا سینتکس کاتلین کمی طولانی‌تر است اما باعث خوانایی بیشتر می‌شود.

(یادداشت نویسنده: در اینجا «if قابل تبدیل به مقدار» همان if expression است و در مقابل if statement آمده که قابل تبدیل به مقدار نیست. در مورد این تفاوت می‌توانید اینجا مطالعه کنید.)

when جایگزین switch

برای من، دوست نداشتنی ترین قابلیت در زبان‌های مشابه C، عبارت switch است.‌ کاتلین عبارت switch را با when جایگزین می‌کند. به مثال زیر دقت کنید. توجه کنید که نیازی به break نیست و به راحتی می‌توان چندین مقدار را برای یک case در نظر بگیرید.

اگر تلاش کنید که عبارت بالا را با امکانات 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

نوشته های مشابه

‫۳ دیدگاه ها

    1. سلام
      حتما از چند ماه قبل در رسانه‌های جاواکاپ (سایت و شبکه‌های اجتماعی) اطلاع‌رسانی خواهد شد.
      در حال حاضر، زمان برگزاری آزمون بعدی قطعی نیست.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا