کاتلین – جایگزین شایسته جاوا

نویسنده : سید ایوب کوکبی ۱۵ فروردین ۱۳۹۷

کاتلین - جایگزین شایسته جاوا

رایج‌ترین زبان برنامه‌نویسی اندروید، جاوا است ولی این به معنای بهترین بودن آن نیست. جاوا زبانی قدیمی، مستعد خطا و با کدهای طویل بوده که تطابقی با دنیای مدرن امروز ندارد. کاتلین (Kotlin) جایگزین ارزشمندی است. توسعه‌دهندگان OpenJDK با ارائه نسخه‌های جدید زبان جاوا (Java 8 & 9) در تلاش هستند تا خلاء موجود را پر کنند اما اندروید هماهنگ با پیشرفت این زبان‌ها از تمام قابلیت‌های آن استفاده نمی‌کند. برنامه‌نویس‌ها هنوز با تاروپود قدیمی نسخه ۶ و ۷ زبان جاوا دست‌وپنجه نرم می‌کنند و ظاهرا به این زودی‌ها هم قصد ندارند آن را ترک کنند. کاتلین آمده است تا قاعده بازی را عوض کند. این زبان متن‌باز نسبتا جدید بر پایه ماشین مجازی جاوا (JVM) بنا شده که در مدت زمان کمی توانسته جایگاهش را میان توسعه‌دهندگان اندروید باز کند.

تعداد دیگری از زبان‌های مبتنی بر JVM که در دنیای اندروید قابل استفاده هستند نیز وجود دارد ولی محبوبیت هیچکدام به پای کاتلین نرسید تا جایشان را در IDE رسمی اندروید استودیو – که به جزء زبان جاوا خبری از زبان‌های دیگر نبود – باز کند طوری که از اندروید استودیو ۳٫۰ به بعد این زبان به صورت رسمی به این IDE اضافه شد و زیر چتر حمایت گوگل قرار گرفت. پس اولین دلیل یادگیری این زبان حمایتی است که از سوی گوگل می‌شود. بعید نیست کاتلین نیز همچون اندروید استودیو که جای اکلیپس را گرفت روزی جایگاه جدش جاوا را بگیرد؛ پس یادگیری و یا لااقل بررسی آن خالی از لطف نیست.

مشکل جاوا چیست؟

احتمالا سال‌ها یا حتی چندین دهه با زبان جاوا کار کرده‌اید و بدون‌شک به خوبی با زیر و بم آن آشنا هستید. اگر کهنه‌کار این زبان هستید بعید نیست که به جزئیات مستند نشده‌ی آن نیز آگاه باشید – چیزهایی که حتی در کتاب‌ها و گفتمان‌های فضای مجازی نیز به دست نمی‌آید بلکه از لابه‌لای تلاشی که نتیجه سال‌ها تجربه بوده به دست آمده است. در این شرایط وقتی دوستی، آشنایی، همکاری، پیشنهاد سوئیچ کردن به زبان جدیدی را مطرح می‌کند طبیعتا جبهه خواهید گرفت. بالاخره آدمی که سال‌ها عمر خود را پای خوب و بد زبانی گذاشته باشد نمی‌تواند خیلی راجت تن به تغییرات جدید بدهد. اکنون ما می‌خواهیم با دلایل پایین شما را دعوت به استفاده از کاتلین کنیم. لااقل دعوت به شروع استفاده از آن…

جاوا قدیمی است؛ خیلی هم قدیمی است

جاوا در دوران اوجش، یکی از کاربردی‌ترین زبان‌ها محسوب می‌شد اما جاوایی که امروز در دنیای اندروید استفاده می‌شود فاقد ویژگی‌های پیشرفته‌ای همچون lambdas, method references, streams, try-with-resources است (minSDK>=19). هنوز هم باید از API قدیمی javax.time – میراث جاوا ۶/۷ استفاده کنیم. البته با کمک برخی از ابزارهای جانبی نظیر RetroLambda، Streams و ThreeTenABP می‌توان به صورت جسته گریخته از این امکانات در کدنویسی استفاده نمود ولی معمولا دردسرهایشان بیشتر از منافع آن‌هاست.

اندروید ۷ یا نوقا (Android Nougat)، تلاش‌های فراوانی برای پشتیبانی از قابلیت‌های جدید جاوا ۸ توسط کامپایلر Jack به انجام رساند اما اغلب این امکانات زمانی قابل استفاده هستند که minSDK را ۲۴ قرار دهید که خیلی از کاربران به خاطر مشکل سازگاری برنامه‌شان با گوشی‌های قدیمی از خیر آن می‌گذرند. برای مشاهده سهم ورژن‌های مختلفِ پلتفرم در میان کاربران این چارت را ببینید.

مستعد خطا است

یکی از معایب جاوا، نحوه هندلینگ مقادیر تهی یا null بوده که معمولا به خطا یا دقیق‌تر بگوییم استثنای مشهور NullPointerException (یا NPE) – مشهور به اشتباه یک میلیارد دلاری منتهی می‌شود.

این خطا را اشتباه یک میلیارد دلاری می‌نامم چرا که بعد از اختراع آن در سال ۱۹۶۵ تعداد بیشماری خطا، آسیب‌پذیری و کرش‌های سیستمی باعث به بار آمدن خسارات و مشقت‌های فراوانی در ۴۰ سال اخیر شده است. سخنرانی تونی هوار – مخترع Null Pointer – در سال ۲۰۰۹

امروزه یکی از رایج‌ترین دلایل کرشِ اپلیکیشن‌های اندرویدی همین NPE ناقلا است. در حقیقت نمی‌شود یک برنامه‌ی اندرویدی نوشت ولی حتی یک‌بار در دام این NullPointer لعنتی نیفتاد. (اگر کسی را سراغ داشتید معرفی کنید؛ خوشحال می‌شویم بشنویم چطور خود را از شر این اکسپشن خانمان‌سوز مصون نگه داشته است).

بخوانید  برنامه‌نویسی پیشرفته اندروید با زبان کاتلین - بخش دوم

از آن بدتر nullability است. Null روشی ساده و کارآمد جهت نمایش فقدان مقدار یک متغیر یا پارامتر است. اندروید به صورت گسترده‌ای داخل API و فریم‌ورکش از مقدار Null استفاده کرده است پس درست نیست که جاوا استفاده از آن را برای توسعه‌دهندگان دشوار سازد. سومین مشکل با این حقیقیت در ارتباط هست که اغلب برنامه‌نویس‌ها، روش جاوا در پیاده‌سازی کلاس‌های تودرتوی غیراستاتیک و کلاس‌های تودرتوی ناشناس که همیشه ارجاعی غیرمستقیم به کلاس والد دارند را نادیده گرفته که این عمل منجر به برجا ماندن نشتی‌های زیادی در حافظه خواهد شد.

در این ویکی، اطلاعات کاملی در مورد معایب طراحی زبان جاوا وجود دارد که ما اینجا قصد نداریم به بررسی همه آن‌ها بپردازیم اما از میان همه مشکلات بیان شده، اجازه دهید به بزرگترین عیب این زبان زیرخاکی اشاره کنیم:

جـــــاوا زبــــانی درازنویــــس و پرتشریفات است

برنامه‌نویس‌ها عاشق کدهای مختصر و تمییز هستند. کد کمتر، زمان کمتری برای نوشتن، زمان کمتری برای خواندن و زمان کمتری برای اشکال‌زدایی لازم دارد. اما جاوا با این خواسته مغایر است. برای ساده‌ترین کارها در جاوا یک عالمه کد باید بنویسید. اگر توسعه‌دهنده اندروید باشید خوب می‌فهمید چه می‌گویم!

از سوی دیگر جاوا عاشق چارچوب‌ها و قواعد سرسختانه است و اندروید نیز بی‌چون‌وچرا این قواعد را به توسعه‌دهندگانش تحمیل می‌کند. برای هر کاری از دسترسی به دیتابیس گرفته تا هندل کردن ترنس‌اکشن فرگمنت‌ها و … ملزم به رعایت شیوه‌نامه‌های مشخصی هستید. کاش راهی وجود می‌داشت که این فرایند را برای شما ساده‌تر می‌کرد. وجود دارد. اسمش کاتلین است؛ زبان کاتلین (Kotlin)؛ جوان است و پرشور؛ و آمده است تا کلید نجات شما از جهنم جاوا باشد.

جاوا اگرچه رایج‌ترین زبان ساخت برنامه‌های اندرویدی است اما به یقیین تنها زبان انجام این کار نیست. کاتلین، دیگر زبان مشهور مبتنی بر JVM بوده که از حمایت بالایی برخوردار است. این زبان متن‌باز و کاملا statically typed است که توسط کمپانی JetBrains به جامعه برنامه‌نویسان عرضه شده است. این شرکت، خالق محبوب‌ترین IDE برنامه‌نویسی اندروید یعنی اندروید استودیو (مبتنی بر IntelliJ) بوده که گوگل به عنوان محیط استاندارد توسعه اندروید برگزیده است. JetBrains با مشاهده رنج و مشقات فراوان روزمره توسعه‌دهندگان اندروید تصمیم گرفت تا با ارائه زبان جدیدش، باری از دوش آن‌ها بردارد. این شرکت به صورت فعالی از این زبان در ساخت و توسعه محصولات دیگرش استفاده می‌کند. بنابراین Kotlin چیزی نیست که تصادفی به وجود آمده باشد و بخواهد با یک باد کنار برود.

از آنجایی که زبان کاتلین با رویکردی پراگماتیک خلق شده است، قابلیت‌هایی همچون سیستم Build، مدیریت بسته و … که پیش‌تر در دنیای متن‌باز با ابزارهایی نظیر گریدل، ماوِن تامین شده‌اند را از نو نساخته است. داشتن یک سیستم Build اختصاصی منجر خواهد شد تا پروژه‌های قبلی که مبتنی بر گریدل وماوِن بوده‌اند بریک شوند.

بخوانید  دوره آموزشی انتشار اپلیکیشن در پلی استور

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

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

خوبی کاتلین چیست؟

۱۰۰% با زبان جاوا سازگار است

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

به عنوان مثال در پروژه‌های بزرگ می‌توان قسمت‌های کوچکی از کدهای رابط کاربری و منطق کد را با کاتلین نوشت. در شروع کار تنها ۵ درصد کدها را با این زبان بنویسید و مابقی را با همان جاوا ادامه دهید. این ۵ درصد را به مرور افزایش دهید تا در دراز مدت کاملا جایگزین زبان جاوا شود. زندگی مسالمت‌آمیز جاوا و کاتلین منفعت بزرگی است که سایر زبان‌های مبتنی بر JVM فاقد آن هستند.

خبری از NullPointerExceptions نیست

این خطا بلای جان توسعه‌دهندگان اندروید است. بخش زیادی از زمان برای اشکال‌زدایی NPEها هدر می‌رود. قسمت‌های زیادی از کد در معرض این خطا هستند و از سویی جلوگیری از بروز آن نیازمند صرف زیادی از انرژی و زمان و طولانی و شلوغ شدن کدهای برنامه خواهد شد. کاتلین یک زبان null safe است؛ یعنی سیستم‌تایپ پیش‌فرض آن امکان انتخاب مقدار تهی یا null نمی‌دهد مگر اینکه صریحا خودتان چنین چیزی را اعلام کنید. این کار جلوی NPEها را به جای زمان اجرا در زمان کامپایل خواهد گرفت.

ببینیم این قابلیت در عمل چطور کار می‌کند؟ به صورت پیش‌فرض، همه متغیرها غیر تهی (non-null) هستند. اگر مقصود شما انتخاب یک متغیر nullable باشد با علامت ؟ این درخواست را به کامپایلر اعلام می‌کنید. فرض کنید یک متغیر رشته‌ای دارید و می‌خواهید مقداری را به آن اختصاص دهید:

String message = “Have a great day”

کد بالا به درستی کار می‌کند. حالا این یکی را امتحان کنید:

String message = null

اینجا کامپایلر به جای پیغام Null can not be a value of a non-null type String خطای کامپایل می‌گیرد. این اتفاق به این دلیل افتاد که همه متغیرها به صورت پیش‌فرض non-null هستند و شما ناچار می‌شوید برای مقدار دهی nul حتما نوع متغییر را با علامت ؟ به صورت nullable اعلام کنید:

String? message = null

اکنون با موفقیت کامپایل صورت می‌گیرد ولی باز هم در هنگام دسترسی به این متغیر باید مراقب باشید. با مکانیزم طراحی شده، بسیار بعید است که وقوع NPE ها تا زمان اجرا به تعویق بیفتد.

کاملا با IDE سازگار است و پشتیبانی خوبی هم می‌شود

با وجود فعالیت‌ها و محصولات عالی شرکت JetBrains جای نگرانی زیادی از بابت حیات کاتلین و آینده پیش‌روی آن وجود ندارد. در اندروید استودو تمام کاری که برای شروع برنامه‌نویسی با زبان کاتلین لازم دارید نصب این افزونه است. برای اکلیپس هم این یکی را نصب کنید. (البته توصیه ما فاصله گرفتن از این IDE قدیمی و دوستی با اندروید استودیو است).

بخوانید  پیش گفتار:چرا من باید برنامه نویس اندروید بشم؟!

تمام قابلیت‌های محیط اندروید استودیو به صورت کامل با زبان کاتلین نیز سازگار است. شما می‌توانید به صورت همزمان از هر دو زبان جاوا و کاتلین برای پروژه‌ی خود استفاده کنید. این در حالی است که برای سایر زبان‌های مبتنی بر JVM چنین سازگاری بی‌نظیری وجود ندارد. یکی دیگر از مزایای نصب این پلاگین، اضافه شدن قابلیت Convert Java File to Kotlin است که با یک کلیک فایل‌های جاوا را به کاتلین تبدیل می‌کند که در ۹۹% موارد هم به درستی این کار را انجام می‌دهد.

کدهای کمتری بنویسید و لبخند بزنید

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

به عنوان مثال به این کد آشنا و معروف که به وفور در برنامه‌های اندرویدی از آن استفاده می‌کنید دقت کنید. یک Click Listener معمولی در جاوا است:

view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Do whatever you want to
}});

حالا همین کد در زبان کاتلین:

view.setOnClickListener { // Do whatever you want to }

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

کاتلین یک زبان سازمانی است نه زبانی برای سرگرمی

کاتلین یک زبان نورسیده خام نیست. این زبان اگرچه تا سال ۲۰۱۵ به صورت عملی در پروژه‌ها استفاده نمی‌شد ولی چند سالی به صورت جدی وارد عرصه برنامه‌نویسی شده است و حمایت رسمی گوگل از آن موجب شده تا افق‌های روشنی را برایش ببینیم. JetBrains این زبان را برای حل مسائل واقعی دنیای برنامه‌نویسی عرضه کرد و برخلاف سایر زبان‌های مبتنی بر JVM، نه از دل مطالعات و پژوهش‌هایی آکادمیک بلکه زبانی عملی است از دل سختی‌های پیش‌روی برنامه‌نویسان جاوا سر درآورده است. این زبان از همان ابتدا با اهداف سازمانی و عملی خلق شده است. همیشه ساخت همه چیز از نو، وسوسه‌انگیز است اما JetBrains با دورنگری و انتخاب صحیح هدف دست به چنین کاری نزد. آن‌ها دنبال ساخت یک زبان انقلابی و خاص نبودند بلکه می‌خواستند زبانی بسازند که مشکلات شناخته شده‌ی توسعه‌دهندگان در سطوح حرفه‌ای و سازمانی را آسان‌تر سازند و به خوبی هم از پس این کار برآمدند.

خودتان امتحان کنید…

کاتلین می‌تواند شیوه‌ی کدنویسی اندروید را کاملا دگرگون ساخته و زندگی را برایتان شیرین‌تر کند. پیشنهاد می‌کنیم استفاده از آن را در دستور کار خود قرار دهید. برای استفاده از این زبان، اندروید استودیو را باز کنید، پلاگین کاتلین را نصب کنید و تمام. اکنون با مطالعه مقالات آموزشی و جستجو در اینترنت تجربه جدید برنامه‌نویسی اندروید را آغاز کنید.

تجربه‌ی استفاده از این زبان را برایمان بنویسید.

سید ایوب کوکبی

نویسنده و مترجم...

0 دیدگاه

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