مزیت کاتلین بر جاوا در توسعه بک اند و اندروید | به زبان ساده


کاتلین زبان برنامهنویسی متن-بازی است که رفتهرفته در برخی حوزهها در حال جایگزینی جاوا است. در این مقاله قصد داریم برخی ویژگیهای کاتلین را که موجب بهبود زیادی هم در سمت بکاند (Spring Boot) و هم اندروید میشوند با شما به اشتراک بگذاریم. با ما همراه باشید تا با مزیت کاتلین بر جاوا در بکاند و اندروید آشنا شوید.
کاتلین چیست؟
کاتلین یک زبان برنامهنویسی چندمنظوره، اوپن-سورس و با نوعبندی استاتیک است که برای JVM، مرورگر، محیط نیتیو و اندروید عرضه شده است و قابلیتهای برنامهنویسی شیءگرا و تابعی را دارد. نام کاتلین از جزیره کاتلین (Kotlin) در نزدیکی شهر سنت پترزبورگ گرفته شده است. «اندری بریسلاو» (Andrey Breslav) مسئول تیم توسعه کاتلین اعلام کرده است که این تیم تصمیم گرفت نام این زبان را همانند زبان جاوا که از جزیرهای در اندونزی گرفته شده است، از یک جزیره اخذ کند.
- رشد کاتلین از زمان معرفی هر ساله تا سال 2015 شاهد یک رشد دو برابری بوده، تا این که از سال 2015 به بعد یک رشد جهشی را تجربه کرده است.
- گوگل اعلام کرده است که کاتلین به طور رسمی از اندروید پشتیبانی میکند و تعداد زیادی از توسعهدهندگان اندروید شروع به استفاده از کاتلین کردهاند.
- این زبان از سوی ابزار بیلد Gradle پشتیبانی میشود.
- بازیگران قدیمی مانند Spring از کاتلین پشتیبانی میکنند.
بر اساس مطالعات رسمی که از سوی «جتبرینز» اجرا شده است، دو سؤال از توسعهدهندگان کاتلین پرسیده شده که خروجی آن چنین است.
معمولاً بیشتر چه استفادهای از کاتلین دارید؟
تصویر زیر میتواند نشان دهد که توسعهدهندگان عمدتاً چه استفادهای از کاتلین میکنند.
چه عاملی موجب میشود از کاتلین در پروداکشن استفاده نکنید؟
تصویر زیر نیز نشان میدهد که چه زمانی توسعهدهندگان ترجیح میدهند از کاتلین در پروداکشن بهره نگیرند.
به روشنی مشخص است که افراد زیادی شروع به استفاده از کاتلین در محیط پروداکشن کردهاند و دلیل عمده افراد نیز برای عدم استفاده از آن، فقدان دانش است. ما در این مقاله تلاش کردهایم این فقدان دانش را کاهش دهیم و کاری کنیم که افراد در زمان استفاده از کاتلین در محیط پروداکشن حس راحتی بیشتری داشته باشند.
Null Safety یک نعمت است
«امنیت در برابر مقادیر تهی» یا Null Safety یکی از بهترین قابلیتهای زبان کاتلین است. این قابلیت موجب کاهش سربار زیادی در سمت توسعهدهنده میشود و کدی که وی مینویسد امنیت بالایی خواهد داشت. سیستم نوعبندی کاتلین با هدف حذف خطر ارجاع تهی از کد طراحی شده است.
توجه کنید که همچنان میتوانیم در کاتلین فیلدهای تهی (null) داشته باشیم، اما باید با صراحت این موضوع را اعلان کنیم و اگر آن را به درستی مدیریت نکنیم با خطاهای کامپایلر مواجه خواهیم شد.
مشکل «استثنای اشارهگر تهی» (NPE) است که ممکن است به صورت پنهان وارد کد شود. در اغلب موارد اپلیکیشن این مشکل را در زمان اجرا یعنی هنگامی که کاربران در حال استفاده از اپلیکیشن هستند متوجه میشود.
با استفاده از عملگر امنیت .? میتوان به سهولت این تصریح را مدیریت کرد.
جاوا
1 if (text != null) {
2 int length = text.length();
3 }
کاتلین
1 text?.let {
2 val length = text.length
3 }
4 // or simply
5 val length = text?.length
برای مدیریت موارد تهی میتوانی از عملگر الویس یعنی :? استفاده کرد:
1val result = nullableVariable?.someMethodCall()
2 ?: fallbackIfNullMethodCall()
کلاسهای مهر و موم برای سلسله مراتب محدود شده
«کلاسهای مهر و موم» (Sealed Classes) روشی است که کاتلین برای محدودسازی نوع یک کلاس در مواردی که کلاس میتواند انواع مختلفی از میان یک مجموعه محدود انتخاب کند، مورد استفاده قرار میدهد.
1sealed class Operation {
2 class Add(val value: Int) : Operation()
3 class Substract(val value: Int) : Operation()
4}
در ادامه به سادگی از عبارت when برای ارزیابی شرایط برای هر نوع استفاده میکنیم. اگر هر نوعی فراموش شده باشد، کامپایلر این موضوع را گوشزد میکند. این وضعیت موجب کاهش کدهایی میشود که باید نوشته شوند.
1fun execute(x: Int, op: Operation) = when (op) {
2 is Operation.Add -> x + op.value
3 is Operation.Substract -> x - op.value
4}
غالب کدهای بکاند شامل نوعی ردگیری تحلیلی برای پیگیری رفتار کاربران یا سیستم هستند. با استفاده از کلاسهای مهروموم میتوان یک مجموعه رویداد ایجاد کرد که میتوانند تحریک (trigger) شوند و این یک روش مناسب برای اطمینان از وجود قالب منسجم برای رویدادها است. در ادامه از عبارت when استفاده میکنیم تا مطمئن شویم که هیچ کدم از رویدادها در طول زمان کامپایل فراموش نشدهاند.
کاربرد مفید دیگر کلاسهای مهروموم در اندروید برای مدیریت حالتهای UI است. فرض کنید سه حالت برای یک اکتیویتی دارید که شامل بارگذاری، داده و عدم داده میشود. بدین ترتیب میتوانید کلاس مهروموم UIState را ایجاد کرده و آنها را در اکتیویتی مدیریت کنید.
تغییرناپذیری به عنوان تنظیمات پیشفرض
در کاتلین باید همواره از val برای اعلان متغیر استفاده کنیم. این امر موجب ایجاد یک متغیر «تغییرناپذیر» (immutable) میشود. در جاوا باید کلیدواژه اضافی final را به این منظور اضافه میکردیم. اگر واقعاً مجبور باشید که متغیر را تغییر دهید، میتوانید از var نیز استفاده کنید، اما همواره پیش از انجام این کار به دقت موضوع را بررسی کنید.
1val immutableName = "Name"
2immutableName = "New name" // compile error!
3var mutableName = "Name"
4mutableName = "New Name"
به عنوان یک توسعهدهنده زمانی که میبینید متغیرهایتان قرار نیست تغییر پیدا کنند، مگر این که آنها را به ترتیب خاصی تعریف کنید، اعتمادبهنفس بیشتری پیدا میکنید.
کالکشنها در کاتلین درست مانند رفرنس جاوا به صورت پیشفرض تغییرناپذیر هستند. کلاسهای داده نیز تغییرناپذیر هستند.
1val list = listOf(1,2,3,4)
2list.add(1) //compile error.
با این حال همچنان میتوان کالکشنهای تغییرپذیر را با افزودن پیشوند mutable در ابتدای کالکشن اعلان کرد:
1val list = mutableListOf(1,2,3,4)
2list.add(1)
مقداردهی با تأخیر مشخصهها
در کاتلین مادیفایری به نام lateinit وجود دارد که به ما امکان میدهد تا مقداردهی یک متغیر را به تأخیر بیندازیم. این مادیفایر در مواردی بسیار مفید است که وابستگیها از سوی فریمورک تزریق وابستگی (DI) مقداردهی شده باشند و این موضوع در زمان اجرا رخ میدهد.
همچنین این مادیفایر در موارد تست کردن مفید واقع میشود زیرا اغلب کلاسها شبیهسازی میشوند. در مورد Spring Boot نیز که وابستگیها از سوی Spring ارائه میشوند، استفاده از آن مفید خواهد بود.
1@Mock
2lateinit var myRepository: MyRepository
اگر از «داگر» (Dagger) استفاده میکنید ممکن است از قطعه کدهایی مشابه کد زیر استفاده بکنید:
1@Inject
2lateinit var myVar: MyObject
این متغیر در عمل مقداردهی نشده، اما در ادامه تزریق شده است. با استفاده از lateinit میتوانیم مقداردهی آن را به تعویق بیندازیم. این امر موجب کاهش تعداد بررسیهای null غیر ضروری میشود.
نیاز کمتر به کد قالبی
یکی از مهمترین مزیتهای کاتلین نسبت به جاوا همین مسئله کاهش نیاز به استفاده از کدهای قالبی (Boilerplate) است. کاتلین به میزان زیادی کدی که باید نوشته و یا بخوانید را کاهش میدهد. این زبان برای اغلب کاربردها به خوبی طراحی شده است. برای نمونه کلاسهای داده از قبل تابعهای equals ،hashCode ،toString و copy را ارائه کردهاند.
جاوا
1public class Price {
2 String amount;
3 String currency;
4
5 public Price(String amount, String currency) {
6 this.amount = amount;
7 this.currency = currency;
8 }
9
10 public String getAmount() {
11 return amount;
12 }
13
14 public void setAmount(String amount) {
15 this.amount = amount;
16 }
17
18 public String getCurrency() {
19 return currency;
20 }
21
22 public void setCurrency(String currency) {
23 this.currency = currency;
24 }
25}
کاتلین
1data class Price(val amount: String, val currency: String)
چند نکته مهم
- ممکن است در زمان استفاده از Hibernate به همراه کاتلین با چند شکل مواجه شوید، زیرا همه کلاسها به صورت پیشفرض final هستند. برای حل این مشکل باید چند وابستگی و پلاگین را اضافه کنید.
- «سایهسازی نام» (Name shadowing) برخی اوقات میتواند به یک کابوس واقعی تبدیل شود؛ اما در اغلب مورد صرفاً هشدارهایی از سوی کامپایلر هستند. زمانی که کد یک بیش از حد تودرتو شود، خوانایی آن دشوار خواهد شد.
- کاتلین در زمینه کاهش کد قالبی کار خود را به خوبی انجام میدهد و همه چیز منسجم است، اما گاهی اوقات چگالی اطلاعات به شدت بالا میرود.
سخن پایانی درباره مزیت کاتلین بر جاوا
هر چه اپلیکیشنهای بیشتری با کاتلین بنویسید، حس راحتی بیشتری با آن خواهید کرد. کاتلین به شما امکان میدهد که اپلیکیشنها را به روش مؤثرتر و گویاتر و همچنین کدی با طولی کوتاه و خواناتر بنویسید که بسیار لذتبخش است.
با این حال کاتلین نیز مانند هر زبان دیگری، هنگامی که از صفر آغاز میکنید، ممکن است بیگانه به نظر برسد و شما را اذیت کند. در هر صورت کد کاتلین سردرگمی کمی ایجاد میکند و درک اغلب ساختارها کاملاً آسان است.