برنامه نویسی اندروید با کاتلین — راهنمای شروع به کار

۳۲۹ بازدید
آخرین به‌روزرسانی: ۰۱ مهر ۱۴۰۲
زمان مطالعه: ۷ دقیقه
برنامه نویسی اندروید با کاتلین — راهنمای شروع به کار

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

  • کاتلین چیست؟
  • چرا باید از کاتلین در اندروید استفاده کرد؟
  • ساختار درونی کاتلین چگونه است؟
  • جاوا چه تفاوتی با کاتلین دارد؟
  • قابلیت‌های موجود کاتلین کدام هستند؟

کاتلین چیست؟

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

«کاتلین» (Kotlin) یک زبان برنامه‌نویسی چندمنظوره، متن-باز و با نوع‌بندی استاتیک برای JVM، مرورگر، نیتیو و اندروید است که قابلیت‌های برنامه‌نویسی شیءگرا و برنامه‌نویسی تابعی را با هم ترکیب می‌کند.

در جولای سال 2011 میلادی JetBrains از پروژه کاتلین که زبانی برای HVM بود رونمایی کرد و پس از آن نیز یک سال تحت توسعه بود.

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

چرا برنامه نویسی اندروید با کاتلین توصیه می‌شود؟

نام زبان برنامه‌نویسی کاتلین از جزیره‌ای به همین نام در نزدیکی سنت پترزبورگ می‌آید. «آندری بریسلاو» (Andrey Breslav) اعلام کرده است که تیم تصمیم گفته است نام این زبان را همانند جاوا که نام خود را از جزیره‌ای در اندونزی گرفته است، از روی این جزیره اخذ کند.

کاتلین به طور رسمی از سوی گوگل برای توسعه موبایل روی اندروید پشتیبانی می‌شود. از زمان انتشار اندروید استودیو 3.0 در اکتبر 2017، کاتلین به عنوان جایگزین برای کامپایلر استاندارد جاوا در آن گنجانده شده است. کامپایلر کاتلین اندروید به کاربر امکان می‌دهد که بین بایت‌کد سازگار با جاوا 6 یا 8 انتخاب کند.

از 7 می 2019، کاتلین به زبان ترجیحی گوگل برای توسعه اپلیکیشن‌های اندروید تبدیل شده است. یا به زبان ساده‌تر گوگل به توسعه دهندگان می‌گوید بهتر است برنامه نویسی اندروید با کاتلین انجام شود.

  • سازگاری: کاتلین با JDK6 سازگار است، از این رو دستگاه‌های قدیمی از گردونه عقب نمی‌مانند.
  • عملکرد: کاتلین از نظر عملکردی با جاوا برابری می‌کند.
  • هم‌کنش‌پذیری: کاتلین 100% با جاوا از جمله با «حاشیه‌نویسی‌ها» (annotations) همکنش پذیر است.
  • زمان کامپایل: در بیلد‌های تمیز مقداری سربار وجود دارد، اما در بیلدهای افزایشی کمی سریع‌تر است.
  • منحنی یادگیری: یادگیری کاتلین به خصوص برای کسانی که به زبان‌های مدرن عادت دارند، آسان است. مبدل جاوا به کاتلین در IntelliJ یا اندروید استودیو این یادگیری را هر چه بیشتر تسهیل می‌کند. می‌توان از ترکیبی از کاتلین و جاوا نیز در یک پروژه استفاده کرد، بنابراین می‌توانید زمان خود را صرف یادگیری کاتلین بکنید و زمانی که کاملاً مطمئن بودید از آن استفاده عملی بکنید.

ساختار داخلی کاتلین چگونه است؟

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

کد منبع کاتلین به طور معمول در فایل‌هایی با پسوند kt. نگهداری می‌شود. کامپایلر کاتلین کد منبع را آنالیز می‌کند و فایل‌های class. را تولید می‌کند که دقیقاً همانند کاری است که کامپایلر جاوا انجام می‌دهد. در ادامه فایل‌های ‎.class تولید شده، بسته‌بندی‌شده و با استفاده از رویه استاندارد برای نوع اپلیکیشنی که روی آن کار می‌کنید، اجرا می‌شوند.

تفاوت‌های جاوا با کاتلین کدام هستند؟

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

پرینت کردن در کنسول

Java
System.out.print("Amit Shekhar");
System.out.println("Amit Shekhar");

Kotlin
print("Amit Shekhar")
println("Amit Shekhar")

ثابت‌ها و متغیرها

*var (Mutable variable)

*val (Immutable variable)

Java
String name = "Amit Shekhar";
final String name = "Amit Shekhar";

Kotlin
var name = "Amit Shekhar"
val name = "Amit Shekhar"

انواع داده

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

  • Number
  • Character
  • Boolean
  • Array
  • String

انتساب مقدار تهی

Java
String otherName;
otherName = null;

Kotlin
var otherName: String?
otherName = null

بررسی تهی بودن یک مقدار

1Java 
2 if (text != null) { 
3   int length = text.length(); 
4 } 
5 
6Kotlin 
7 text?.let { 
8     val length = text.length 
9 } 
10 // or simply 
11 val length = text?.length

الحاق رشته‌ها

1Java 
2 String firstName = "Amit"; 
3 String lastName = "Shekhar"; 
4 String message = "My name is: " + firstName + " " + lastName; 
5Kotlin 
6 var firstName = "Amit" 
7 var lastName = "Shekhar" 
8 var message = "My name is: $firstName $lastName"

ایجاد خط جدید در یک رشته

1Java 
2 String text = "First Line\n" + 
3               "Second Line\n" + 
4               "Third Line"; 
5Kotlin 
6 val text = """ 
7         |First Line 
8         |Second Line 
9         |Third Line 
10         """.trimMargin()

عملگر سه‌تایی

1Java 
2 
3 String text = x > 5 ? "x > 5" : "x <= 5"; 
4 
5 String message = null; 
6 log(message != null ? Message : ""); 
7 
8Kotlin 
9 val text = if (x > 5) "x > 5" else "x <= 5" 
10 
11 val message: String? = null 
12 log(message ?: "")

عملگرهای بیتی

1Java 
2 final int andResult  = a & b; 
3 final int orResult   = a | b; 
4 final int xorResult  = a ^ b; 
5 final int rightShift = a >> 2; 
6 final int leftShift  = a << 2; 
7 final int unsignedRightShift = a >>> 2; 
8 
9Kotlin 
10 val andResult  = a and b 
11 val orResult   = a or b 
12 val xorResult  = a xor b 
13 val rightShift = a shr 2 
14 val leftShift  = a shl 2 
15 val unsignedRightShift = a ushr 2

بررسی نوع و تبدیل نوع

1Java 
2 if (object instanceof Car) { 
3 } 
4 Car car = (Car) object; 
5 
6Kotlin 
7 if (object is Car) { 
8 } 
9 var car = object as Car 
10 // if object is null 
11 var car = object as? Car  
12 // var car = object as Car?

شرایط چندگانه (Switch Case)

1Java 
2 int score = // some score; 
3 String grade; 
4 switch (score) { 
5 case 10: 
6 case 9: 
7 grade = "Excellent"; 
8 break; 
9 case 8: 
10 case 7: 
11 case 6: 
12 grade = "Good"; 
13 break; 
14 case 5: 
15 case 4: 
16 grade = "OK"; 
17 break; 
18 case 3: 
19 case 2: 
20 case 1: 
21 grade = "Fail"; 
22 break; 
23 default: 
24     grade = "Fail";   
25 } 
26Kotlin 
27 var score = // some score 
28 var grade = when (score) { 
29 9, 10 -> "Excellent" 
30 in 6..8 -> "Good" 
31 4, 5 -> "OK" 
32 in 1..3 -> "Fail" 
33 else -> "Fail" 
34 }

حلقه for

1Java 
2 
3 for (int i = 1; i <= 10 ; i++) { } 
4 
5 for (int i = 1; i < 10 ; i++) { } 
6 
7 for (int i = 10; i >= 0 ; i--) { } 
8 
9 for (int i = 1; i <= 10 ; i+=2) { } 
10 
11 for (int i = 10; i >= 0 ; i-=2) { } 
12 
13 for (String item : collection) { } 
14 
15 for (Map.Entry<String, String> entry: map.entrySet()) { } 
16
17Kotlin 
18 for (i in 1..10) { } 
19 
20 for (i in 1 until 10) { } 
21 
22 for (i in 10 downTo 0) { } 
23 
24 for (i in 1..10 step 2) { } 
25 
26 for (i in 10 downTo 0 step 2) { } 
27 
28 for (item in collection) { } 
29 
30 for ((key, value) in map) { }

کلکسیون‌ها

1Java 
2 final List<Integer> listOfNumber = Arrays.asList(1, 2, 3, 4); 
3 final Map<Integer, String> keyValue = new HashMap<Integer, String>(); 
4 map.put(1, "Amit"); 
5 map.put(2, "Ali"); 
6 map.put(3, "Mindorks"); 
7 // Java 9 
8 final List<Integer> listOfNumber = List.of(1, 2, 3, 4); 
9 final Map<Integer, String> keyValue = Map.of(1, "Amit", 
10                                              2, "Ali", 
11                                              3, "Mindorks"); 
12 
13Kotlin 
14 val listOfNumber = listOf(1, 2, 3, 4) 
15 val keyValue = mapOf(1 to "Amit", 
16                      2 to "Ali", 
17                      3 to "Mindorks")

تعریف متدها

1Java 
2 void doSomething() { 
3    // logic here 
4 } 
5 
6Kotlin 
7 fun doSomething() { 
8    // logic here 
9 }

تعداد آرگومان‌های متغیر

1Java 
2 void doSomething(int... numbers) { 
3    // logic here 
4 } 
5 
6Kotlin 
7 fun doSomething(vararg numbers: Int) { 
8    // logic here 
9 }

تعریف متدها با return

1Java 
2 int getScore() { 
3    // logic here 
4    return score; 
5 } 
6Kotlin 
7 fun getScore(): Int { 
8    // logic here 
9    return score 
10 } 
11 // as a single-expression function 
12 fun getScore(): Int = score 
13 // even simpler (type will be determined automatically) 
14 fun getScore() = score // return-type is Int

قابلیت‌های موجود در کاتلین کدام هستند؟

در این بخش برخی از قابلیت‌هایی که صرفاً در کاتلین وجود دارند را معرفی می‌کنیم.

مقداردهی اولیه با تأخیر (lazy Initialization)

مقداردهی با تأخیر (by lazy) در مواردی که مشغول پیاده‌سازی مشخصه‌های فقط-خواندنی هستیم که به صورت با تأخیر در کاتلین اجرا می‌شوند مفید خواهد بود. by lazy { … } مقداردهی اولیه خود را جایی انجام می‌دهد که مشخصه اولین بار استفاده می‌شود و نه در زمان اعلان کردن آن.

class Demo { val myName: String by lazy { "John" } }

مقداردهی کند

مقداردهی کند متغیرها به این معنی است که توسعه‌دهندگان قبل از دسترسی به متغیر آن را جایی در کد مقداردهی اولیه می‌کنند.

class Demo { val myName: String by lazy { "John" } }

کلاس داده

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

data class Developer(val name: String, val age: Int)

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

  • ()hashCode
  • ()equals
  • ()toString
  • ()copy

کامپایلر به صورت خودکار این موارد را به صورت داخلی ایجاد می‌کند و بدین ترتیب کد تمیزتری خواهیم داشت.

کلاس‌های مهر و موم شده

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

1sealed class Operation { 
2     class Add(val value: Int) : Operation() 
3     class Substract(val value: Int) : Operation() 
4     class Multiply(val value: Int) : Operation() 
5     class Divide(val value: Int) : Operation() 
6 }

تابع‌های اکستنشن

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

1fun Int.triple(): Int { 
2   return this * 3 
3 }

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

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای ۱۴ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
swlh
۱ دیدگاه برای «برنامه نویسی اندروید با کاتلین — راهنمای شروع به کار»

سلام،
لطفا کمکم کنید هر کاری میکنم در اندروید استودیو با زبان کاتلین موفق نمیشم اجرای کد اشیاء رو به طور خودکار داشته باشم.

نظر شما چیست؟

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