<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های فرید محمدی</title>
        <link>https://virgool.io/feed/@FaridMohammadi</link>
        <description>برنامه نویس اندروید ، دارای مدرک کارشناسی مهندسی نرم افزار ، برنامه نویس رفاه مارکت و استادیار</description>
        <language>fa</language>
        <pubDate>2026-06-15 07:24:30</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/161298/avatar/czfzww.png?height=120&amp;width=120</url>
            <title>فرید محمدی</title>
            <link>https://virgool.io/@FaridMohammadi</link>
        </image>

                    <item>
                <title>Kotlin In Action بخش سوم فصل اول کتاب</title>
                <link>https://virgool.io/@FaridMohammadi/kotlin-in-action-%D8%A8%D8%AE%D8%B4-%D8%B3%D9%88%D9%85-%D9%81%D8%B5%D9%84-%D8%A7%D9%88%D9%84-%DA%A9%D8%AA%D8%A7%D8%A8-v7woaxa5nlmh</link>
                <description>این فصل را پوشش می دهدتوابع برای کار با مجموعه ها، رشته ها و عبارات منظمبا استفاده از آرگومان های نامگذاری شده ، مقادیر پارامترهای پیش فرض و syntax فراخوانی  infixسازگاری کتابخانه های جاوا به کاتلین از طریق توابع و ویژگی های افزونهساختار کد  با توابع و ویژگی های سطح بالا و localبخش دوم از فصل اول در اینجا مشاهده کنیددر حال حاضر، شما باید راحت باشید برای استفاده از کاتلین به همان روشی که از جاوا استفاده می کنید. شما دیده اید که چگونه مفاهیم آشنای شما از جاوا به کاتلین ترجمه می شوند و چگونه کاتلین اغلب آنها را مختصر و خوانا می کند.در این فصل، خواهید دید که چگونه کاتلین یکی از عناصر کلیدی هر برنامه را بهبود می بخشد: اعلام و فراخوانی توابع. ما همچنین احتمالات سازگاری کتابخانه های جاوا با سبک کاتلین را از طریق استفاده از extension functions بررسی خواهیم کرد، که به شما این امکان را می دهد تا از مزایای کامل کاتلین در پروژه های زبان ترکیبی بهره ببرید.برای اینکه بحثمان مفیدتر و صریح تر شود، روی مجموعه ها، رشته ها و regular expressions کاتلین به عنوان حوزه مشکل خود تمرکز می کنیم. به عنوان مقدمه، بیایید نحوه ایجاد مجموعه در کاتلین را بررسی کنیم.3.1   ایجاد مجموعه در کاتلینقبل از اینکه بتوانید مشغول کار با مجموعه ها شوید، باید نحوه ایجاد آنها را یاد بگیرید. در بخش 2.3.3، شما به راه ایجاد یک مجموعه جدید برخورد کردید: با تابع setOf. شما در آن زمان مجموعه ای از رنگ ها را ایجاد کردید، اما در حال حاضر، اجازه دهید آن را ساده نگه داریم و با اعداد کار کنیم:val set = hashSetOf(1, 7, 53)شما یک لیست یا یک map به روشی مشابه ایجاد می کنید:val list = arrayListOf(1, 7, 53)
val map = hashMapOf(1 to &amp;quotone&amp;quot, 7 to &amp;quotseven&amp;quot, 53 to &amp;quotfifty-three&amp;quot)توجه داشته باشید که to یک ساختار خاص نیست، بلکه یک تابع عادی است. بعداً در فصل به آن باز خواهیم گشت.آیا می توانید کلاس های اشیایی که در اینجا ایجاد می شوند را حدس بزنید؟ مثال زیر را اجرا کنید تا خودتان متوجه این موضوع شوید&gt;&gt;&gt; println(set.javaClass)
class java.util.HashSet
&gt;&gt;&gt; println(list.javaClass)
class java.util.ArrayList
&gt;&gt;&gt; println(map.javaClass)
class java.util.HashMapهمانطور که می بینید، کاتلین از کلاس های مجموعه استاندارد جاوا استفاده می کند. این خبر خوبی برای توسعه دهندگان جاوا است: کاتلین مجموعه کلاس های خاص خود را ندارد. تمام دانش موجود شما در مورد مجموعه های جاوا همچنان در اینجا اعمال می شود.چرا هیچ مجموعه کاتلین وجود ندارد؟ زیرا استفاده از مجموعه های استاندارد جاوا تعامل با کد جاوا را بسیار آسان تر می کند. هنگام فراخوانی توابع جاوا از کاتلین یا بالعکس، نیازی به تبدیل مجموعه ها به این صورت نیست.حتی اگر مجموعه های کاتلین دقیقاً همان کلاس های مجموعه های جاوا هستند، می توانید کارهای بیشتری با آنها در کاتلین انجام دهید. به عنوان مثال، می توانید آخرین عنصر را در یک لیست دریافت کنید یا حداکثر را در مجموعه ای از اعداد بیابید:&gt;&gt;&gt; val strings = listOf(&amp;quotfirst&amp;quot, &amp;quotsecond&amp;quot, &amp;quotfourteenth&amp;quot)
&gt;&gt;&gt; println(strings.last())
fourteenth
&gt;&gt;&gt; val numbers = setOf(1, 14, 2)
&gt;&gt;&gt; println(numbers.max())
14در فصل های آینده، وقتی شروع به صحبت در مورد لامبدا می کنیم، کارهای بیشتری را با مجموعه ها می توانید انجام دهید، اما ما به استفاده از کلاس های مجموعه استاندارد جاوا ادامه خواهیم داد. و در بخش 6.3، نحوه نمایش کلاس های مجموعه جاوا در سیستم نوع کاتلین را خواهید آموخت.قبل از بحث در مورد چگونگی ماندگاری و حداکثر عملکرد توابع جادویی در مجموعه های جاوا، بیایید چند مفهوم جدید برای اعلان یک تابع بیاموزیم.3.2 آسان کردن توابع (functions) برای فراخوانیاکنون که می دانید چگونه مجموعه ای از عناصر را ایجاد کنید، بیایید کاری ساده انجام دهیم: محتویات آن را چاپ کنید. اگر این خیلی ساده به نظر می رسد نگران نباشید. در طول مسیر، با یک سری مفاهیم مهم روبرو خواهید شد.مجموعه های جاوا یک پیاده سازی پیش فرض toString دارند، اما فرمت خروجی ثابت است و همیشه آن چیزی نیست که شما نیاز دارید:&gt;&gt;&gt; val list = listOf(1, 2, 3)
&gt;&gt;&gt; println(list)
[1, 2, 3]تصور کنید که به جای پرانتزهایی که در اجرای پیش فرض استفاده می شود، لازم است عناصر با نقطه ویرگول از هم جدا شوند و با پرانتز احاطه شوند: (1; 2; 3). برای حل این مشکل، پروژه های جاوا از کتابخانه های شخص ثالث مانند Guava و Apache Commons استفاده می کنند یا منطق داخل پروژه را دوباره پیاده سازی می کنند. در کاتلین، یک تابع برای مدیریت این بخش از کتابخانه استاندارد وجود دارد.در این بخش، این تابع را خودتان پیاده سازی خواهید کرد. شما با یک پیاده سازی ساده شروع می کنید که از امکانات کاتلین برای ساده سازی اعلان های عملکرد استفاده نمی کند، و سپس آن را به سبک idiomatic بازنویسی می کنید.تابع joinToString که در ادامه نشان داده شده است، عناصر مجموعه را با یک جداکننده بین آنها، یک پیشوند در ابتدا و یک پسوند در پایان به StringBuilder اضافه می کند.fun &lt;T&gt; joinToString(
  collection: Collection&lt;T&gt;,
  separator: String,
  prefix: String,
  postfix: String
): String {
  val result = StringBuilder(prefix)
  for ((index, element) in collection.withIndex()) {
    if (index &gt; 0) result.append(separator)
    result.append(element)
  }
  result.append(postfix)
  return result.toString()
}تعریف ژنریک generics برای کسانی که اشنایی ندارند : توابع و کلاس های Generic در جاوا (Java)، برنامه نویس را قادر می سازد، تا با تعریف تنها یک تابع، مجموعه ای از توابع مرتبط را، و یا با تعریف تنها یک کلاس، مجموعه ای از کلاس های مرتبط را تحت پوشش قرار دهد.توجه : Generic ها در جاوا، همچنین به برنامه نویس اجازه می دهد نوع داده های نامعتبر را در زمان کامپایل (compile-time) تشخیص دهد، که این موضوع ایمنی نوع داده در زمان کامپایل را فراهم می کند.با استفاده از مفهوم Generic در جاوا، ما ممکن است یک تابع Generic برای مرتب کردن آرایه ای از نوع Object نوشته، و سپس تابع Generic را برای مرتب کردن مقادیر آرایه با آرایه ای از نوع Integer، یا Double، یا String و غیره فراخوانی کنیم.تابع (Function  ) ژنریک  genericاست: روی مجموعه هایی کار می کند که حاوی عناصری از هر نوع داده هستند. syntax برای ژنریک شبیه جاوا است. (بحث مفصل تر در مورد ژنریک موضوع فصل 9 خواهد بود.)بیایید بررسی کنیم که تابع همانطور که در نظر گرفته شده است کار می کند:&gt;&gt;&gt; val list = listOf(1, 2, 3)
&gt;&gt;&gt; println(joinToString(list, &amp;quot &amp;quot, &amp;quot(&amp;quot, &amp;quot)&amp;quot)پیاده سازی (implementation) خوب است، و شما اکثراً آن را همانطور که هست رها می کنید. آنچه ما روی آن تمرکز خواهیم کرد این است: چگونه می توانید آن را تغییر دهید تا تماس های این تابع کمتر پرمخاطب باشد؟ شاید بتوانید هر بار که تابع را فراخوانی می کنید، از ارسال چهار آرگومان اجتناب کنید. بیایید ببینیم چه کاری می توانید انجام دهید.3.2.1      آرگومان های نامگذاری شدهاولین مشکلی که به آن خواهیم پرداخت به خوانایی فراخوانی تابع مربوط می شود. به عنوان مثال، به فراخوانی زیر joinToString نگاه کنید:joinToString(collection, &amp;quot &amp;quot, &amp;quot &amp;quot, &amp;quot.&amp;quot)آیا می توانید بگویید همه این رشته ها با چه پارامترهایی مطابقت دارند؟ آیا عناصر با فضای خالی یا نقطه از هم جدا می شوند؟ پاسخ به این سؤالات بدون نگاه کردن به امضای تابع دشوار است. شاید آن را به خاطر داشته باشید، یا شاید IDE به شما کمک کند، اما از کد فراخوانی مشخص نیست.این مشکل به ویژه در Boolean flags رایج است. برای حل آن، برخی از سبک های کدنویسی جاوا توصیه می کنند به جای استفاده از Booleans، نوع داده enum ایجاد کنید. برخی دیگر حتی از شما می خواهند که نام پارامترها را به صراحت مشخص کنید، مانند مثال زیر:/* Java */
joinToString(collection, /* separator */ &amp;quot &amp;quot, /* prefix */ &amp;quot &amp;quot,
/* postfix */ &amp;quot.&amp;quot);با کاتلین ، می توانید کارهای بهتری انجام دهید:joinToString(collection, separator = &amp;quot &amp;quot, prefix = &amp;quot &amp;quot, postfix = &amp;quot.&amp;quot)هنگام فراخوانی یک تابع نوشته شده در کاتلین، می توانید نام برخی از آرگومان هایی را که به تابع ارسال می کنید، مشخص کنید. اگر نام یک آرگومان را در فراخوانی مشخص می کنید، برای جلوگیری از سردرگمی، باید نام همه آرگومان ها را بعد از آن نیز مشخص کنید.نکته : اگر نام پارامتر تابع فراخوانی شده را تغییر دهید، IntelliJ IDEA می تواند نام آرگومان های نوشته شده را به روز نگه دارد. فقط مطمئن شوید که به جای ویرایش دستی نام پارامترها، از عمل تغییر نام یا تغییر امضا استفاده می کنید.هشدار متأسفانه، هنگام فراخوانی متدهای نوشته شده در جاوا، از جمله متدهایی از JDK و Android framework ، نمی توانید از پارامترهای نام گذاری شده استفاده کنید. ذخیره نام پارامترها در فایل های .class به عنوان یک ویژگی اختیاری فقط با Java 8 پشتیبانی می شود، و کاتلین سازگاری با جاوا 6 را حفظ می کند. در نتیجه، کامپایلر نمی تواند نام پارامترهای استفاده شده در فراخوانی شما را تشخیص دهد و آنها را با method definition مطابقت دهد.آرگومان های نام گذاری شده به ویژه با مقادیر پارامترهای پیش فرض خوب کار می کنند، که در ادامه به آن ها خواهیم پرداخت.3.2.2 مقادیر پارامترهای پیش فرضیکی دیگر از مشکلات رایج جاوا، فراوانی بیش از حد متدهای بارگذاری شده در برخی کلاس ها است. فقط به java.lang.Thread و هشت سازنده آن (http://mng.bz/4KZC) نگاه کنید! overload را می توان به خاطر سازگاری با عقب، برای راحتی کاربران API یا دلایل دیگر ارائه کرد، اما نتیجه نهایی یکسان است: تکراری. نام ها و نوع داده پارامترها بارها و بارها تکرار می شوند، و اگر برنامه نویس خوبی هستید، باید بیشتر مستندات را در هر overload تکرار کنید. در عین حال، اگر overload را فراخوانی کنید که برخی از پارامترها را حذف می کند، همیشه مشخص نیست که چه مقادیری برای آنها استفاده می شود.در کاتلین، اغلب می توانید از ایجاد overloads جلوگیری کنید زیرا می توانید مقادیر پیش فرض پارامترها را در یک اعلان تابع مشخص کنید. بیایید از آن برای بهبود تابع joinToString استفاده کنیم. برای اکثر موارد، رشته ها را می توان با کاما بدون هیچ پیشوند یا پسوندی از هم جدا کرد. بنابراین، بیایید این مقادیر را پیش فرض قرار دهیم.fun &lt;T&gt; joinToString
collection: Collection&lt;T&gt;,
separator: String = &amp;quot, &amp;quot,
prefix: String = &amp;quot&amp;quot,
postfix: String = &amp;quot&amp;quot
): Stringاکنون می توانید تابع را با همه آرگومان ها فراخوانی کنید یا برخی از آنها را حذف کنید:&gt;&gt;&gt; joinToString(list, &amp;quot, &amp;quot, &amp;quot&amp;quot, &amp;quot&amp;quot)
1, 2, 3
&gt;&gt;&gt; joinToString(list)
1, 2, 3
&gt;&gt;&gt; joinToString(list, &amp;quot &amp;quot)
1; 2; 3هنگام استفاده از سینتکس فراخوانی معمولی، باید آرگومان ها را به همان ترتیبی که در اعلان تابع مشخص شده است، مشخص کنید و فقط می توانید آرگومان های انتهایی را حذف کنید. اگر از آرگومان های نام گذاری شده استفاده می کنید، می توانید برخی از آرگومان ها را از وسط فهرست حذف کنید و فقط آن هایی را که نیاز دارید، به ترتیبی که می خواهید مشخص کنید:&gt;&gt;&gt; joinToString(list, suffix = &amp;quot&amp;quot, prefix = &amp;quot# &amp;quot)
# 1, 2, 3;توجه داشته باشید که مقادیر پیش فرض پارامترها در تابعی که فراخوانی می شود، کدگذاری می شوند، نه در محل تماس. اگر مقدار پیش فرض را تغییر دهید و کلاس حاوی تابع را دوباره کامپایل کنید، تماس گیرندگانی که مقداری برای پارامتر تعیین نکرده اند شروع به استفاده از مقدار پیش فرض جدید می کنند.مقادیر پیش فرض و جاوابا توجه به اینکه جاوا مفهوم مقادیر پارامترهای پیش فرض را ندارد، هنگام فراخوانی یک تابع Kotlin با مقادیر پارامترهای پیش فرض از جاوا، باید تمام مقادیر پارامتر را به صراحت مشخص کنید. اگر از جاوا تابعی می خواهید فراخوانی کنید شما میتوانید با استفاده از حاشیه نویسی @JvmOverloads آن را برای تماس گیرندگان جاوا آسان تر کنید. این به کامپایلر دستور می دهد تا متدهای بارگذاری شده جاوا را تولید کند و هر یک از پارامترها را یکی یکی حذف کند و از آخرین مورد شروع شود.به عنوان مثال، اگر joinToString را با @JvmOverloads حاشیه نویسی کنید، اضافه بارهای زیر ایجاد می شوند./* Java */
String joinToString(Collection&lt;T&gt; collection, String separator,
String prefix, String postfix);

String joinToString(Collection&lt;T&gt; collection, String separator,
String prefix);

String joinToString(Collection&lt;T&gt; collection, String separator);
String joinToString(Collection&lt;T&gt; collection);هر اضافه بار از مقادیر پیش فرض پارامترهایی استفاده می کند که از امضا حذف شده اند.تا کنون، بدون توجه context اطراف، روی function کاربردی خود کار کرده اید. مطمئناً باید روشی از کلاسی باشد که در فهرست های مثال نشان داده نشده است، درست است؟ در واقع، کاتلین این را غیر ضروری می کند3.2.3  خلاص شدن از شر کلاس ابزارهای استاتیک: توابع و properties های سطح بالاهمه ما می دانیم که جاوا، به عنوان یک زبان شی گرا، نیاز دارد که همه ی کدها به عنوان متدهای کلاس ها نوشته شوند. معمولا، این کار به خوبی انجام می شود. اما در واقعیت، هر پروژه بزرگ با تعداد زیادی کد به پایان می رسد که به هیچ کلاسی تعلق ندارد. گاهی اوقات یک operation با objects از دو کلاس متفاوت کار می کند که نقش به همان اندازه برای آن مهم است. گاهی اوقات یک شی اصلی وجود دارد، اما نمی خواهید API آن را با اضافه کردن operation به عنوان یک method ، پر کنید.در نتیجه، شما با کلاس هایی مواجه می شوید که شامل هیچ state یا method نیستند و به عنوان محفظه هایی برای دسته ای از متدهای استاتیک عمل می کنند. یک مثال کامل، کلاس Collections در JDK است. برای پیداکردن نمونه های دیگر در کد خود، به دنبال کلاس هایی بگردید که Util را به عنوان بخشی از نام دارند.در Kotlin، شما نیازی به ایجاد تمام آن کلاس های بی معنی ندارید. در عوض، می توانید توابع را مستقیماً یک فایل منبع در سطح بالا ، خارج از هر کلاسی قرار دهید. چنین توابعی هنوز عضو package هستند که در بالای فایل اعلام شده است، و اگر می خواهید آنها را از package های دیگر فراخوانی کنید، باید آنها را وارد کنید، اما سطح اضافی تودرتو دیگر وجود ندارد.بیایید تابع joinToString را مستقیماً در بسته رشته ها قرار دهیم. یک فایل به نام join.kt با محتویات زیر ایجاد کنید.package strings
fun joinToString(...): String { ... }این کد چگونه اجرا می شود؟ می دانید که وقتی فایل را کامپایل می کنید، برخی از کلاس ها تولید می شوند، زیرا JVM فقط می تواند کد را در کلاس ها اجرا کند. وقتی فقط با Kotlin کار می کنید، این تنها چیزی است که باید بدانید. اما اگر نیاز به فراخوانی چنین تابعی از جاوا دارید، باید نحوه کامپایل شدن آن را بدانید. برای روشن شدن این موضوع، اجازه دهید به کد جاوا که در همان کلاس کامپایل می شود نگاه کنیم:/* Java */
package strings;
public class JoinKt {
  public static String joinToString(...) { ... }
}نام کلاس تولید شده توسط کامپایلر Kotlin با نام فایل که حاوی تابع اس مطابقت دارد. تمام توابع سطح بالا در فایل به متدهای ثابت آن کلاس کامپایل می شوند. بنابراین، فراخوانی این تابع از جاوا به آسانی فراخوانی هر روش استاتیک دیگر است:/* Java */
import strings.JoinKt;
...
JoinKt.joinToString(list, &amp;quot, &amp;quot, &amp;quot&amp;quot, &amp;quot&amp;quot);تغییر نام کلاس فایلبرای تغییر نام کلاس تولید شده که حاوی توابع سطح بالای Kotlin است، یک حاشیه نویسی @JvmName به فایل اضافه می کنید. آن را در ابتدای فایل، قبل از نام بسته قرار دهید:@file:JvmName(&amp;quotStringFunctions&amp;quot)
package strings
fun joinToString(...): String { ... }حالا تابع را می توان به صورت زیر فراخوانی کرد:/* Java */
import strings.StringFunctions;
StringFunctions.joinToString(list, &amp;quot, &amp;quot, &amp;quot&amp;quot, &amp;quot&amp;quot);بحث مفصلی در مورد نحو حاشیه نویسی بعداً در فصل 10 ارائه می شود.PROPERTIES  های سطح بالادرست مانند توابع، PROPERTIES  ها را می توان در بالای یک فایل قرار داد. ذخیره تک تک داده ها در خارج از یک کلاس اغلب مورد نیاز نیست، اما همچنان مفید است.به عنوان مثال، می توانید از یک ویژگی var برای شمارش تعداد دفعاتی که برخی از عملیات انجام شده است استفاده کنید:var opCount = 0
fun performOperation() {
     opCount++
     // ...
}
fun reportOperationCount() {
     println(&amp;quotOperation performed $opCount times&amp;quot)
}مقدار چنین ویژگی در یک فیلد ثابت ذخیره می شود.ویژگی های سطح بالا همچنین به شما اجازه می دهد تا در کد خود ثابت ها را تعریف کنید:val UNIX_LINE_SEPARATOR = &amp;quot\n&amp;quotبه طور پیش فرض، ویژگی های سطح بالا، درست مانند هر ویژگی دیگر، درکد جاوا به عنوان متدهای دسترسی هستند (یک گیرنده برای ویژگی val و یک جفت getter/setter برای یک ویژگی var).const val UNIX_LINE_SEPARATOR = &amp;quot\n&amp;quotاین معادل کد جاوا زیر را به شما می دهد:/* Java */
public static final String UNIX_LINE_SEPARATOR = &amp;quot\n&amp;quotشما عملکرد اولیه joinToString را بسیار بهبود بخشیده اید. حالا بیایید ببینیم که چگونه آن را حتی ساده تر کنیم.3.3  افزودن متدها به کلاس های دیگر:توسعه توابع و ویژگیهایکی از موضوعات اصلی Kotlin هموار کردن ادغام کدها با کدهای موجود است. حتی پروژه های خالص Kotlin بر روی کتابخانه های جاوا مانند JDK، فریمورک اندروید و سایر فریمورک هایی که توسط سایر برنامه نویسان ساخته می شوند. و هنگامی که کاتلین را در یک پروژه جاوا ادغام می کنید، با کدهای موجود نیز سر و کار دارید که به کاتلین تبدیل نشده یا نخواهند شد. آیا بهتر نیست که بتوانیم از تمام ویژگی های کاتلین هنگام کار با آن API ها استفاده کنیم، بدون اینکه نیازی به بازنویسی آن ها باشد؟ این همان چیزی است که extension functions به شما اجازه انجام آن را می دهند.از نظر مفهومی، یک extension function چیز ساده ای است: تابعی است که می تواند به عنوان عضوی از یک کلاس فراخوانی شود اما خارج از آن تعریف شده است. برای نشان دادن آن، بیایید روشی برای محاسبه آخرین کاراکتر یک رشته اضافه کنیم:package strings
fun String.lastChar(): Char = this.get(this.length - 1)تنها کاری که باید انجام دهید این است که نام کلاس یا interface را قبل از نام تابعی که اضافه می کنید قرار دهید.این نام کلاس receiver type نامیده می شود. مقداری که extension function را روی آن فراخوانی می کنید، receiver object نامیده می شود. این در شکل 3.1 نشان داده شده است.شکل 3.1  receiver type  نوعی است که پسوند بر روی آن تعریف شده است و receiver object  نمونه ای از آن نوع است.می توانید تابع را با استفاده از همان function که برای اعضای کلاس معمولی استفاده می کنید فراخوانی کنید:&gt;&gt;&gt; println(&amp;quotKotlin&amp;quot.lastChar())
nدر این مثال، String نوع گیرنده و &quot;Kotlin&quot; شی گیرنده است.به یک معنا، شما متد خود را به کلاس String اضافه کرده اید. اگرچه String بخشی از کد شما نیست و حتی ممکن است کد منبع آن کلاس را نداشته باشید، ولی می توانید آن را با methodهایی که در پروژه خود نیاز دارید گسترش دهید. حتی مهم نیست که String به جاوا، کاتلین یا زبان JVM دیگری مانند Groovy نوشته شده باشد. تا زمانی که در یک کلاس جاوا کامپایل شده است، می توانید پسوندهای خود را به آن کلاس اضافه کنید.در بدنه یک extension function ، شما از آن همانطور که در یک متد استفاده می کنید استفاده کنید. و مانند یک روش معمولی، می توانید آن را حذف کنید:package string
fun String.lastChar(): Char = get(length - 1)در extension function ، می توانید مستقیماً به متدها و ویژگی های کلاسی که در حال گسترش آن هستید دسترسی داشته باشید، مانند متدهایی که در خود کلاس تعریف شده است. توجه داشته باشید که extension function به شما اجازه نمی دهند encapsulation را بشکنید. برخلاف متدهای تعریف شده در کلاس، extension function به اعضای خصوصی یا محافظت شده کلاس دسترسی ندارند.بعداً از متد هم برای اعضای کلاس و هم برای extension function استفاده خواهیم کرد. به عنوان مثال، می توان گفت که در بدنه extension function می توانید هر متدی را در receiver فراخوانی کنید، به این معنی که می توانید هم اعضا و هم extension function را فراخوانی کنید. در محل فراخوانی، extension function از اعضا قابل تشخیص نیستند، و اغلب فرقی نمی کند که روش خاص یک عضو باشد یا یک extension .3.3.1      Importها و extension functionsوقتی یک extension function را تعریف می کنید، به طور خودکار در کل پروژه شما در دسترس قرار نمی گیرد. در عوض، مانند هر کلاس یا تابع دیگری، باید وارد شود. این به جلوگیری از تضاد نام تصادفی کمک می کند. Kotlin به شما امکان می دهد توابع جداگانه را با استفاده از همان syntax که برای کلاس ها استفاده می کنید وارد کنید:import strings.lastChar
val c = &amp;quotKotlin&amp;quot.lastChar()البته ، * imports نیز کار می کند:import strings.*
val c = &amp;quotKotlin&amp;quot.lastChar()می توانید نام کلاس یا تابعی را که وارد می کنید با استفاده از کلمه کلیدی as تغییر دهید:import strings.lastChar as last
val c = &amp;quotKotlin&amp;quot.last()تغییر نام در هنگام import زمانی مفید است که چندین تابع با یک نام در package های مختلف دارید و می خواهید از آنها در یک فایل استفاده کنید. برای کلاس ها یا توابع معمولی، یک انتخاب دیگر دارید: می توانید از یک نام کاملاً واجد شرایط برای اشاره به کلاس یا تابع استفاده کنید. برای extension function ، سیتکس از شما می خواهد که از نام کوتاه استفاده کنید، بنابراین کلمه کلیدی as در دستور import تنها راه حل است.3.3.2      فراخوانی extension functions از جاوادر پس زمینه، یک extension function یک روش ثابت است که receiver object را به عنوان اولین آرگومان خود می پذیرد. فراخوانی آن مستلزم ایجاد اشیاء آداپتور یا overhead زمان اجرا دیگری نیست.این کار استفاده از extension functions از جاوا را بسیار آسان می کند: شما متد استاتیک را فراخوانی می کنید و نمونه receiver object را ارسال می کنید. درست مانند سایر توابع سطح بالا، نام کلاس جاوا حاوی متد از نام فایلی که تابع در آن اعلان شده است تعیین می شود. فرض کنید در یک فایل StringUtil.kt اعلام شده است:/* Java */
char c = StringUtilKt.lastChar(&amp;quotJava&amp;quot);این extension functions به عنوان یک تابع سطح بالا اعلام شده است، بنابراین به یک روش ایستا کامپایل می شود. شما می توانید متد lastChar را به صورت ایستا از جاوا وارد کنید و استفاده از آن را به (&quot;جاوا&quot;)lastChar ساده کنید. این کد تا حدودی کمتر از نسخه Kotlin قابل خواندن است، اما از نظر جاوا قابل خواندن نیست.3.3.3      ابزار functions مثل extensions استاکنون می توانید نسخه نهایی تابع joinToString را بنویسید. این تقریباً همان چیزی است که در کتابخانه استاندارد Kotlin پیدا خواهید کردfun &lt;T&gt; Collection&lt;T&gt;.joinToString(
separator: String = &amp;quot, &amp;quot,
prefix: String = &amp;quot&amp;quot,
postfix: String = &amp;quot&amp;quot
): String {
val result = StringBuilder(prefix)
for ((index, element) in this.withIndex())
if (index &gt; 0) result.append(separator)
result.append(element)
}
result.append(postfix)
return result.toString()
}
&gt;&gt;&gt; val list = listOf(1, 2, 3)
&gt;&gt;&gt; println(list.joinToString(separator = &amp;quot &amp;quot,
... prefix = &amp;quot(&amp;quot, postfix = &amp;quot)&amp;quot))
(1; 2; 3)شما آن extension را برای مجموعه ای از عناصر قرار می دهید و مقادیر پیش فرض را برای همه آرگومان ها ارائه می دهید. اکنون می توانید joinToString را مانند عضوی از یک کلاس فراخوانی کنید:&gt;&gt;&gt; val list = arrayListOf(1, 2, 3)
&gt;&gt;&gt; println(list.joinToString(&amp;quot &amp;quot))
1 2 3از آنجایی که extension functions به طور مؤثر یک  syntactic شیرینیه که در فراخوانی متد ایستا هستند، می توانید از نوع خاص تری به عنوان receiver type استفاده کنید، نه فقط یک کلاس. فرض کنید می خواهید یک تابع join داشته باشید که فقط در مجموعه ای از stringها فراخوانی شود.fun Collection&lt;String&gt;.join(
     separator: String = &amp;quot, &amp;quot,
     prefix: String = &amp;quot&amp;quot,
     postfix: String = &amp;quot&amp;quot
) = joinToString(separator, prefix, postfix)

&gt;&gt;&gt; println(listOf(&amp;quotone&amp;quot, &amp;quottwo&amp;quot, &amp;quoteight&amp;quot).join(&amp;quot &amp;quot))
one two eightفراخوانی این تابع با لیستی از اشیاء از نوع دیگر کار نخواهد کرد:&gt;&gt;&gt; listOf(1, 2, 8).join()
Error: Type mismatch: inferred type is List&lt;Int&gt; but Collection&lt;String&gt;
was expected.extensions ایستا به این معنی است که extension functions را نمی توان در کلاس های فرعی نادیده گرفت. بیایید به یک مثال نگاه کنیم.3.3.4     برای extension functions هیچ بازنویسی(overrid) وجود نداردمتد overriding در Kotlin برای توابع عضو طبق معمول کار می کند، اما شما نمی توانید یک extension function را بازنویسی(overrid) کنید. فرض کنید شما دو کلاس دارید، View و زیر کلاس آن Button، و کلاس Button تابع کلیک را از superclass بازنویسی(overrid) می کند.open class View {
     open fun click() = println(&amp;quotView clicked&amp;quot)
}
class Button: View() {
     override fun click() = println(&amp;quotButton clicked&amp;quot)
}اگر متغیری از نوع View را اعلام کنید، می توانید مقداری از نوع Button را در آن متغیر ذخیره کنید، زیرا Button زیرنوع(subtype) View است. اگر یک متد معمولی مانند کلیک را بر روی این متغیر فراخوانی کنید و آن متد در کلاس Button بازنویسی(overrid) شود، پیاده سازی overrid شده از کلاس Button استفاده خواهد شد:&gt;&gt;&gt; val view: View = Button()
&gt;&gt;&gt; view.click()
Button clickedاما همانطور که در شکل 3.2 نشان داده شده است، برای روش های extensions  کار نمی کند.extension function ها بخشی از کلاس نیستند. آنها به صورت خارجی به آن اعلام شده اند. حتی اگر می توانید extension function را با همان نام و نوع پارامتر برای یک کلاس پایه و زیر کلاس آن تعریف کنید، تابعی که فراخوانی می شود به نوع استاتیک اعلام شده متغیر بستگی دارد، نه به نوع زمان اجرا مقدار ذخیره شده در آن متغیر.مثال زیر دو extension functions  را نشان می دهد که در کلاس های View و Button اعلام شده اند.fun View.showOff() = println(&amp;quotI&#039;m a view!&amp;quot)
fun Button.showOff() = println(&amp;quotI&#039;m a button!&amp;quot)
&gt;&gt;&gt; val view: View = Button()
&gt;&gt;&gt; view.showOff()
I&#039;m a view!وقتی showOff را روی متغیری از نوع View فراخوانی می کنید، extension مربوطه فراخوانی می شود، حتی اگر نوع واقعی مقدار Button باشد.اگر به یاد داشته باشید که یک extension functions  به یک تابع ثابت در جاوا با گیرنده به عنوان اولین آرگومان کامپایل شده است، این رفتار باید برای شما واضح باشد، زیرا جاوا تابع را به همین ترتیب انتخاب می کند:/* Java */
&gt;&gt;&gt; View view = new Button();
&gt;&gt;&gt; ExtensionsKt.showOff(view);
I&#039;m a view!همانطور که می بینید، overrid برای extension function اعمال نمی شود: Kotlin آنها را به صورت ایستا حل می کند.نکته : اگر کلاس دارای یک تابع عضو با امضای یک extension function باشد، تابع عضو همیشه اولویت دارد. هنگام گسترش API کلاس ها باید این را در نظر داشته باشید: اگر یک تابع عضو با امضای مشابه به عنوان extension function که کاربر کلاس شما تعریف کرده است اضافه کنید و سپس آنها کد خود را دوباره کامپایل کنند، معنی آن تغییر می کند و با اشاره به تابع عضو جدید شروع می شود.ما در مورد چگونگی ارائه متد های اضافی برای کلاس های خارجی بحث کرده ایم. حال بیایید ببینیم که چگونه می توان همین کار را با properties انجام داد.3.3.5      ویژگی های Extensionویژگی های extension راهی برای گسترش کلاس ها با API ارائه می دهد که می توان با استفاده از syntax ویژگی(property) به جای syntax تابع به آنها دسترسی داشت. حتی اگر به آنها ویژگی(properties) بگن، نمی توانند هیچ حالتی داشته باشند، زیرا مکان مناسبی برای ذخیره آن وجود ندارد: اضافه کردن فیلدهای اضافی به نمونه های موجود از اشیاء جاوا امکان پذیر نیست. اما syntax کوتاهتر هنوز هم گاهی اوقات مفید استدر قسمت قبل، تابع lastChar را تعریف کردید. حالا بیایید آن را به یک ویژگی(property) تبدیل کنیمval String.lastChar: Char
get() = get(length - 1)ی نید ببینید که مثل توابع، یک ویژگی extension مانند یک ویژگی معمولی با یک نوع گیرنده(receiver) به نظر می رسد. دریافت کننده(get) همیشه باید تعریف شود، زیرا هیچ فیلد پشتیبان و گیرنده(get) پیش فرضی وجود ندارد. مقدار دهی اولیه نشدند به همین دلیل مجاز نیستند: جایی برای ذخیره مقدار مشخص شده به عنوان مقدار اولیه وجود ندارد.اگر همان خاصیت را در StringBuilder تعریف کنید، می توانید آن را var کنید، زیرا محتویات یک StringBuilder قابل تغییر است.var StringBuilder.lastChar: Char
  get() = get(length - 1)
  set(value: Char) {
    this.setCharAt(length - 1, value)
}شما دقیقاً مانند ویژگی های عضو به ویژگی های افزونه دسترسی دارید:&gt;&gt;&gt; println(&amp;quotKotlin&amp;quot.lastChar)
n
&gt;&gt;&gt; val sb = StringBuilder(&amp;quotKotlin?&amp;quot)
&gt;&gt;&gt; sb.lastChar = &#039;!&#039;
&gt;&gt;&gt; println(sb)
Kotlin!توجه داشته باشید که وقتی نیاز به دسترسی به یک ویژگی extension از جاوا دارید، باید دریافت کننده آن را به طور واضح فراخوانی کنید: StringUtilKt.getLastChar(&quot;Java&quot;).ما در مورد مفهوم extensions ها به طور کلی بحث کرده ایم. اکنون اجازه دهید به مبحث مجموعه ها برگردیم و به چند function کتابخانه دیگر که به شما در مدیریت آنها کمک می کنند و همچنین ویژگی های زبانی که در آن توابع ارائه می شوند نگاهی بیندازیم.3.4  کار با مجموعه ها: varargs، فراخوانی infix و پشتیبانی از کتابخانهاین بخش برخی از functions های کتابخانه استاندارد Kotlin را برای کار با مجموعه ها نشان می دهد. در طول مسیر، چند ویژگی زبان مرتبط را شرح می دهد:کلمه کلیدی vararg که به شما امکان می دهد تابعی را با تعداد دلخواه آرگومان اعلام کنیدیک نماد infix که به شما امکان می دهد برخی از توابع تک آرگومان را بدون مراسم فراخوانی کنیداعلان های تخریب ساختار که به شما امکان می دهد یک مقدار ترکیبی واحد را در چندین متغیر باز کنید3.4.1 گسترش API مجموعه های جاواما این فصل را با این ایده شروع کردیم که مجموعه ها در کاتلین همان کلاس های جاوا هستند، اما با یک API توسعه یافته. بعنوان مثال دریافت آخرین عنصر در لیست و یافتن بزرگترین عدد در مجموعه ای از اعداد را مشاهده کردید:&gt;&gt;&gt; val strings: List&lt;String&gt; = listOf(&amp;quotfirst&amp;quot, &amp;quotsecond&amp;quot, &amp;quotfourteenth&amp;quot)
&gt;&gt;&gt; strings.last()
fourteenth
&gt;&gt;&gt; val numbers: Collection&lt;Int&gt; = setOf(1, 14, 2)
&gt;&gt;&gt; numbers.max()
14ما به نحوه عملکرد آن علاقه مند بودیم: چرا می توان کارهای زیادی را با مجموعه ها در Kotlin انجام داد، حتی اگر آنها نمونه هایی از کلاس های کتابخانه جاوا هستند. اکنون پاسخ باید واضح باشد: توابع last و max به عنوان  extension functions اعلام می شوند!آخرین تابع پیچیده تر از lastChar برای String نیست، که در بخش قبل مورد بحث قرار گرفت: این یک extension در کلاس List است. حداکثر، یک اعلان ساده نشان می دهیم (function کتابخانه واقعی نه تنها برای اعداد Int، بلکه برای هر عنصر قابل مقایسه کار می کند):fun &lt;T&gt; List&lt;T&gt;.last(): T { /* returns the last element */ }
fun Collection&lt;Int&gt;.max(): Int { /* finding a maximum in a collection */ }بسیاری از extension functions در کتابخانه استاندارد Kotlin نوشته شده اند و ما همه آنها را در اینجا فهرست نمی کنیم. ممکن است در مورد بهترین راه برای یادگیری همه چیز در کتابخانه استاندارد Kotlin تعجب کنید. شما مجبور نیستید کل کتابخانه کاتلین را بلد باشید هر زمان نیاز به انجام کاری با یک مجموعه یا هر شی دیگری داشتید خود IDE در تکمیل کد به شما کمک میکند تمام توابع موجود برای آن نوع شی را به شما نشان می دهد. این فهرست شامل متدهای معمولی و extension functions است. می توانید function مورد نیاز خود را انتخاب کنید. علاوه بر آن، مرجع استاندارد کتابخانه تمام متد های موجود برای هر کلاس کتابخانه را فهرست می کند - اعضا و همچنین extension ها.در ابتدای فصل، توابع ایجاد مجموعه ها را نیز مشاهده کردید. یک ویژگی مشترک این توابع این است که می توان آنها را با تعداد دلخواه آرگومان فراخوانی کرد. در بخش زیر، سینتکسی را برای اعلان چنین توابعی را توضیح خواهیم داد.3.4.2      Varargs  : توابعی که تعداد دلخواهی از آرگومان ها را می پذیرندهنگامی که یک تابع را برای ایجاد یک لیست فراخوانی می کنید، می توانید هر تعداد آرگومان را به آن ارسال کنید:val list = listOf(2, 3, 5, 7, 11)اگر به نحوه اعلان این تابع در کتابخانه نگاه کنید، موارد زیر را خواهید دید:fun listOf&lt;T&gt;(vararg values: T): List&lt;T&gt; { ... }احتمالاً با varargs جاوا آشنا هستید: ویژگی که به شما امکان می دهد تعداد دلخواه از مقادیر را با packing آنها در یک آرایه به یک متد ارسال کنید. Varargsهای کاتلین شبیه به جاوا هستند، اما syntax انها کمی متفاوت است: به جای سه نقطه بعد از نوع، کاتلین از vararg modifier روی پارامتر استفاده می کند.یکی دیگر از تفاوت های کاتلین و جاوا، syntax فراخوانی تابع که چه زمانی آرگومان ها نیاز به  ارسال قبل از packed  در یک آرایه دارند. در جاوا، آرایه را همانطور که هست ارسال می کنید، در حالی که کاتلین از شما می خواهد که به صراحت آرایه را باز کنید، به طوری که هر عنصر آرایه به یک آرگومان جداگانه برای تابع فراخوانی شده تبدیل شود. از نظر فنی، این ویژگی با استفاده از عملگر spread (سه نقطه) نامیده می شود، اما در عمل به سادگی قرار دادن آن است* کاراکتر قبل از آرگومان مربوطه:fun main(args: Array&lt;String&gt;) {
val list = listOf(&amp;quotargs: &amp;quot, *args)
println(list)
}این مثال نشان می دهد که عملگر spread به شما امکان می دهد مقادیر یک آرایه و برخی مقادیر ثابت را در یک فراخوانی ترکیب کنید. این در جاوا پشتیبانی نمی شود.حالا بریم سراغ map ها. ما به طور خلاصه روش دیگری برای بهبود خوانایی فراخوانی تابع Kotlin را مورد بحث قرار خواهیم داد: فراخوانی infix3,4,3     کار با pairs : فراخوانی infix و اعلان های تخریب ساختار(destructuring)برای ایجاد نقشه ها، از تابع map Of استفاده می کنید:val map = mapOf(1 to &amp;quotone&amp;quot, 7 to &amp;quotseven&amp;quot, 53 to &amp;quotfifty-three&amp;quot)این زمان خوبی است تا توضیح دیگری را که در ابتدای فصل به شما قول داده بودیم ارائه دهیم. کلمه to در این خط کد یک ساختار داخلی نیست، بلکه یک فراخوانی متد از نوع خاصی است که infix call نامیده می شود.در فراخوانی infix ، نام متد بلافاصله بین نام شی هدف و پارامتر بدون جدا کننده اضافی قرار می گیرد. مثل دو فراخوانی زیر هستند:فراخوانی Infix را می توان با متد های معمولی و extension functions که یک پارامتر مورد نیاز دارند، استفاده کرد. برای اینکه یک تابع با استفاده از نماد infix فراخوانی شود، باید آن را با اصلاح کننده infix علامت گذاری کنید. در اینجا یک مثال ساده از اعلان تابع to میزنیم:infix fun Any.to(other: Any) = Pair(this, other)تابع to نمونه ای از Pair را برمی گرداند، که یک کلاس کتابخانه استاندارد Kotlin است ، عنصر pair را نشان می دهد. اعلانات واقعی Pair و استفاده از generics ها، اما ما آنها را در اینجا حذف می کنیم تا همه چیز ساده باشد.توجه داشته باشید که می توانید مستقیماً دو متغیر را با محتویات یک Pair مقداردهی اولیه کنید:val (number, name) = 1 to &amp;quotone&amp;quotبه این ویژگی یک اعلان تخریبی می گویند. شکل 3.3 نحوه کار با Pair را نشان می دهد.شکل 3.3 شما یک جفت با استفاده از تابع to ایجاد می کنید و آن را با یک اعلان ساختارشکن باز می کنید.ویژگی اعلان تخریب ساختار به pair محدود نمی شود. به عنوان مثال، شما همچنین می توانید دو متغیر کلید(key) و مقدار(value) را با محتویات یک ورودی نقشه مقداردهی اولیه کنید.همانطور که در اجرای joinToString که از تابع withIndex استفاده می کند، این کار با حلقه ها نیز کار می کند:for ((index, element) in collection.withIndex()) {
println(&amp;quot$index: $element&amp;quot)
}بخش 7.4 قوانین کلی برای تخریب یک عبارت و استفاده از آن برای مقداردهی اولیه چندین متغیر را شرح می دهد.تابع to یک extension function است. شما می توانید یک جفت(pair) از هر عنصر را ایجاد کنید، به این معنی که این یک extension برای یک گیرنده عمومی(generic receiver) است: می توانید 1 را به &quot;&quot;one ، one&quot;&quot; را به 1، list را به list.size() و غیره بنویسید. بیایید به اعلان تابع mapOf نگاه کنیم:fun &lt;K, V&gt; mapOf(vararg values: Pair&lt;K, V&gt;): Map&lt;K, V&gt;مانند listOf، mapOf تعداد متغیری از آرگومان ها را می پذیرد، اما این بار آنها باید جفت(pair) کلید(key) و مقادیر(value) باشند.اگرچه ایجاد یک map جدید ممکن است مانند یک ساختار خاص در Kotlin به نظر برسد، اما یک تابع منظم با یک syntax مختصر است. در مرحله بعد، بیایید در مورد اینکه چگونه extensions برخورد با string ها و expressions منظم را ساده می کنند، بحث کنیم.3.5  کار با string ها و عبارات expressionsاسترینگ های کاتلین دقیقاً همان string های جاوا هستند. می توانید string ای را که در کد کاتلین ایجاد شده است به method جاوا منتقل کنید و می توانید از متد کتابخانه استاندارد کاتلین روی string هایی که از کد جاوا دریافت می کنید استفاده کنید. هیچ تبدیلی در کار نیست، و هیچ شیء پوشش اضافی ایجاد نمی شود.کاتلین کار با string های استاندارد جاوا را با ارائه یکسری extension functions مفید لذت بخش تر می کند. همچنین، برخی از method های گیج کننده را پنهان می کند و extensions هایی را که واضح تر هستند اضافه می کند. به عنوان اولین مثال ما از تفاوت های API، بیایید ببینیم کاتلین چگونه string ها را تقسیم می کند.3.5.1 جداکردن رشته ها (string)احتمالاً با روش تقسیم در String آشنا هستید. همه از آن استفاده می کنند، اما گاهی اوقات افراد در Stack Overflow (http://stackoverflow.com) از آن شکایت می کنند: &quot;متد split در جاوا با یک نقطه (.) کار نمی کند.نوشتن &quot;12.345-6.A&quot;.split(&quot;.&quot;) و انتظار داشتن آرایه [12, 345-6, A] در نتیجه، یک تله معمولی است. اما متد split جاوا یک آرایه خالی برمی گرداند! این اتفاق می افتد زیرا یک regular expressions را به عنوان پارامتر می گیرد و split یک string را با توجه به expression به چندین رشته تقسیم می کند. در اینجا، نقطه (.) یک regular expressions است که هر کاراکتری را نشان می دهد.Kotlin متد گیج کننده را پنهان می کند و چندین پسوند اضافه بار به نام split را به عنوان جایگزین ارائه می دهد که آرگومان های متفاوتی دارند. چیزی که یک regular expressions می گیرد به مقداری از نوع Regex نیاز دارد، نه String. این تضمین می کند که آیا String ای که به یک متد ارسال می شود به عنوان متن ساده یا یک regular expressions تفسیر می شود.در اینجا نحوه تقسیم رشته با یک نقطه یا یک خط تیره آمده است:&gt;&gt;&gt; println(&amp;quot12.345-6.A&amp;quot.split(&amp;quot\\.|-&amp;quot.toRegex()))
[12, 345, 6, A]کاتلین دقیقاً از همان سینتکس regular expressions مانند جاوا استفاده می کند. الگوی(pattern) اینجا با یک نقطه مطابقت دارد (ما از آن فرار کردیم تا نشان دهیم منظور ما یک کاراکتر تحت اللفظی است، نه یک علامت عام) یا یک خط تیره. APIهای کار با regular expressions نیز مشابه APIهای استاندارد کتابخانه جاوا هستند، اما اصطلاحی تر هستند. به عنوان مثال، در کاتلین شما از یک تابع پسوند(extension function) toRegex برای تبدیل یک String به یک regular expressions استفاده می کنید.اما برای چنین مورد ساده ای، نیازی به استفاده از regular expressions ندارید. overload دیگر split extension function در کاتلین تعداد دلخواه خود را به عنوان رشته های متن ساده می گیرد:&gt;&gt;&gt; println(&amp;quot12.345-6.A&amp;quot.split(&amp;quot.&amp;quot, &amp;quot-&amp;quot))
[12, 345, 6, A]توجه داشته باشید که به جای آن می توانید آرگومان های کاراکتر را مشخص کنید و بنویسید .split(&#x27;-&#x27;, &#x27;.&#x27;)&quot;12.345-6.A&quot; که به همان نتیجه منجر می شود. این متد جایگزین متد جاوای مشابه می شود که می تواند تنها یک کاراکتر را به عنوان جداکننده بگیرد.3,5,2 بارات منظم و رشته های سه گانهبیایید به مثال دیگری با دو پیاده سازی متفاوت نگاه کنیم: اولی از پسوندها در String استفاده می کند و دومی با عبارات منظم کار می کند. وظیفه شما این است که نام مسیر کامل یک فایل را به اجزای آن تفکیک کنید: یک directory ، یک نام فایل و یک پسوند. کتابخانه استاندارد Kotlin شامل توابعی برای دریافت زیررشته قبل (یا بعد از) اولین (یا آخرین) وقوع جداکننده داده شده است. در اینجا نحوه استفاده از آنها برای حل این کار آمده است (شکل 3.4 را نیز ببینید).fun parsePath(path: String) {
val directory = path.substringBeforeLast(&amp;quot/&amp;quot)
val fullName = path.substringAfterLast(&amp;quot/&amp;quot)
val fileName = fullName.substringBeforeLast(&amp;quot.&amp;quot)
val extension = fullName.substringAfterLast(&amp;quot.&amp;quot)
println(&amp;quotDir: $directory, name: $fileName, ext: $extension&amp;quot)
}
&gt;&gt;&gt; parsePath(&amp;quot/Users/yole/kotlin-book/chapter.adoc&amp;quot)
Dir: /Users/yole/kotlin-book, name: chapter, ext: adocرشته فرعی قبل از آخرین علامت اسلش(/) مسیر فایل، مسیر یک دایرکتوری محصور کننده است، رشته فرعی بعد از آخرین نقطه یک پسوند فایل است و نام فایل بین آنها قرار می گیرد.کاتلین تفکیک رشته ها را بدون استفاده از عبارات منظم (regular expressions) آسان تر می کند، عباراتی که قدرتمند هستند اما گاهی اوقات درک آنها پس از نوشتن دشوار است. اگر می خواهید از عبارات منظم استفاده کنید، کتابخانه استاندارد کاتلین می تواند کمک کند. در اینجا نحوه انجام یک کار مشابه با استفاده از عبارات منظم آمده است:fun parsePath(path: String) {
  val regex = &amp;quot&amp;quot&amp;quot(.+)/(.+)\.(.+)&amp;quot&amp;quot&amp;quot.toRegex()
  val matchResult = regex.matchEntire(path)
  if (matchResult != null) {
     val (directory, filename, extension) = matchResult.destructured
     println(&amp;quotDir: $directory, name: $filename, ext: $extension&amp;quot)
  }
}در این مثال، عبارت منظم در یک رشته نقل قول سه گانه نوشته شده است. در چنین رشته ای، نیازی به حذف از هیچ کاراکتری از جمله بک اسلش نیست، بنابراین می توانید نماد نقطه را با \ رمزگذاری کنید. به جای \\. همانطور که در یک رشته معمولی می نویسید (شکل 3.5 را ببینید).این عبارت منظم یک مسیر(path) را به سه گروه تقسیم می کند که با یک اسلش و یک نقطه از هم جدا می شوند. الگو با هر کاراکتری از ابتدا مطابقت دارد، بنابراین اولین گروه (+.) شامل رشته فرعی قبل از آخرین اسلش است. این زیر رشته شامل تمام اسلش های قبلی است، زیرا با الگوی &quot;هر کاراکتری&quot; مطابقت دارند. به همین ترتیب، گروه دوم شامل زیر رشته قبل از آخرین نقطه و گروه سوم شامل قسمت باقی مانده است.حال بیایید پیاده سازی تابع parsePath را از مثال قبلی مورد بحث قرار دهیم. شما یک عبارت منظم ایجاد می کنید و آن را با یک مسیر ورودی مطابقت می دهید. اگر تطابق موفقیت آمیز باشد (نتیجه صفر نیست)، مقدار ویژگی بدون ساختار آن را به متغیرهای مربوطه اختصاص می دهید. این همان syntax است که هنگام مقدار دهی اولیه دو متغیر با هم استفاده می شود. بخش 7.4 جزئیات را پوشش می دهد.3.5.3      رشته های سه گانه چند خطیهدف از رشته های سه گانه فقط جلوگیری از جداسازی کاراکترها نیست. چنین رشته ای می تواند شامل هر کاراکتری از جمله شکست خط(line breaks) باشد. این به شما راهی آسان برای قراردادن متنی که حاوی خطوط شکسته است را در برنامه خود می دهد. به عنوان مثال، اجازه دهید برخی از توانایی های ASCII را ترسیم کنیم:val kotlinLogo = &amp;quot&amp;quot&amp;quot| //
                   .|//
                   .|/ \&amp;quot&amp;quot&amp;quot
&gt;&gt;&gt; println(kotlinLogo.trimMargin(&amp;quot.&amp;quot))
| //
|//
|/ \رشته(string) چند خطی شامل تمام کاراکترهای بین نقل قول های سه گانه، از جمله تورفتگی های(indent) مورد استفاده برای قالب بندی کد است. اگر می خواهید نمایش بهتری از چنین رشته ای داشته باشید، می توانید تورفتگی (به عبارت دیگر، حاشیه سمت چپ) را کوتاه کنید. برای انجام این کار، یک پیشوند به محتوای رشته اضافه می کنید و انتهای حاشیه را علامت گذاری می کنید و سپس trimMargin را صدا می زنید تا پیشوند و فضای خالی قبلی در هر خط حذف شود. این مثال از نقطه به عنوان پیشوند استفاده می کند.یک رشته با نقل قول سه گانه می تواند شامل شکسته های خط باشد، اما نمی توانید از کاراکترهای خاصی مانند \n استفاده کنید. از طرف دیگر، شما نیازی به جداسازی ندارید، بنابراین مسیر به سبک ویندوز &quot;C:\\Users\\yole\\kotlin-book&quot; را می توان به صورت &quot;&quot;&quot;C:\Users\yole\ kotlin-book&quot;&quot;&quot; نوشت.همچنین می توانید از قالب های رشته ای در رشته های چند خطی استفاده کنید. از آنجایی که رشته های چند خطی (escape sequences) توالی جداسازی را پشتیبانی نمی کنند، اگر نیاز به استفاده از علامت واقعی دلار در محتویات رشته خود دارید، باید از یک عبارت تعبیه شده استفاده کنید. به مثال توجه کنید :val price = &amp;quot&amp;quot&amp;quot${&#039;$&#039;}99.9&amp;quot&amp;quot&amp;quotیکی از زمینه هایی که رشته های چند خطی می تواند در برنامه های شما مفید باشد (علاوه بر بازی هایی که از توانایی ASCII استفاده می کنند) تست ها است. در آزمایش ها، اجرای عملیاتی که متن چند خطی تولید می کند (به عنوان مثال، یک تکه صفحه وب) و مقایسه نتیجه با خروجی مورد انتظار، نسبتاً معمول است. رشته های چند خطی راه حلی عالی برای گنجاندن خروجی مورد انتظار به عنوان بخشی از آزمایش به شما می دهد. بدون نیاز به جداسازی ناشیانه یا بارگذاری متن از فایل های خارجی - فقط چند علامت نقل قول قرار دهید و HTML مورد انتظار یا خروجی دیگر را بین آنها قرار دهید. و برای قالب بندی بهتر از تابع trimMargin فوق الذکر استفاده کنید که نمونه دیگری از تابع افزونه (extension function) است.توجه: اکنون می توانید ببینید که توابع افزونه راهی قدرتمند برای گسترش APIهای کتابخانه های موجود و تطبیق آنها با اصطلاحات زبان جدید شما هستند – چیزی به نام الگوی Pimp My Library و در واقع، بخش بزرگی از کتابخانه استاندارد کاتلین از توابع پسوندی برای کلاس های استاندارد جاوا تشکیل شده است. کتابخانه Anko ( https://github.com/kotlin/anko ) ، که توسط JetBrains نیز ساخته شده است، توابع افزونه (extension functions) را ارائه می کند که API Android را سازگارتر با کاتلین می کند. همچنین می توانید بسیاری از کتابخانه های جامعه برنامه نویسان را بیابید که بسته بندی های مناسب کاتلین را در کتابخانه های اصلی شخص ثالث مانند Spring ارائه و بسته بندی میکند.اکنون که می توانید ببینید کاتلین چگونه APIهای بهتری را برای کتابخانه هایی که استفاده می کنید به شما می دهد، بیایید توجه خود را به کد شما معطوف کنیم. برخی از کاربردهای جدید برای توابع افزونه را خواهید دید، و همچنین در مورد مفهوم جدیدی بحث خواهیم کرد: توابع محلی(local functions).3.6  مرتب کردن کد خود: توابع و برنامه های افزودنی(extensions) داخلیبسیاری از توسعه دهندگان بر این باورند که یکی از مهمترین ویژگی های کد خوب و با کیفیت عدم تکرار است. حتی یک نام خاص برای این اصل وجود دارد: خودت را تکرار نکن &quot;Don’t Repeat Yourself&quot;(DRY). اما در جاوا رعایت این اصل همیشه بی اهمیت نیست. در بسیاری از موارد، این امکان وجود دارد که از ویژگی Extract Method refactoring IDE خود برای تقسیم متدهای طولانی تر به تکه های کوچک تر و سپس استفاده مجدد از آن تکه ها استفاده کنید. اما این می تواند درک کد را سخت تر کند، زیرا در نهایت با کلاسی مواجه می شوید که متدهای کوچک زیادی دارد و هیچ رابطه واضحی بین آنها وجود ندارد. شما می توانید حتی فراتر رفته و روش های استخراج شده را در یک کلاس داخلی گروه بندی کنید، که به شما امکان می دهد ساختار را حفظ کنید، اما این رویکرد به مقدار قابل توجهی از کد های تکراری نیاز دارد.کاتلین راه حل تمیزتری به شما می دهد: می توانید توابعی را که خارج کرده اید در تابع دیگر بصورت تودرتو استفاده کنید. به این ترتیب، شما ساختار مورد نیاز خود را بدون سربار دستوری اضافی خواهید داشت.بیایید ببینیم که چگونه از توابع محلی برای رفع یک مورد نسبتاً رایج تکرار کد استفاده کنیم. در فهرست زیر، یک تابع یک کاربر را در پایگاه داده ذخیره می کند و شما باید مطمئن شوید که شی کاربر حاوی داده های معتبر است.class User(val id: Int, val name: String, val address: String)
fun saveUser(user: User) {
if (user.name.isEmpty()) {
throw IllegalArgumentException(
&amp;quotCan&#039;t save user ${user.id}: empty Name&amp;quot)
}
if (user.address.isEmpty()) {
throw IllegalArgumentException(
&amp;quotCan&#039;t save user ${user.id}: empty Address&amp;quot)
}
// Save user to the database
}
&gt;&gt;&gt; saveUser(User(1, &amp;quot&amp;quot, &amp;quot&amp;quot))
java.lang.IllegalArgumentException: Can&#039;t save user 1: empty Nameمقدار کدهای تکراری در اینجا نسبتاً کم است، و احتمالاً نمی خواهید متد کامل در کلاس خود داشته باشید که یک مورد خاص از اعتبارسنجی یک کاربر را مدیریت کند. اما اگر کد اعتبار سنجی را در یک تابع محلی(local function) قرار دهید، می توانید از شر تکرار خلاص شوید و همچنان ساختار کد واضحی را حفظ کنید. در اینجا نحوه عملکرد آن آمده است.class User(val id: Int, val name: String, val address: String)
fun saveUser(user: User) {
  fun validate(user: User,
     value: String,
     fieldName: String) {
       if (value.isEmpty()) {
          throw IllegalArgumentException(
          &amp;quotCan&#039;t save user ${user.id}: empty $fieldName&amp;quot)
       }
  }
  validate(user, user.name, &amp;quotName&amp;quot)
  validate(user, user.address, &amp;quotAddress&amp;quot)
  // Save user to the database
}این بهتر به نظر می رسد. منطق اعتبارسنجی تکراری نیست، و در صورت نیاز به افزودن فیلدهای دیگر به کاربر در حین تکامل پروژه، می توانید به راحتی اعتبارسنجی های بیشتری اضافه کنید. اما ارسال شی User به تابع اعتبارسنجی تا حدودی زشت است. خبر خوب این است که کاملاً غیر ضروری است، زیرا توابع محلی به تمام پارامترها و متغیرهای تابع اصلی که در داخل آن است دسترسی دارند. بیایید از آن استفاده کنیم و از شر پارامتر کاربر اضافی خلاص شویم.class User(val id: Int, val name: String, val address: String)
fun saveUser(user: User) {
  fun validate(value: String, fieldName: String) {
    if (value.isEmpty()) {
       throw IllegalArgumentException(
       &amp;quotCan&#039;t save user ${user.id}: &amp;quot +
       &amp;quotempty $fieldName&amp;quot)
    }
  }
  validate(user.name, &amp;quotName&amp;quot)
  validate(user.address, &amp;quotAddress&amp;quot)
  // Save user to the database
}class User(val id: Int, val name: String, val address: String)
fun User.validateBeforeSave() {
  fun validate(value: String, fieldName: String) {
    if (value.isEmpty()) {
      throw IllegalArgumentException(
      &amp;quotCan&#039;t save user $id: empty $fieldName&amp;quot)
    }
  }
  validate(name, &amp;quotName&amp;quot)
  validate(address, &amp;quotAddress&amp;quot)
  }
  fun saveUser(user: User) {
    user.validateBeforeSave()
    // Save user to the database
}استخراج یک قطعه کد در یک تابع افزونه(extension function) به طرز شگفت انگیزی مفید است. حتی اگر User بخشی از پایگاه کد شما است و نه یک کلاس کتابخانه، شما نمی خواهید این منطق را در یک متد User قرار دهید، زیرا به مکان های دیگری که User در آن استفاده می شود مربوط نیست. اگر از این رویکرد پیروی کنید، API کلاس فقط شامل متدهای ضروری است که در همه جا استفاده می شوند، بنابراین کلاس کوچک می ماند و به راحتی می توانید سرتان را در اطراف کلاس بچرخانید. از سوی دیگر، توابعی که عمدتاً با یک شی سر و کار دارند و نیازی به دسترسی به داده های خصوصی آن ندارند، می توانند مانند فهرست 3.14 بدون شرایط اضافی به اعضای آن دسترسی داشته باشند.توابع برنامه افزودنی(Extension functions) همچنین می توانند به عنوان توابع محلی اعلام شوند، بنابراین می توانید حتی فراتر رفته و User.validateBeforeSave را به عنوان یک تابع محلی در saveUser قرار دهید. اما معمولاً خواندن توابع محلی عمیق تو در تو نسبتاً سخت است. بنابراین، به عنوان یک قاعده کلی، استفاده از بیش از یک سطح تودرتو را توصیه نمی کنیم.با نگاهی به تمام کارهای جالبی که می توانید با توابع انجام دهید، در فصل بعدی به کارهایی که می توانید با کلاس ها انجام دهید، خواهیم پرداخت.3.7 خلاصهکاتلین کلاس های مجموعه خود را تعریف نمی کند و در عوض کلاس های مجموعه جاوا را با یک API غنی تر تقویت می کند.تعریف مقادیر پیش فرض برای پارامترهای تابع نیاز به تعریف توابع اضافه را تا حد زیادی کاهش می دهد، و syntax آرگومان نام گذاری شده باعث می شود فراخوانی های توابع با پارامترها بسیار خواناتر شود.توابع و خصوصیات را می توان مستقیماً در یک فایل اعلان کرد، نه فقط به عنوان اعضای یک کلاس، که امکان ایجاد ساختار کد انعطاف پذیرتر را فراهم می کند.ویژگی ها و توابع پسوند(Extension functions) به شما امکان می دهند API هر کلاس، از جمله کلاس های تعریف شده در کتابخانه های خارجی، بدون تغییر کد منبع آن و بدون سربار زمان اجرا گسترش دهید.فراخوانی های Infix یک syntax تمیز برای فراخوانی متد های اپراتور مانند با یک آرگومان واحد ارائه می کنند.کاتلین تعداد زیادی از توابع را برای مدیریت راحت رشته ، هم برای عبارات منظم و هم برای رشته های ساده فراهم می کند.رشته های نقل قول سه گانه راهی تمیز برای نوشتن عباراتی ارائه می کنند که نیاز به جداسازی شلوغی اضافی و الحاق رشته ها در جاوا نیاز دارند.توابع محلی به شما کمک می کنند کد خود را تمیزتر ساختار دهید و کد تکراری را حذف کنید.</description>
                <category>فرید محمدی</category>
                <author>فرید محمدی</author>
                <pubDate>Sat, 23 Jul 2022 16:57:15 +0430</pubDate>
            </item>
                    <item>
                <title>Kotlin In Action بخش دوم فصل اول کتاب</title>
                <link>https://virgool.io/@FaridMohammadi/kotlin-in-action-%D8%A8%D8%AE%D8%B4-%D8%AF%D9%88%D9%85-%D9%81%D8%B5%D9%84-%D8%A7%D9%88%D9%84-%DA%A9%D8%AA%D8%A7%D8%A8-gv2sbmvre6cc</link>
                <description>این فصل را پوشش می دهدمعرفی توابع ، متغیرها ، کلاس ها ، enums و ویژگی هاساختارهای کنترلی در کاتلین کست cast های هوشمند ارسال و مدیریت استثناء (exceptions)بخش اول فصل اول را در اینجا مشاهده کنیددر این فصل، شما یاد خواهید گرفت که چگونه عناصر ضروری هر برنامه را در کاتلین استفاده کنید: متغیرها، توابع و کلاس ها. در طول مسیر، با مفهوم properties در کاتلین آشنا خواهید شد.شما استفاده از structures های کنترلی مختلف را در کاتلین یاد خواهید گرفت. آنها بیشتر شبیه جاوا هستند که برای شما آشنا هستند، اما به روش های زیادی برای استفاده راحت بهتر شده.ما مفهوم castهای هوشمند را معرفی می‌کنیم که یک بررسی نوع داده و یک cast را در یک عملیات ترکیب می‌کنند. در نهایت، ما در مورد مدیریت استثنا (exception ) صحبت خواهیم کرد. در پایان این فصل، می‌توانید از اصول اولیه زبان برای نوشتن کد کاتلین استفاده کنید، حتی اگر کد کوتاه و کامل نباشد.2.1 عناصر پایه ای: توابع و متغیرها (functions and variables)این بخش شما را با عناصر پایه ای که هر برنامه کاتلین از آن تشکیل شده است آشنا می کند: توابع و متغیرها. خواهید دید که چگونه کاتلین به شما اجازه می دهد تا بسیاری از نوع داده ها را حذف کنید و چگونه شما را تشویق می کند که ترجیحا از داده های تغییرناپذیر (immutable) نسبت به  قابل تغییر(mutable) استفاده کنید.2.1.1    سلام دنیا! (Hello, world!)بیایید با مثال کلاسیک شروع کنیم: برنامه ای که &quot;Hello, world!&quot; را چاپ می کند. در کاتلین، این فقط یک تابع است:چه ویژگی ها و بخش هایی از syntax زبان را می توانید در این قطعه کد ساده مشاهده کنید؟ این لیست را بررسی کنید:کلمه کلیدی fun برای اعلام یک تابع استفاده می شود. برنامه نویسی در کاتلین بسیار سرگرم کننده(fun) است، در واقع!نوع پارامتر بعد از نام آن نوشته می شود. این برای متغییر ها (variable) هم همینطور است.تابع (function) را می توان در بالای یک فایل هم نوشت. نیازی ندارید اونو تو کلاس بنویسید. آرایه ها فقط باید داخل کلاس باشند. برخلاف جاوا، کاتلین syntax خاصی برای معرفی نوع آرایه ندارد.شما به جای System.out.println  در کاتلین فقط println می نویسید. کاتلین کتابخانه های استاندارد زیادی را در کنار توابع استاندارد کتابخانه جاوا با syntaxمختصرتر فراهم میکند و println یکی از آنهاست. شما می توانید نقطه ویرگول ” ;“ (semicolon ) را از انتهای یک خط حذف کنید، درست مانند بسیاری از زبان های امروزی دیگر.تا اینجا که خیلی خوب بود! بعداً درباره بعضی از این موضوعات با جزئیات بیشتر صحبت خواهیم کرد. حالا، بیایید syntax تابع (function) را بررسی کنیم.2.1.2  تابع (Functions)شما دیدید که چگونه می توان تابعی (function ) نوشت که چیزی برای بازگشت(return) ندارد. اما در کجا باید نوع داده بازگشتی برای تابعی که نتیجه دلخواهمون رو بده  قرار داد؟ می توانید حدس بزنید که باید جایی بعد از لیست پارامترها برود:نوشتن تابع با کلمه کلیدی fun شروع می شود و پس از آن نام تابع: max، در این مورد. بعد اون لیست پارامترها داخل پرانتز قرار می گیرد. نوع بازگشتی بعد از لیست پارامترها قرار می گیرد که با یک دونقطه از آن جدا شده است.شکل 2.1 ساختار اصلی یک تابع را به شما نشان می دهد. توجه داشته باشید که در کاتلین if یک عبارت شرطی با مقدار نتیجه مشخص است. شبیه یک عملگر سه تایی در جاوا است: a : b ? (a &gt; b) بیانیه ها و عبارات (Statements and expressions)در کاتلین، if یک expression است، نه یک statement . تفاوت بین یک statement و یک expression در این است که یک expression دارای یک مقدار (value )است که می تواند به عنوان بخشی از expression دیگر استفاده شود، در حالی که یک statement همیشه یک عنصر سطح بالا در بلوک خود است و مقدار (value )خاص خود را ندارد. در جاوا تمام structures کنترلی، statements هستند. در کاتلین، اکثر structures کنترل، به جز حلقه‌ها (for، do، و do/ while) expressions هستند. توانایی ترکیب structures کنترل با expressionهای دیگر به شما امکان می دهد بسیاری از الگوهای(patterns) رایج را به طور مختصر بنویسید، همانطور که در ادامه کتاب خواهید دید.از طرف دیگر، expressions هایی در جاوا هستند که در کاتلین به statements تبدیل می شوند. این به جلوگیری از سردرگمی بین مقایسه ها و جایگزینی(assignments) کمک می کند، که منبع رایج اشتباهات است.E XPRESSION BODIESمی توانید function قبلی را حتی بیشتر ساده کنید. از آنجا که بدنه آن از یک expression واحد تشکیل شده است، می توانید از آن expression به عنوان کل بدنه تابع استفاده کنید و پرانتزهای تکراری و بازگشت statement را حذف کنید:fun max(a: Int, b: Int): Int = if (a &gt; b) a else b داخل if براکت function و بدنه آن داخل پرانتز نوشته شده، می گوییم که این تابع دارای بدنه بلوکی(block body) است. اگر یک expression را مستقیماً برگرداند، دارای expression body است.نکته : INTELLIJ IDEA IntelliJ IDEA قصد دارد برای تبدیل بین دو styles، توابعی را فراهم کند: “Convert to expression body” and “Convert to block body.”توابع با بدنه expression اغلب در کد کاتلین یافت می شوند. این سبک نه تنها برای توابع تک خطی بی اهمیت، بلکه برای توابعی که یک expression منفرد و پیچیده تر را ارزیابی می کنند، مانند if، when یا try استفاده می شود. چنین توابعی را بعداً در این فصل خواهید دید، زمانی که در مورد ساختار When صحبت می کنیم.می توانید تابع max را حتی بیشتر ساده کرده و نوع بازگشت را حذف کنید:fun max(a: Int, b: Int) = if (a &gt; b) a else bچرا توابعی بدون نوع بازگشت وجود دارد؟ آیا کاتلین، به عنوان یک زبان تایپ ایستا(static )، نیازی به داشتن یک نوع داده در زمان کامپایل برای هر عبارت ندارد؟ در واقع، هر متغیر و هر expression یک نوع داده دارد و هر تابعی یک نوع داده بازگشتی دارد. اما برای بدنه توابع expression ، کامپایلر می‌تواند عبارت مورد استفاده به عنوان بدنه تابع را تجزیه و تحلیل کند و از نوع داده آن به‌عنوان نوع داده بازگشت تابع استفاده کند، حتی زمانی که به صراحت بیان نشده باشد. این نوع تحلیل را معمولاً type inference می نامند.توجه داشته باشید که حذف نوع داده بازگشتی فقط برای توابعی با بدنه expression مجاز است. برای توابعی با بدنه بلوکی (block )که مقداری را برمی گرداند، باید نوع بازگشت را مشخص کنید و statements بازگشتی را به صراحت بنویسید. این یک انتخاب آگاهانه است . یک تابع که تو دنیای واقعی استفاده میشه اغلب طولانی است و می تواند حاوی چندین statements بازگشتی باشد. داشتن نوع داده بازگشتی و statements بازگشتی به درک سریع چیزی که برگردانید کمک می کند. بیایید در ادامه به syntax متغیرها نگاه کنیم. 2.1.3     متغیرها (Variables)در جاوا،برای نوشتن یک متغیر ،با یک نوع داده شروع می کنید. این برای کاتلین کار نمی کند، چون به شما امکان می دهد انواع داده های موجود را از نوشتن متغیر های بسیاری حذف کنید. بنابراین در کاتلین شما با یک کلمه کلیدی شروع می‌کنید و ممکن است (یا نه) نوع داده را بعد از نام متغیر قرار دهید. بیایید دو متغیر را اعلام کنیم:val question = &amp;quotThe Ultimate Question of Life, the Universe, and Everything&amp;quot
val answer = 42این مثال نوع داده را حذف می‌کند، اما در صورت تمایل می‌توانید نوع را به صراحت مشخص کنید:val answer: Int = 42درست مانند بدنه توابع اکسپرشن(expression-body functions )، اگر نوع را مشخص نکنید، کامپایلرمقدار دهی اولیه  expression را تحلیل می کند و از نوع داده آن به عنوان نوع داده متغیر استفاده می کند. در این حالت، مقدار اولیه، 42، دارای نوع داده Int است، بنابراین متغیر دارای همان نوع داده خواهد بود.اگر از یک عدد اعشاری ثابت استفاده کنید، متغیر دارای نوع Double خواهد بود:انواع اعداد را عمیقتر در بخش 6.2 پوشش داده شده است.اگر متغیری مقداردهی اولیه نشده است ، باید نوع آن را به صراحت مشخص کنید:val answer: Int
answer = 42اگر اطلاعاتی در مورد مقادیری که می‌توان به این متغیر نسبت داد ندهید ، کامپایلر نمی‌تواند نوع داده را تشخیص دهد.تغییرناپذیر و تغییر پذیری متغیرهای (MUTABLE AND IMMUTABLE VARIABLES)دو کلمه کلیدی برای تعریف یک متغیر وجود دارد:متغییر Val  (مقدار value)  مرجع غیرقابل تغییر ( Immutable) . متغیری که با val مینویسیم، بعد از مقداردهی اولیه دیگه نمیتونیم مقدار جدید به این متغییر بدیم. دقیقا مثل یک متغیر نهایی (final ) در جاوا است. متغییر Var   متغیر( variable )مرجع تغییرپذیر(Mutable) . مقدار این متغیرهارو میشه تغییر داد. این نوع متغییرها مربوط به یک متغیر معمولی جاوا (غیر نهایی(non-final)) است.به طور پیش فرض، شما باید سعی کنید تا همه متغیرها را در کاتلین با کلمه کلیدی val بنویسید. فقط در صورت لزوم از var استفاده کنید. استفاده از منابع تغییرناپذیر، اشیاء تغییرناپذیر(immutable objects) و توابع بدون effects ، کد شما را به سبک functional نزدیکتر می کند. در فصل 1 به طور مختصر به مزایای آن پرداختیم و در فصل 5 به این موضوع بیشتر میپردازیم.یک متغیر val باید دقیقاً یک بار در طول اجرای بلوکی که در آن تعریف شده است مقداردهی اولیه شود. اما بسته به شرایط میتونید آن را با مقادیر مختلف مقداردهی اولیه کنید، اگر کامپایلر مطمئن باشد که فقط یکی از دستورات(statements ) مقدار دهی اولیه اجرا می‌شود:val message: String
if (canPerformOperation()) {
message = &amp;quotSuccess&amp;quot
// ... perform the operation
} else {
message = &amp;quotFailed&amp;quot 
}توجه : حتی اگر یک مرجع val تغییرناپذیر (immutable)است و نمی توان آن را تغییر داد، object که به آن اشاره می کند ممکن است تغییر پذیر (mutable) باشد. به عنوان مثال، این کد کاملا معتبر است:در فصل 6، اجسام قابل تغییر و تغییرناپذیر را با جزئیات بیشتری مورد بحث قرار خواهیم داد. حتی اگر کلمه کلیدی var به متغیر اجازه تغییر مقدار خود را دهد، نوع داده آن ثابت است.به عنوان مثال، این کد کامپایل نمی شود:خطای string literal وجود دارد چون متغییر (Int) است ولی انتظار می رود (String) باشد. کامپایلر نوع متغیر را فقط از مقدار دهی اولیه ساز تشخیص میدهد و مقدار دهی های بعدی را هنگام تعیین نوع داده در نظر نمی گیرد.اگر نیاز دارید مقداری از نوع داده دیگری را در یک متغیر که نوع داده دیگری دارد ذخیره کنید، باید به صورت دستی مقدار را به نوع داده مناسب تبدیل یا وادار کنید. در بخش 6.2.3 در مورد تبدیل نوع داده اولیه بحث خواهیم کرد..الان که می‌دانید چطوری متغیرها را تعریف کنید، وقت آن است که چند ترفند جدید برای مقدار دادن به متغییر ها یاد بگیریم.2.1.4 فرمت دهی ساده تر رشته ها: قالب های رشته ای (Easier string formatting: string templates)بیایید به مثال &quot;Hello World&quot; برگردیم و این بخش را باز کنیم. در اینجا نحوه سلام دادن به کاربران با نام خود کاربر را با زبان کاتلین را میبینیم: تو این مثال میخوایم یک feature رو از string templatesمعرفی کنید. در کد، بعد از تعیین نام متغییر از آن در string literal استفاده می‌کنید. مانند بسیاری از زبان های scripting ، درکاتلین هم میتونید به متغیرهای محلی در string literals رجوع کنید با قرار دادن کاراکتر $ در جلوی نام متغیر. این دقیقا مثل این کد جاوا هست: (&quot;Hello, &quot; + name + &quot;!&quot;) اما فشردتر و به همان اندازه کارامدتر. و البته، expressions ها به صورت ایستاتیک بررسی می شوند و اگر بخواهید به متغیری اشاره کنید که وجود ندارد، کد کامپایل نمی شود.اگر بخواهید کاراکتر $ را در یک رشته قرار دهید، و از محدودیت های ان فرار می کنید: println(&quot;\$x&quot;) x$ را چاپ می کند و x را به عنوان متغیر شناسایی یا تفسیر نمی کند.شما محدود نیستید به نام متغیرهای ساده. می توانید از expressionهای کامل تری استفاده کنید. فقط با گذاشتن براکت هایی در اطراف expression ها به راحتی میتونید استفاده کنید:شما همچنین می توانید نقل قول های دوگانه را در داخل دو نقل قول قرار دهید ، به شرطی که در یک عبارت باشند:fun main(args: Array) {
  println(&amp;quotHello, ${if (args.size &gt; 0) args[0] else &amp;quotsomeone&amp;quot}!&amp;quot) 
 }بعداً، در بخش 3.5، به رشته‌ها (strings ) باز می‌گردیم و درباره کارهایی که می‌توانید با آنها انجام دهید بیشتر صحبت خواهیم کرد.حالا که میدونید چطور توابع و متغیرها را بسازید . بیایید یک پله در سلسله مراتب بالا برویم و به کلاس ها نگاه کنیم. این بار، از مبدل جاوا به کاتلین برای کمک به شما برای شروع استفاده از ویژگی های زبان جدید استفاده خواهید کرد.2.2 کلاسها و حواصیت ها (properties )احتمالاً در برنامه نویسی شی گرا تازه کار نیستید و با abstraction یک کلاس آشنا هستید. مفاهیم کاتلین در این زمینه برای شما آشنا هستند، اما میبینید که بسیاری از کارهای رایج را می توان با کد بسیار کمتری انجام داد. این بخش شما را با سینتکس (syntax ) اولیه برای ساخت کلاس ها آشنا می کند. در فصل 4 به جزئیات بیشتر خواهیم پرداخت.برای شروع ، بیایید به یک کلاس ساده جاوا Person نگاه کنیم که تا کنون فقط یک ویژگی ، name دارد .Listing 2.3          Simple Java class Person/* Java */public class Person {
private final String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
}در جاوا، بدنه سازنده (constructor ) اغلب حاوی کدهایی است که کاملاً تکراری است: پارامترها را به فیلدهایی با نام های مربوطه اختصاص می دهد. در کاتلین، این منطق را می توان بدون این همه تکرار بیان کرد.در بخش 1.5.6، مبدل جاوا به کاتلین را معرفی کردیم: ابزاری که به طور خودکار کد جاوا را با کد کاتلین جایگزین می کند که همان کار را انجام می دهد. بیایید به مبدل در عمل نگاه کنیم و کلاس Person را به Kotlin تبدیل کنیم.Listing 2.4               Person class converted to Kotlinclass Person(val name: String)جالبه مگه نه ؟ اگر زبان مدرن JVM دیگری را امتحان کرده باشید، شاید چیزی مشابه این دیده باشید. کلاس هایی از این نوع (که فقط شامل داده ها هستند اما هیچ کدی ندارند) اغلب اشیاء value نامیده می شوند و بسیاری از زبان ها یک syntax مختصر برای اعلام آنها ارائه می دهند.توجه داشته باشید که modifier public در هنگام تبدیل از جاوا به کاتلین ناپدید شد. در کاتلبن، public پیش‌فرض است، پس می‌توانید آن را حذف کنید.2.2.1     خواص (Properties)همانطور که بدون شک می دانید، ایده کلاس این است که داده ها و کدهایی را که روی آن داده ها کار می کنند در یک موجودیت واحد کپسوله کند. در جاوا داده ها در فیلدهایی که معمولا خصوصی (private) هستند ذخیره می شود. اگر نیاز دارید که به کاربران کلاس اجازه دهید به آن داده ها دسترسی داشته باشند، روش های دسترسی را ارائه می دهید: یک گیرنده (getter) و احتمالاً یک setter . نمونه ای از این را در کلاس Person دیدید. Setter همچنین می تواند حاوی کد های منطقی اضافی برای اعتبارسنجی مقدار ارسال شده، ارسال اعلان در مورد تغییر مقدار و غیره باشد.در جاوا، معمولاً از ترکیب فیلد و دسترسی‌های آن به عنوان یک ویژگی یاد می‌شود و بسیاری از فریمورک‌ها از آن مفهوم استفاده زیادی می‌کنند. در کاتلین، properties ها خصوصیات زبان درجه یک هستند که به طور کامل جایگزین فیلدها و methods های دسترسی می شوند. روش اعلام یک property دقیقا مثل اعلام یک متغییر است : با کلمات کلیدی val و var. ویژگی (property) اعلام شده به عنوان val فقط خواندنی است، در حالی که ویژگی var قابل تغییر است و می توان آن را تغییر داد.اساساً، هنگامی که یک ویژگی (property) را اعلام می کنید، دسترسی های مربوطه را اعلام می کنید (گیرنده (getter) برای یک ویژگی فقط خواندنی، و هر دو getter و setter برای یک ویژگی قابل نوشتن است). به‌طور پیش‌فرض، پیاده‌سازی دسترسی ها ( Accessor ) بی‌اهمیت است: یک فیلد برای ذخیره مقدار ایجاد می‌شود و getter و setter مقدار آن را برمی‌گرداند و به‌روزرسانی می‌کند. اما اگر بخواهید، می‌توانید یک دسترسی سفارشی را اعلام کنید که از منطق متفاوتی برای محاسبه یا به‌روزرسانی مقدار ویژگی استفاده می‌کند.اعلام مختصر شده کلاس Person در لیست 2.5، همان پیاده‌سازی اصولی کد اصلی جاوا را پنهان می‌کند: کلاسی با فیلدهای خصوصی که در سازنده (constructor) مقداردهی اولیه می‌شود و می‌توان از طریق getter مربوطه به آن دسترسی داشت. یعنی که شما می توانید از این کلاس از جاوا و از کاتلین به همان روش استفاده کنید، مستقل از جایی که در آن اعلام شده است. نحوه استفاده یکسان به نظر می رسد. در اینجا نحوه استفاده از کلاس Person در کد جاوا آمده است.توجه داشته باشید که وقتی Person در جاوا و در کاتلین تعریف شده باشد، این به نظر می رسد. ویژگی name درکاتلین به عنوان یک متد getter به نام getName در جاوا قابل دیدن است. قانون نامگذاری getter و setter یک استثنا دارد: اگر نام ویژگی با isشروع شود، هیچ پیشوند اضافی برای getter اضافه نمی شود و در نام setter ، is با set جایگزین می شود. بنابراین، از جاوا، isMarried() را فراخوانی می کنید.اگر لیست 2.6 را به کاتلین تبدیل کنید ، نتیجه زیر را دریافت خواهید کرد.اکنون به جای فراخوانی گیرنده(getter)، مستقیماً به property ارجاع می دهید. منطق ثابت می ماند، اما کد مختصرتر می شود. مجموعه‌ای از propertiesهای قابل تغییر به همین صورت عمل می‌کنند: در حالی که در جاوا، از person.setMarried(false) برای اطلاع از طلاق استفاده می‌کنید. در کاتلین می توانید person.isMarried = false بنویسید.نکته شما همچنین می توانید از دستور خصوصیت کاتلین برای کلاس های تعریف شده در جاوا استفاده کنید. دریافت‌کننده‌های کلاس جاوا را می‌توان به‌عنوان ویژگی‌های(property) val از کاتلین ، و جفت‌های getter/setter را می‌توان به‌عنوان ویژگی (property) varدسترسی داشت. به عنوان مثال، اگر یک کلاس جاوا متدهایی به نام getName و setName را تعریف کند، می توانید به عنوان یک property به نام name به آن دسترسی داشته باشید. اگر متدهای isMarried و setMarried را تعریف کند، نام property کاتلین مربوطه Marriedخواهد بود.در بیشتر موارد، property یک فیلد پشتیبان دارد که مقدار property را ذخیره می کند. اما اگر بتوان مقدار را مثلا، از propertyهای دیگر در لحظه محاسبه کرد آن را با استفاده از یک گیرنده (getter) سفارشی بیان کنید.2.2.2 دسترسی های سفارشی (Custom accessors)این بخش به شما نشان می دهد که چگونه یک پیاده سازی سفارشی از یک دسترسی به property بنویسید. فرض کنید یک مستطیل را اعلام می کنید که می تواند بگوید مربع است یا خیر. شما نیازی به ذخیره آن اطلاعات به عنوان یک فیلد جداگانه ندارید، زیرا می توانید بررسی کنید که آیا ارتفاع با عرض برابر است یا خیر:ویژگی isSquare برای ذخیره مقدار خود نیازی به فیلد ندارد. این فقط یک گیرنده(getter) سفارشی با پیاده سازی ارائه شده دارد. با هر بار دسترسی به property ، مقدار محاسبه می شود.توجه داشته باشید که لازم نیست از syntax های کامل با پرانتز و اکولاد استفاده کنید. می توانید get() = height == width را نیز بنویسید. فراخوانی چنین خاصیتی ثابت می ماند:&gt;&gt;&gt; val rectangle = Rectangle(41, 43)
&gt;&gt;&gt; println(rectangle.isSquare)
falseاگر نیاز به دسترسی به این property از جاوا دارید، روش isSquare را مانند قبل فراخوانی می کنید.ممکن است بپرسید که آیا بهتر است یک تابع(function) بدون پارامتر اعلام شود یا یک property با یک گیرنده(getter) سفارشی. هر دو گزینه مشابه هستند: هیچ تفاوتی در اجرا یا عملکرد وجود ندارد. آنها فقط در خوانایی متفاوت هستند. به طور کلی، اگر ویژگی (property) یک کلاس را توصیف کنید، باید آن را به عنوان یک property اعلام کنید.در فصل 4، نمونه‌های بیشتری را که از کلاس‌ها و ویژگی‌ها(property) استفاده می‌کنند ارائه می‌کنیم ، و به syntax که سازنده‌ها (constructors) را به صراحت اعلام می‌کنند، نگاه می‌کنیم. اگر در این مدت بی حوصله هستید، همیشه می توانید از مبدل جاوا به کاتلین استفاده کنید. اکنون اجازه دهید قبل از اینکه به بحث در مورد سایر ویژگی های زبان بپردازیم، به طور خلاصه نحوه سازماندهی کد کاتلین روی دیسک را بررسی می کنیم.2.2.3 طرح کد منبع کاتلین: دایرکتوری ها و بسته ها (directories and packages )می دانید که جاوا همه کلاس ها را در بسته ها(packages) سازماندهی می کند. کاتلین هم مثل جاوا مفهوم بسته ها(packages) را دارد. هر فایل کاتلین می تواند در ابتدا یک دستور بسته(packages) داشته باشد و تمام اعلانات (کلاس ها، توابع و خصوصیات(properties)) تعریف شده در فایل در آن بسته (package) قرار می گیرد. اعلان‌های تعریف‌شده در فایل‌های دیگر اگر در یک بسته(package) باشند، می‌توانند مستقیماً استفاده شوند و اگر در بسته بندی(package) متفاوتی هستند باید import شوند. مانند جاوا، دستورهای import در ابتدای فایل قرار می گیرند و از کلمه کلیدی import استفاده می کنند. در اینجا مثالی از یک فایل منبع اوردیم که syntax اعلام بسته و اعلام import را نشان می دهد.کاتلین بین وارد (import) کردن کلاس‌ها و توابع (functions) تمایزی قائل نمی‌شود و به شما امکان می‌دهد هر نوع اعلانی را با استفاده از کلمه کلیدی importوارد کنید. می توانید تابع سطح بالا را با نام وارد کنید. شما همچنین می توانید تمام اعلان های تعریف شده در یک بسته خاص را با قرار دادن ستاره (*) نام بسته وارد (import) کنید. توجه داشته باشید که این وارد کردن ستاره نه تنها کلاس های تعریف شده در بسته، بلکه توابع و ویژگی های سطح بالا را نیز قابل مشاهده می کند. در لیست 2.9، نوشتنimport geometry.shapes.*  به جای import کاملی که بالا نوشتیم باعث می شود که کد به درستی کامپایل شود.در جاوا، کلاس های خود را در ساختاری از فایل ها و دایرکتوری ها قرار می دهید که با ساختار بسته (package) مطابقت دارد. به عنوان مثال، اگر بسته‌ای به نام shapes با چندین کلاس دارید، باید هر کلاس را در یک فایل جداگانه با یک نام منطبق قرار دهید و آن فایل‌ها را در دایرکتوری که shapes نیز نامیده می‌شود ذخیره کنید. شکل 2.2 نشان می دهد که چگونه بسته هندسی و زیر بسته های آن می توانند در جاوا سازماندهی شوند. فرض کنید که تابع createRandomRectangle در یک کلاس جداگانه به نام RectangleUtilقرار دارد. شکل 2.2 در جاوا ، سلسله مراتب فهرست ، سلسله مراتب بسته را کپی می کند.در کاتلین می توانید چندین کلاس را در یک فایل قرار دهید و هر نامی را برای آن فایل انتخاب کنید. کاتلین همچنین هیچ محدودیتی برای چیدمان فایل های منبع روی دیسک حافظه اعمال نمی کند. شما می توانید از هر ساختار دایرکتوری برای سازماندهی فایل های خود استفاده کنید. به عنوان مثال، شما می توانید تمام محتوای هندسی را روی یک بسته(package) تعریف کنید. اشکال را در فایل shapes.kt قرار دهید و این فایل را بدون ایجاد پوشه shapesجداگانه در پوشه هندسه قرار دهید (شکل 2.3 را ببینید).شکل 2.3 سلسله مراتب بسته شما نیازی به رعایت سلسله مراتب دایرکتوری ندارد.با این حال، در بیشتر موارد، پیروی از طرح‌بندی دایرکتوری جاوا(directory layout) و سازماندهی فایل‌های منبع در دایرکتوری‌ها بر اساس ساختار بسته(package)، همچنان یک تمرین خوب است. پایبندی به این ساختار به ویژه در پروژه‌هایی که کاتلین با جاوا ترکیب شده است بسیار مهم است، زیرا انجام این کار به شما امکان می‌دهد تا کد را به تدریج و بدون هیچ گونه surprises منتقل کنید. اما شما نباید از نوشتن چندین کلاس به یک فایل دریغ کنید، به خصوص اگر کلاس ها کوچک هستند (و اغلب تو کاتلین اینجوریه).حالا که شما ساختار برنامه هارو میدونید. بیایید با یادگیری مفاهیم اولیه و ساختارهای کنترل در کاتلین ادامه بدیم.2.3    نمایش و مدیریت انتخاب ها: enums و &quot;when&quot;در این بخش قصد داریم در مورد ساخت when صحبت کنیم. می توان آن را به عنوان جایگزینی برای switch construct در جاوا در نظر گرفت، اما قدرتمندتر است و بیشتر مورد استفاده قرار می گیرد. در طول مسیر، نمونه ای از اعلان enums در کاتلین را به شما ارائه می دهیم و در مورد مفهوم smart casts بحث می کنیم.2.3.1     اعلام کلاسهای enumبیایید با افزودن imaginary bright pictures به این کتاب جدی و بررسی مجموعه ای از رنگها شروع کنیم.فهرست   2.10        اعلام   کلاس enum سادهenum class Color {
RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET
}این یک مورد نادر است زمانی که یک اعلام کاتلین از کلمات کلیدی بیشتری نسبت به کد جاوا استفاده می کند: کلاس enum در مقابل just enum در جاوا. در کاتلین، enum یک کلمه کلیدی به اصطلاح نرم است: وقتی قبل از کلاس می آید معنای خاصی دارد، اما می توانید در جاهای دیگر از آن به عنوان یک نام معمولی استفاده کنید. از طرف دیگر، classهمچنان یک کلمه کلیدی است و شما همچنان متغیرهایی به نام clazz یا aClass را اعلام خواهید کرد.همانطور که در جاوا، enum ها لیستی از مقادیر نیستند: می توانید properties ها و متدها را در کلاس های enum اعلام کنید. در اینجا نحوه عملکرد آن آمده است. ثابت‌های Enum از همان ساختار constructor و اعلان propertyاستفاده می‌کنند که قبلاً برای کلاس‌های معمولی دیدید. وقتی هر enum را ثابت اعلام می‌کنید، باید مقادیر خاصیت آن ثابت را ارائه دهید. توجه داشته باشید که این مثال تنها جایی را در syntax کاتلین نشان می دهد که در آن باید از سیمیکالن استفاده کنید: اگر متدی را در کلاس enum تعریف کنید، سیمیکالن لیست ثابت enum را از تعاریف متد جدا می کند. حالا بیایید چند روش جالب برای مقابله با ثابت های enum در کد خود ببینیم.2.3.2 استفاده از &quot;when&quot; برای برخورد با کلاس های enumآیا به یاد دارید که چگونه کودکان از عبارات mnemonic برای حفظ کردن رنگ های رنگین کمان استفاده می کنند؟ یکی از آنها این است: &quot;ریچارد یورک بیهوده نبرد کرد!&quot; تصور کنید به تابعی نیاز دارید که برای هر رنگ یک mnemonic به شما بدهد (و نمی خواهید این اطلاعات را در خود enum ذخیره کنید). در جاوا می توانید از دستور switch برای این کار استفاده کنید. در ساختار کاتلین میتوایند از when استفاده کنید.دستور when مثل if، عبارتی است که مقداری را برمی گرداند، بنابراین می توانید تابعی را با expression body بنویسید و عبارت When را مستقیماً برمی گرداند. هنگامی که در ابتدای فصل در مورد توابع صحبت کردیم، نمونه ای از یک تابع چند خطی با expression body را قول دادیم. حالا یه مثالی در این مورد رو مورد بررسی قرار میدهیم. اون بخش از کد مربوط به مقدار رنگ ارسال شده را پیدا می کند. برخلاف جاوا، شما نیازی به نوشتن دستورات break در هر شاخه ندارید (اغلب باگ های کد جاوا‌ ، breakهای فراموش یا گم شده است ). در صورت تطبیق بودن ، فقط شاخه مربوطه اجرا می شود. همچنین می توانید چندین مقدار را در یک شاخه ترکیب کنید اگر آنها را با کاما از هم جدا کنید. در این مثال ها از enum constants با نام کامل خود استفاده می کنند و نام کلاس رنگ enum را مشخص می کنند. می توانید کد را با وارد کردن مقادیر ثابت ساده کنید.2.3.3 استفاده از “when” با objects دلخواهساختار When در کاتلین قدرتمندتر از switch در جاوا است. برخلاف switch ، که از شما می‌خواهد از ثابت‌ها (ثابت enum، رشته‌ها(strings)، یا اعداد حرفی) به‌عنوان شرایط شاخه استفاده کنید، when که به هر شیئی(objects) اجازه می‌دهد. بیایید تابعی بنویسیم که بتواند دو رنگ را در این پالت کوچک با هم ترکیب کند. شما گزینه های زیادی ندارید و می توانید به راحتی همه آنها را بنویسید.اگر رنگ‌های c1 و c2 قرمز و زرد (یا بالعکس) باشند، نتیجه اختلاط آنها نارنجی است و غیره. برای پیاده سازی این، از set برای مقایسه استفاده می کنید. کتابخانه استاندارد کاتلین شامل یک تابع setOf است که set حاوی اشیاء (objects) مشخص شده به عنوان آرگومان های آن را ایجاد می کند. set مجموعه ای است که ترتیب اقلام برای آن مهم نیست. دو مجموعه (set) اگر شامل موارد مشابهی باشند با هم برابرند. بنابراین، اگر مجموعه های setOf(c1, c2) و setOf(RED, YELLOW) برابر باشند، به این معنی است که یا c1 قرمز است و c2 زرد است، یا بالعکس. این دقیقاً همون چیزیه که می خواهیم بررسی کنید.عبارت When با آرگومان خود با همه شاخه ها مطابقت دارد تا زمانی که یک شرط شاخه برآورده شود. بنابراین setOf(c1, c2) برای مقایسه بررسی می شود: ابتدا با setOf(RED, YELLOW) و سپس با مجموعه رنگ های دیگر، یکی پس از دیگری. اگر هیچ یک از شرایط شاخه دیگر برآورده نشد، شاخه else ارزیابی می شود.توانایی استفاده از هر عبارتی به عنوان شرط شاخه when به شما امکان می دهد در بسیاری از موارد کد مختصر و زیبا بنویسید. در این مثال، شرط یک بررسی مقایسه ای است. در ادامه خواهید دید که چگونه شرط ممکن است هر عبارت Boolean ای باشد.2.3.4    استفاده از &quot;when&quot; بدون آرگومان ( argument )ممکن است متوجه شده باشید که فهرست 2.15 تا حدودی ناکارآمد است. هر بار که این تابع را فراخوانی می کنید، چندین نمونه Set ایجاد می کند که فقط برای بررسی اینکه آیا دو رنگ داده شده با دو رنگ دیگر مطابقت دارند یا خیر استفاده می شود. به طور معمول این مشکلی نیست، اما اگر تابع زیاد فراخوانی می شود، ارزش آن را دارد که کد را به روش دیگری بازنویسی کنید تا از ایجاد باگ جلوگیری کنید. شما می توانید این کار را با استفاده از عبارت Whenبدون آرگومان انجام دهید. کد کمتر و قابل خواندن است، اما این هزینه ا است که اغلب باید برای دستیابی به عملکرد بهتر بپردازید. اگر هیچ آرگومانی برای عبارت Whenارائه نشده باشد، شرط شاخه هر عبارت Boolean است. تابع mixOptimized همان کاری را انجام می دهد که mixقبلا انجام می داد. مزیت آن این است که هیچ شیء اضافی ایجاد نمی کند، اما هزینه آن این است که خواندن آن سخت تر است.بیایید پیش برویم و به نمونه‌هایی از ساختار when  نگاه کنیم که در آن smart casts وارد بازی می‌شوند2.3.5    اسمارت کست Smart casts : ترکیبی از checks  و  castsبه عنوان مثال برای این بخش، تابعی می نویسیم که عبارات ساده جمع دوعدد مانند (1 + 2) + 4 را ارزیابی می کند. عبارات فقط شامل یک نوع عمل می شوند: مجموع دو عدد. سایر عملیات های حسابی (تفریق، ضرب، تقسیم) را می توان به روشی مشابه اجرا کرد و شما می توانید آن را به عنوان تمرین انجام دهید.اول، چگونه عبارات را کد می کنید؟ شما آنها را در یک ساختار درخت مانند ذخیره می کنید، جایی که هر گره یک جمع (Sum) یا یک عدد (Num) است. Num همیشه یک گره برگ است، در حالی که یک گره Sum دو فرزند دارد: آرگومان های عملیات sum. فهرست زیر ساختار ساده ای از کلاس های مورد استفاده برای کد کردن عبارات را نشان می دهد: یک interface به نام Expr و دو کلاس Num و Sum که آن را پیاده سازی می کنند. توجه داشته باشید که Expr interface هیچ متدی را اعلام نمی کند. به عنوان یک interface نشانگر برای ارائه یک نوع مشترک برای انواع مختلف عبارات استفاده می شود. برای مشخص کردن اینکه یک کلاس یک interface را پیاده سازی می کند، از یک کولون (:) به دنبال نام interface استفاده می کنید:عبارت Sum به سمت آرگومان های چپ و راست از نوع Expr را ذخیره می کند. در این مثال کوچک، آنها می توانند Num یا Sum باشند. برای ذخیره عبارت (1 + 2) + 4 که قبلا ذکر شد، یک شی Sum(Sum(Num(1)، Num(2))، Num(4)) ایجاد می کنید. شکل 2.4 نمایش درختی آن را نشان می دهدحال بیایید نحوه محاسبه مقدار یک عبارت را بررسی کنیم. محاسبه عبارت مثلا باید 7 را برگرداند:&gt;&gt;&gt; println (eval&#40;Sum(Sum(Num(1&#41;, Num(2)), Num (4))))
7این Expr interface دو پیاده سازی دارد، بنابراین شما باید دو گزینه را امتحان کنید تا مقدار نتیجه را برای یک عبارت محاسبه کنید:  اگر عبارت یک عدد است ، مقدار مربوطه را برمی گردانید. اگر یک جمع است، باید عبارات چپ و راست را ارزیابی کرده و مجموع آنها را برگردانید.ابتدا به این تابع که به روش معمولی جاوا نوشته شده است نگاه می کنیم و سپس آن را به روش کاتلین بازسازی (refactor ) می کنیم. در جاوا، احتمالاً از دنباله ای از دستورات if برای بررسی گزینه ها استفاده می کنید، بنابراین بیایید از همان رویکرد در کاتلین استفاده کنیم.در کاتلین، شما با استفاده از یک is checkبررسی می کنید که آیا یک متغیر از نوع داده خاصی است یا خیر. اگر در C# برنامه نویسی کرده اید، این نماد باید آشنا باشد. is check مشابه instanceof در جاوا است. اما در جاوا، اگر بررسی کرده اید که یک متغیر دارای نوع داده خاصی است و نیاز به دسترسی به اعضای آن نوع داده دارد، باید یک castواضح و بررسی instanceofاضافه کنید. هنگامی که متغیر اولیه بیش از یک بار استفاده می شود، اغلب نتیجه cast را در یک متغیر جداگانه ذخیره می کنید. در کاتلین، کامپایلر این کار را برای شما انجام می دهد. اگر متغیر را برای نوع داده خاصی بررسی کنید، دیگر نیازی به cast آن ندارید. می توانید از آن به عنوان نوع داده مورد بررسی استفاده کنید. در واقع، کامپایلر، cast را برای شما انجام می دهد و ما آن را یک smart cast می نامیم.در تابع eval، پس از بررسی اینکه آیا متغیر e دارای نوع داده Num است یا خیر، کامپایلر آن را به عنوان متغیر Num تفسیر می کند. سپس می‌توانید به property مقدار Num بدون cast صریح: e.value دسترسی پیدا کنید.در مورد properties راست و چپ Sum هم همینطور است: شما فقط e.right و e.left را در contextمربوطه می نویسید. در IDE، این مقادیر smart-cast با رنگ پس‌زمینه تأکید می‌شوند، بنابراین به راحتی می‌توان فهمید که این مقدار از قبل بررسی شده است. شکل 2.5 را ببینید.اسمارت cast فقط در صورتی کار می کند که متغیری نتواند پس از بررسی (check) تغییر کند. هنگامی که از یک Smart Cast با property یک کلاس استفاده می کنید، مانند این مثال، property باید یک valباشد و نمی تواند یک دسترسی سفارشی داشته باشد. در غیر این صورت، نمی‌توان تأیید کرد که هر دسترسی به property همان مقدار را برمی‌گرداند.یک cast صریح به نوع داده خاص از طریق کلمه کلیدی as بیان می شود:val n = e as Numحال بیایید به نحوه تبدیل تابع eval به سبک کاتلین نگاه کنیم.2.3.6     تبدیل : جایگزینی &quot;if&quot; با &quot;when&quot;دستور if  در کاتلین چه فرقی با if در جاوا دارد؟ شما قبلا تفاوت را دیده اید. در ابتدای فصل، عبارت if را دیدید که در زمینه ای (context ) استفاده می شود که جاوا یک عملگر سه تایی دارد:  if (a &gt; b) a else b مانند جاوا a &gt; b ? a : b کار می کند؟ در کاتلین، عملگر سه تایی وجود ندارد، زیرا برخلاف جاوا، عبارت if مقداری را برمی گرداند. این بدان معنی است که شما می توانید تابع eval را برای استفاده از سینتکس expression-body  بازنویسی کنید، دستور return و پرانتزها را حذف کنید و به جای آن از عبارت if به عنوان بدنه تابع استفاده کنید.فهرست   2.19                استفاده   از if-expressions که   مقادیر را برمی گرداندfun eval&#40;e: Expr&#41;: Int = 
if (e is Num) {
e.value
} else if  (e is Sum) {
eval&#40;e.right&#41; + eval&#40;e.left&#41;
} else {
throw IllegalArgumentException(&amp;quotUnknown expression&amp;quot)
}
&gt;&gt;&gt; println(eval&#40;Sum(Num(1&#41;, Num(2))))
3اگر فقط یک عبارت در شاخه if وجود داشته باشد، اکولادها اختیاری هستند. اگر شاخه if یک بلوک باشد، آخرین عبارت در نتیجه برگردانده می شود.بیایید این کد را حتی بیشتر صیقل دهیم و با استفاده از when بازنویسی کنیم. که بیان به آن چک کردن مقادیر برای برابری، آن چیزی است که شما پیش از آن دیدم محدود نمی شود. در اینجا از شکل متفاوتی از هنگامی که شاخه ها استفاده می کنید استفاده می کنید و به شما این امکان را می دهد که نوع مقدار آرگومان when را بررسی کنید. درست مانند مثال if در فهرست 2.19 ، بررسی نوع از بازیگران هوشمند استفاده می کند ، بنابراین می توانید بدون ارسال اضافی به اعضای Num و Sum دسترسی داشته باشید .دو نسخه آخر کاتلین تابع eval را مقایسه کنید و به این فکر کنید که چگونه می توانید به عنوان جایگزینی برای دستورات عبارات if در کد خود نیز اعمال کنید. هنگامی که منطق شاخه پیچیده است، می توانید از یک بلوک به عنوان بدنه شاخه استفاده کنید. بیایید ببینیم این چگونه کار می کند.2.3.7     بلوک ها به عنوان شاخه های &quot;if&quot; و &quot;when&quot;هر دو if و when می توانند بلوک هایی را به عنوان شاخه داشته باشند. در این حالت، آخرین expression در بلوک نتیجه است. اگر می خواهید logging را مثلا به تابع اضافه کنید، می توانید این کار را در بلوک انجام دهید و آخرین مقدار را مانند قبل برگردانید.اکنون می توانید به گزارش های چاپ شده توسط تابع evalWithLoggingنگاه کنید و ترتیب محاسبه را دنبال کنید:&gt;&gt;&gt; println(evalWithLogging(Sum(Sum(Num(1), Num(2)), Num(4))))
num: 1
num: 2
sum: 1 + 2
num: 4
sum: 3 + 4
7قانون &quot;آخرین expression در یک بلوک نتیجه و خروجی است&quot; در همه مورد های که می توان از یک بلوک استفاده کرد و نتیجه که انتظار میرود بدست میاید. همانطور که در پایان این فصل خواهید دید، همین قانون برای عبارت try و catch کار می کند، و فصل 5 کاربرد آن را در lambda expressions مورد بحث قرار می دهد. اما همانطور که در بخش 2.2 اشاره کردیم، این قانون برای توابع معمولی صادق نیست. یک تابع می تواند دارای یک بدنه expression باشد که نمی تواند یک بلوک یا یک بدنه بلوکی با return statements صریح در داخل باشد.شما به وسیله کاتلین با روش های انتخاب اشیاء مناسب در بین اشیاء های دیگر آشنا شده اید. حالا زمان خوبیه تا ببینید چگونه اشیاء تکراری را می توانید بنویسید.2.4 تکرار موضوعات: حلقه های &quot;while&quot; و &quot;for&quot;از میان تمام ویژگی‌هایی که در این فصل بحث شد، تکرار(iteration) در کاتلین احتمالاً شبیه‌ترین ویژگی به جاوا است. حلقه while مشابه همان حلقه در جاوا است، بنابراین اول این بخش فقط به یادآوری مختصری نیاز دارد. حلقه for تنها به یک شکل وجود دارد که معادل حلقه for-each جاوا است. برای نوشتن &lt;item&gt; در &lt;elements&gt; مثل C# نوشته شده است. رایج ترین کاربرد این حلقه تکرار روی مجموعه ها است، درست مثل جاوا. ما بررسی خواهیم کرد که چگونه می تواند سایر سناریوهای حلقه را نیز پوشش دهد.2.4.1    حلقه تکرار  &quot;while&quot;کاتلین دارای حلقه های while و do-while است و syntax آنها با حلقه های مربوطه در جاوا تفاوتی ندارد:کاتلین چیز جدیدی به این حلقه های ساده نمی آورد، بنابراین ما معطل نمی شویم. بیایید به بحث در مورد کاربردهای مختلف حلقه forبپردازیم2.4.2    تکرار اعداد: محدوده ها و پیشرفت هایهمانطور که قبلاً اشاره کردیم، در کاتلین هیچ نظم جاوای برای حلقه های تکرار وجود ندارد، جایی که شما یک متغیر را مقداردهی اولیه می‌کنید، مقدار آن را در هر مرحله از حلقه به‌روزرسانی می‌کنید، و زمانی که مقدار به یک حد مشخص می‌رسد، از حلقه خارج می‌شوید. برای جایگزینی رایج ترین موارد استفاده از چنین حلقه هایی، کاتلین از مفاهیم  محدوده ها (ranges) استفاده می کند.یک محدوده(ranges) اساساً فقط یک فاصله بین دو مقدار است، معمولاً اعداد: شروع و پایان. شما آن را با استفاده از اوپراتور (..) می نویسید:val oneToTen = 1..10توجه داشته باشید که محدوده ها در کاتلین closed یا inclusive می شوند ، یعنی مقدار دوم همیشه بخشی از محدوده(range) است.مهمترین ترین کاری که با محدوده های اعداد صحیح می توانید انجام دهید این است که روی همه مقادیر حلقه بزنید. اگر بتوانید روی تمام مقادیر یک محدوده تکرار کنید، چنین محدوده ای را پیشرفت (progression) می نامند.بیایید از محدوده های اعداد صحیح برای بازی Fizz-Buzzاستفاده کنیم. این یک راه خوب برای زنده ماندن از یک سفر طولانی با ماشین و به یاد آوردن مهارت های تقسیم بندی فراموش شده خود است. بازیکنان به نوبت به صورت افزایشی شمارش می کنند و هر عددی که بر سه بخش پذیر باشد را با کلمه fizz و هر عددی که بر پنج بخش پذیر باشد را با کلمه buzz جایگزین می کنند. اگر عددی مضربی از سه و پنج باشد، می گویید . &quot;FizzBuzz&quot;لیست زیر پاسخ های مناسبی را برای اعداد 1 تا 100 چاپ می کند. توجه داشته باشید که چگونه شرایط ممکن را با عبارت when بدون آرگومان بررسی می کنید.فرض کنید بعد از یک ساعت رانندگی از این قوانین خسته شده اید و می خواهید کمی اوضاع را پیچیده کنید. بیایید از 100 به عقب شمارش کنیم و فقط اعداد زوج را در نظر بگیریم.حالا در حال تکرار روی یک پیشرفت(progression) هستید که دارای یک مرحله است که به آن اجازه می دهد از برخی اعداد عبور کند. همچنین گام منفی باشد، در این صورت پیشروی به جای جلو به عقب می رود. در این مثال، downTo 1 100 یک پیشرفت است که به عقب می رود ( یکی کم میشود). بعد گام را با حفظ جهت، مقدار گام را به 2 تغییر می دهد (در واقع، گام را روی -2 تنظیم می کند یعنی دوتا دوتا کم شود).همانطور که قبلا ذکر کردیم، syntax .. همیشه محدوده ای ایجاد می کند که شامل نقطه پایانی (مقدار سمت راست .. ) می شود. در بسیاری از موارد، تکرار در محدوده‌های نیمه بسته، که نقطه پایانی مشخص‌شده ندارد، راحت‌تر است. برای ساخت این محدوده از تابع while استفاده کنید. به عنوان مثال، حلقه (x in 0 until size) for معادل for (x in 0..size-1) است، اما این ایده را تا حدودی واضح تر بیان می کند. بعداً، در بخش 3.4.3، در این مثال‌ها درباره سینتکس for downTo, step و until بیشتر خواهید آموخت.میببینید که چطور کار با محدوده ها(ranges) و پیشرفت ها(progressions) به شما کمک کرد تا با قوانین پیشرفته بازی FizzBuzz کنار بیایید. حالا بیایید به نمونه های دیگری که از حلقه forاستفاده می کنند نگاه کنیم.2.4.3 تكرار بر روي maps هاما اشاره کرده ایم که رایج ترین سناریو استفاده از for ... در حلقه تکرار روی یک مجموعه است. این دقیقاً عین جاوا کار می کند، بنابراین ما چیز زیادی در مورد آن نمی گوییم. ببینیم در عوض چگونه می‌توانید روی map تکرار کنید.به عنوان مثال، ما به یک برنامه کوچک نگاه خواهیم کرد که نمایش های باینری را برای کاراکترها چاپ می کند. شما این نمایش های باینری را در یک نقشه (فقط برای واضح شدن اهداف) ذخیره خواهید کرد. کد زیر یک map ایجاد می کند، آن را با نمایش های دودویی برخی از حروف پر می کند و سپس محتوای map را چاپ می کند.سینتکس (Syntax) .. برای ایجاد یک محدوده نه تنها برای اعداد، بلکه برای کاراکترها نیز کار می کند. در اینجا از آن برای تکرار روی همه کاراکترها از A تا F و از جمله F استفاده می‌کنید.فهرست 2.24 نشان می‌دهد که حلقه for به شما امکان می‌دهد تا یک عنصر از مجموعه‌ای را که روی آن تکرار می‌کنید باز کنید (در این مورد، مجموعه‌ای از جفت‌های key/value  در map ). شما نتیجه باز کردن بسته بندی را در دو متغیر جداگانه ذخیره می کنید: key حروف را دریافت می کند و value باینری را دریافت می کند. بعداً، در بخش 7.4.1، درباره این syntax باز کردن بسته‌بندی اطلاعات بیشتری خواهید یافت.یکی دیگر از ترفندهای خوب مورد استفاده در فهرست 2.24، syntax مختصر برای دریافت و به روز رسانی values یک map توسط key است. به جای فراخوانی get و put، می توانید از map[key] برای خواندن مقادیر و map[key] = value برای تنظیم آنها استفاده کنید. کدbinaryReps[c] = binaryهمین کد به زبان جاوا:binaryReps.put(c, binary)خروجی مشابه زیر است (ما آن را به جای یک ستون در دو ستون مرتب کرده ایم):A = 1000001       E = 1000101
D = 1000100       C = 1000011
B = 1000010       F = 1000110می‌توانید از همان syntax باز کردن برای تکرار روی یک مجموعه و در حین نگهداری مسیر از بخش رایج  index of استفاده کنید. برای ذخیره کردن ایندکس و افزایش آنبصورت دستی نیازی به ایجاد یک متغیر جداگانه نداریداین کد اونی که انتظار دارید چاپ می کنه:0: 10
1: 11
2: 1001در فصل بعدی مکان WithIndex را بررسی خواهیم کرد.شما دیده اید که چگونه می توانید از کلمه کلیدی in برای تکرار در یک محدوده(range) یا مجموعه استفاده کنید.همچنین می توانید از in برای بررسی اینکه آیا یک مقدار متعلق به محدوده یا مجموعه است استفاده کنید..2.4.4      استفاده از &quot;in&quot; برای بررسی عضویت مجموعه و محدودهشما از عملگر in برای بررسی اینکه آیا یک مقدار در یک محدوده است یا مخالف آن، !in استفاده می کنید تا بررسی کنید که آیا یک مقدار در یک محدوده نیست. در اینجا نحوه استفاده از in برای بررسی تعلق یک کاراکتر به طیفی از کاراکترها آمده است. این تکنیک برای بررسی اینکه آیا یک کاراکتر یک حرف است، ساده به نظر می رسد. در زیر پوشش، هیچ اتفاق سختی نمی‌افتد: بررسی می‌کنید که کد کاراکتر جایی بین کد حرف اول و کد حرف آخر باشد. اما این منطق به طور خلاصه در اجرای کلاس های محدوده(range) در کتابخانه استاندارد پنهان است:عملگرهای in و !in نیز در عبارات When کار می کنند.محدوده ها نیز به کاراکترها محدود نمی شوند. اگر کلاسی دارید که از مقایسه نمونه ها پشتیبانی می کند (با پیاده سازی اینترفیس  java.lang.Comparable)، می توانید محدوده هایی از objects آن نوع داده ایجاد کنید. اگر چنین محدوده ای دارید، نمی توانید همه اشیاء را در محدوده بکنید. در مورد آن فکر کنید: می توانید، برای مثال، تمام رشته های بین &quot;جاوا&quot; و &quot;کاتلین&quot; را برشمارید؟ نه، شما نمی توانید. اما همچنان می توانید با استفاده از عملگر inبررسی کنید که آیا شی دیگری به محدوده تعلق دارد یا خیر: توجه : رشته ها در اینجا بر اساس حروف الفبا مقایسه می شوند، زیرا کلاس String اینگونه Comparable interface را پیاده سازی می کند.همین بررسی با مجموعه ها نیز کار می کند:بعداً، در بخش 7.3.2، نحوه استفاده از محدوده‌ها و پیشرفت‌ها با انواع داده‌های خود را خواهید دید و به طور کلی با چه اشیایی می‌توانید از  in برای بررسی استفاده کنید.یک گروه دیگر از عبارات جاوا وجود دارد که می خواهیم در این فصل به آنها نگاه کنیم: عباراتی برای برخورد با استثناها (exceptions).2.5 استثنا(Exceptions) در کاتلینمدیریت استثناها در کاتلین مشابه روشی است که در جاوا و بسیاری از زبان های دیگر انجام می شود. یک تابع می تواند به صورت عادی کامل شود یا در صورت بروز خطا، یک استثنا ایجاد کند. فراخوان تابع (جایی که تابع را صدا و استفاده میکنیم) می تواند این استثنا را بگیرد و آن را پردازش کند. اگر اینطور نباشد، استثنا دوباره در پشته(stack) قرار می گیرد.شکل اصلی دستورات رسیدگی به استثنا در کاتلین شبیه به جاوا است. شما یک استثنا را به شیوه ای بدون غافلگیری مطرح می کنید:if (percentage !in 0..100) {
throw IllegalArgumentException(
&amp;quotA percentage value must be between 0 and 100: $percentage&amp;quot)
}مانند سایر کلاس‌ها، لازم نیست از کلمه کلیدی new برای ایجاد یک نمونه استثنا استفاده کنید.بر خلاف جاوا، در کاتلین ساختار throw یک عبارت است و می تواند به عنوان بخشی از عبارات دیگر استفاده شود:در این مثال، اگر شرط برآورده شود، برنامه به درستی رفتار می کند و متغیر درصد (percentage) با عدد(number) مقدار دهی اولیه می شود. در غیر این صورت، یک استثنا ایجاد می شود و متغیر مقداردهی اولیه نمی شود. ما جزئیات فنی throw را به عنوان بخشی از عبارات دیگر در بخش 6.2.6 مورد بحث قرار خواهیم داد.2.5.1     دستورات  &quot; try”, “catch”, and “finally&quot;همانطور که در جاوا، شما از ساختار try با دستورات catch و finally برای رسیدگی به استثناها استفاده می کنید. می‌توانید آن را در فهرست زیر ببینید، که یک خط از فایل داده شده را می‌خواند، سعی می‌کند آن را به عنوان یک عدد تجزیه کند، و اگر که شماره خط معتبر نباشد یکی از اعداد یا null برمیگرداند بزرگترین تفاوت کاتلین با جاوا این است که عبارت throws در کد وجود ندارد: اگر این تابع را در جاوا بنویسید، صراحتاً throws IOException را بعد از اعلام تابع می‌نویسید. شما باید این کار را انجام دهید زیرا IOException یک استثناء بررسی شده است. در جاوا، این یک استثنا است که باید به طور صریح رسیدگی شود. شما باید تمام استثناهای بررسی شده را که تابع شما می تواند پرتاب کند، اعلام کنید، و اگر تابع دیگری را فراخوانی کنید، باید استثناهای بررسی شده آن را مدیریت کنید یا اعلام کنید که تابع شما می تواند آنها را نیز پرتاب کند.درست مانند بسیاری دیگر از زبان‌های مدرن JVM، کاتلین بین استثناهای چک شده و چک نشده تفاوتی قائل نمی‌شود. شما استثناهای ایجاد شده توسط یک تابع را مشخص نمی کنید، و ممکن است هر استثنایی را مدیریت کنید یا نکنید. این تصمیم طراحی بر اساس تمرین استفاده از استثناهای بررسی شده در جاوا است. تجربه نشان داده است که قوانین جاوا اغلب به کدهای بی‌معنی زیادی برای بازگرداندن یا نادیده گرفتن استثناها نیاز دارند، و قوانین به طور مداوم از شما در برابر خطاهایی که ممکن است رخ دهد محافظت نمی‌کنند.به عنوان مثال، در فهرست 2.27، NumberFormatException یک استثنا نیست. بنابراین، کامپایلر جاوا شما را مجبور به گرفتن آن نمی کند و به راحتی می توانید مشاهده کنید که این استثنا در زمان اجرا اتفاق می افتد. این مایه تاسف است، زیرا داده‌های ورودی نامعتبر یک وضعیت رایج است و باید با ظرافت با آنها رفتار شود. در همان زمان، متد BufferedReader.close می‌تواند یک IOException ایجاد کند، که یک استثنا بررسی شده است و باید مدیریت شود. اگر بستن یک جریان با شکست مواجه شود، اکثر برنامه‌ها نمی‌توانند هیچ اقدام معنی‌داری انجام دهند، بنابراین کد مورد نیاز برای گرفتن استثنا از متد close ، boilerplate است.در مورد جاوا7  try-with-resources چطور؟ کاتلین دستور خاصی برای این کار ندارد. به عنوان یک تابع کتابخانه پیاده سازی شده است. در بخش 8.2.5، خواهید دید که چگونه این امکان وجود دارد.2.5.2     عبارت &quot; try &quot; به عنوان یک expressionبرای مشاهده تفاوت مهم دیگر بین جاوا و کاتلین، اجازه دهید مثال را کمی اصلاح کنیم. بیایید بخش finally را حذف کنیم (زیرا قبلاً نحوه عملکرد آن را دیده‌اید) و مقداری کد برای چاپ شماره‌ای که از فایل خوانده‌اید اضافه می‌کنیم.کلمه کلیدی try در کاتلین، درست مانند if و when، یک expression را معرفی می کند و می توانید مقدار آن را به یک متغیر اختصاص دهید. برخلاف if، شما همیشه باید بدنه عبارت را در اکولاد قرار دهید. درست مانند سایر دستورات، اگر بدنه شامل چند expressions باشد، مقدار عبارت try به عنوان مجموع مقدار آخرین expression است.این مثال یک عبارت بازگشتی را در بلوک catchقرار می دهد، بنابراین اجرای تابع بعد از بلوک catch ادامه نمی یابد. اگر می خواهید اجرا را ادامه دهید، شرط کش catch clause نیز باید مقداری داشته باشد که مقدار آخرین عبارت در آن خواهد بود. در اینجا نحوه کار را میبینیم.اگر اجرای یک بلوک کد try به طور معمول رفتار کند، آخرین عبارت در بلوک نتیجه است. اگر یک استثنا گرفته شود، آخرین عبارت در یک بلوک catchمربوطه نتیجه است. در فهرست 2.29، اگر NumberFormatException گرفته شود، مقدار نتیجه صفر است.در این مرحله، اگر حوصله ندارید، می‌توانید برنامه‌هایی را در کاتلین بنویسید که شبیه به نحوه کدنویسی در جاوا است. همانطور که این کتاب را می خوانید، یاد خواهید گرفت که چگونه روش های معمول تفکر خود را تغییر دهید و از تمام قدرت زبان جدید استفاده کنید.1.6 خلاصهکلمه کلیدی fun برای اعلام یک تابع استفاده می شود. کلمات کلیدی val و var به ترتیب متغیرهای فقط خواندنی و متغیرهای قابل تغییر را اعلام می کنند.قالب های رشته (String templates) به شما کمک می کند از سلسله رشته های پر دردسر جلوگیری کنید. نام متغیر را با $ پیشوند یا یک expression را با اکولاد ${ } احاطه کنید تا مقدار آن به رشته تزریق شود.کلاس های Value-object به روشی مختصر در کاتلین بیان می شوند. آشنایی با  if اکنون یک expression با مقدار بازگشتی است.عبارت When مشابه switch در جاوا است اما قدرتمندتر استشما مجبور نیستید یک متغیر را به طور صریح پس از بررسی اینکه نوع خاصی دارد ارسال کنید: کامپایلر آن را به طور خودکار با استفاده از یک پخش هوشمند(smart cast) برای شما ارسال می کند.حلقه‌های for، while و do-while مشابه مشابه‌های خود در جاوا هستند، اما حلقه for اکنون راحت‌تر است، به‌ویژه زمانی که نیاز به تکرار روی map یا مجموعه‌ای با index دارید.سینتکس syntax مختصر 1..5 یک محدوده (range) ایجاد می کند. محدوده‌ها و پیشرفت‌ها به کاتلین اجازه می‌دهند تا از یک syntax یکنواخت و مجموعه‌ای از abstractions در حلقه‌ها استفاده کند و همچنین با عملگرهای in و in! کار کند که بررسی می‌کنند آیا یک مقدار به یک محدوده تعلق دارد یا خیر.مدیریت استثنا در کاتلین بسیار شبیه به جاوا است، با این تفاوت که کاتلین از شما نمی خواهد استثناهایی را که می تواند توسط یک تابع ایجاد شود را اعلام کنید.بخش سوم از فصل اول را در اینجا مشاهده کنید</description>
                <category>فرید محمدی</category>
                <author>فرید محمدی</author>
                <pubDate>Sat, 27 Nov 2021 15:06:38 +0330</pubDate>
            </item>
                    <item>
                <title>ترجمه کتاب Kotlin in Action</title>
                <link>https://virgool.io/@FaridMohammadi/%D8%AA%D8%B1%D8%AC%D9%85%D9%87-%DA%A9%D8%AA%D8%A7%D8%A8-kotlin-in-action-c99vxllvl9ia</link>
                <description>قسمت 1معرفی کاتلینهدف این بخش از کتاب این است که شما را در نوشتن کد  کاتلین که از API های موجود استفاده می کند ، بهره مند سازید.فصل 1 شما را با ویژگی های کلی کاتلین آشنا می کند. در فصل های 2-4 ، خواهید آموخت که چگونه اساسی ترین مفاهیم برنامه نویسی جاوا-دستورات ، functions، classesو  types—mapهای کد کاتلین مطابقت دارد و چگونه کاتلین آنها را غنی می کند تا برنامه نویسی دلپذیرتر شود.شما می توانید بر دانش موجود خود در زمینه جاوا و همچنین به کمک ابزارهایی مانند ویژگی های کد نویسی IDE و مبدل جاوا به کاتلین تکیه کنید تا سرعت خود را به سرعت افزایش دهید. در فصل 5 ، خواهید فهمید که چگونه lambdas به شما کمک می کند تا برخی از رایج ترین وظایف برنامه نویسی ، مانند کار با مجموعه ها را به طور موثر حل کنید. سرانجام ، در فصل 6 ، با یکی از ویژگی های تخصصی کلیدی کاتلین آشنا می شوید: پشتیبانی آن برای مقابله با مقادیر null .Kotlin :What and whyاین فصل را پوشش می دهدنمایش اولیه کاتلینویژگی های اصلی زبان کاتلینامکاناتی برای توسعه اندروید و سمت سرورآنچه کاتلین را از زبان های دیگر متمایز می کندنوشتن و اجرای کد در کاتلینکاتلین در مورد چیست؟ این یک زبان برنامه نویسی جدید است که platform جاوا را هدف قرار می دهد.  کاتلین مختصر ، ایمن ، عملگرا (pragmatic ) و متمرکز بر قابلیت همکاری با کد جاوا است. تقریباً در همه جا می توان از جاوا استفاده کرد: امروزه برای توسعه سمت سرور ، برنامه های Android و موارد دیگر. کاتلین با تمام کتابخانه ها و frameworks های جاوا عالی کار می کند و با همان سطح کارایی جاوا اجرا می شود. در این فصل ، ما ویژگی های اصلی کاتلین را با جزئیات بررسی می کنیم.1.1  طعم کاتلینبیایید با یک مثال کوچک شروع کنیم تا نشان دهیم که کاتلین چگونه است. این مثال کلاس Person را تعریف می کند ، مجموعه ای از افراد را ایجاد می کند ، قدیمی ترین را پیدا می کند و نتیجه را چاپ می کند. حتی در این قطعه کد کوچک ، می توانید بسیاری از ویژگی های جالب کاتلین را مشاهده کنید. ما برخی از آنها را برجسته کرده ایم تا بتوانید بعداً به راحتی آنها را در کتاب پیدا کنید. کد به طور خلاصه توضیح داده شده است ، اما اگر چیزی فوراً مشخص نشد نگران نباشید. ما بعداً همه چیز را با جزئیات بحث خواهیم کرد. اگر می خواهید این مثال را اجرا کنید ، ساده ترین گزینه این است که از زمین بازی آنلاین به آدرس http://try.kotl.in  استفاده کنید . مثال را وارد کرده و روی دکمه Run کلیک کنید تا کد اجرا شود.شما یک کلاس داده ساده با دو ویژگی اعلان می کنید: نام و سن. ویژگی سن به طور پیش فرض null است (اگر مشخص نشده باشد). هنگام ایجاد لیست افراد ، سن آلیس را حذف می کنید ، بنابراین مقدار پیش فرض null استفاده می شود. سپس از تابع maxBy برای پیدا کردن مسن ترین فرد در لیست استفاده می کنید. عبارت lambda که به تابع منتقل می شود یک پارامتر می گیرد و شما از آن به عنوان نام پیش فرض آن پارامتر استفاده می کنید. Elvis operator  (؟ :) اگر سن null باشد صفر را برمی گرداند. از آنجا که سن آلیس مشخص نیست ، اپراتور الویس آن را با صفر جایگزین می کند ، بنابراین باب جایزه را به عنوان مسن ترین فرد دریافت می کند.آیا آنچه را دیده اید دوست دارید؟ ادامه مطلب را مطالعه کنید تا بیشتر بیاموزید و متخصص کاتلین شوید. امیدواریم به زودی چنین کدی را در پروژه های خود مشاهده کنید ، نه تنها در این کتاب.1.2  ویژگی های اصلی کاتلیناحتمالاً شما از قبلاً ایده ای دارید که زبان کاتلین چیست. بیایید ویژگی های کلیدی آن را با جزئیات بیشتری بررسی کنیم. ابتدا بیایید ببینیم چه نوع برنامه هایی را می توانید با کاتلین بسازید.1.2.1       سیستم عامل های هدف: سمت سرور ، اندروید ، هرجایی که جاوا اجرا شودهدف اصلی کاتلین ارائه یک جایگزین مختصر تر، سازنده تر(productive) و ایمن تر برای جاوا است که در همه زمینه هایی که جاوا امروزه استفاده می شود مناسب باشد. جاوا یک زبان بسیار محبوب است و از آن در محیط های بسیار متنوعی استفاده می شود ، از کارت های هوشمند (فناوری جاوا کارت) گرفته تا بزرگترین مراکز داده که توسط گوگل ، توییتر ، لینکدین و سایر شرکت های بزرگ اینترنتی اداره می شود. در اکثر این مکانها، استفاده از کاتلین میتواند به توسعهدهندگان کمک کند تا با کد کمتر و مزاحمتهای کمتر در مسیر دستیابی به اهداف خود داشته باشند.رایج ترین مکان برای استفاده از کاتلین :ایجاد کد سمت سرور (معمولاً backends برنامه های وب)ساخت برنامه های تلفن همراه که بر روی دستگاه های Android اجرا می شونداما کاتلین در زمینه های دیگر نیز کار می کند. به عنوان مثال ، می توانید از Intel Multi- OS E ngine برای جرای کد کاتلین در دستگاه های  iOS استفاده کنید.( https://software.intel.com/en-us/multi-os-engine ) برای ساخت برنامه های کامپیوتری ، می توانید از کاتلین به همراه TornadoFX  و Java FX استفاده کنید . ( https://github.com/edvin/tornadofx )علاوه بر جاوا ، کاتلین را می توان به جاوا اسکریپت کامپایل کرد و به شما امکان می دهد کد کاتلین را در مرورگر اجرا کنید. اما تا زمان نگارش این مقاله ، پشتیبانی جاوا اسکریپت هنوز در حال بررسی و نمونه اولیه در JetBrains است ، پس در این کتاب نمیگنجه. سیستم عامل های دیگر نیز برای نسخه های بعدی زبان در حال بررسی است.همانطور که می بینید ، هدف کاتلین بسیار گسترده است. کاتلین رو یک مشکل دامنه یا آدرس تمرکز نمی کند یا به یک نوع چالش که امروزه توسعه دهندگان نرم افزار با آن روبرو هستند ، پاسخ نمی دهد. در عوض ، بهبود بهره وری را برای همه کار هایی که در طول فرآیند توسعه ایجاد می شود ، ارائه می دهد. این به شما یک سطح عالی از ادغام با کتابخانه هایی را می دهد که specific domains  یا  programming paradigms را پشتیبانی می کنند. بیایید در ادامه ویژگی های کلیدی کاتلین به عنوان یک زبان برنامه نویسی را بررسی کنیم.1.2.2       Statically typedدرست مانند جاوا ، کاتلین یک زبان برنامه نویسی استاتیک است. این بدان معناست که نوع هر عبارت در یک برنامه در زمان کامپایل مشخص است و کامپایلر می تواند تأیید کند که   methods ها و fields هایی که می خواهید به آنها دسترسی پیدا کنید در objects هایی که استفاده می کنید وجود دارد. این برخلاف زبان های برنامه نویسی پویا است ، که در JVM ، از جمله Groovy و JR uby نشان داده شده است. این زبانها به شما امکان میدهند متغیرها و توابعی را تعریف کنید که میتوانند دادهها را از هر نوع ذخیره کرده یا برگردانند و رفرنس های method  و fieldرا در زمان اجرا حل کنند. این اجازه می دهد تا کد کوتاه تر و انعطاف پذیری بیشتری در ایجاد ساختارهای داده ایجاد شود. اما نکته منفی این است که مشکلاتی مانند غلط املایی نام های را نمی توان در طول کامپایل شناسایی کرد و می تواند منجر به خطاهای runtime شود.از طرف دیگر، برخلاف جاوا، کاتلین از شما نمی خواهد که نوع هر متغیر را به صراحت در کد خود مشخص کنید. در بسیاری از موارد، نوع متغیر را می توان به طور خودکار از روی context تعیین کرد و به شما این امکان را می دهد که نوع متغییر را حذف کنید. در اینجا ساده ترین مثال ممکن در این مورد آمده است:val x = 1شما یک متغیر را اعلام می کنید و چون با یک مقدار صحیح مقداردهی اولیه شده است، کاتلین به طور خودکار تعیین می کند که نوع آن Int است. توانایی کامپایلر برای تعیین انواع از context  ، type inference نامیده می شوددر زیر برخی از مزایای static typing آورده شده است:عملکرد (Performance) - استفاده از methods سریعتر است، زیرا نیازی نیست در زمان اجرا بفهمیم کدام method باید فراخوانی شود.قابلیت اطمینان –(Reliability) کامپایلر صحت برنامه را تأیید می کند ، پس احتمال خرابی در زمان اجرا کمتر است.قابلیت نگهداری(Maintainability) - کار با کد ناآشنا آسان تر است زیرا می توانید ببینید کد با چه نوع objects هایی کار می کند.پشتیبانی از ابزار –( Tool support) تایپ استاتیک ( Static typing) بازسازی را قابل اعتماد، تکمیل کد را دقیق و سایر ویژگی های IDE را امکان پذیر می کند.به لطف حمایت کاتلین از inference ، بیشتر کلمات اضافی مرتبط با static typing از بین می رود ، زیرا نیازی به بیان صریح نوع متغییر ندارید. اگر به مشخصات سیستم نوع مغییرکاتلین نگاه کنید، مفاهیم آشنای زیادی خواهید یافت. Classes ، interfaces و generics روششون بسیار شبیه جاوا کار می کنند، پس پس با دانش جاوا شما باید به راحتی به کاتلین سوییچ کنید. هر چند بعضی چیزها جدید هستند.مهمترین آنها پشتیبانی کاتلین از انواع nullable است ، که به شما امکان تشخیص موارد استثناء اشاره گر  nullدر زمان کامپایل را میدهد ، پس میتونید برنامه های مطمئن تری بنویسید. بعداً در این فصل به انواع nullable باز می گردیم و در فصل 6 به تفصیل در مورد آنها صحبت می کنیم.یکی دیگر از موارد جدید در کاتلین ، پشتیبانی از function types است . برای دیدن این که موضوع چیست ، بیایید ایده های اصلی برنامه نویسی functional را بررسی کنیم و ببینیم که چگونه در کاتلین پشتیبانی می شود.1.2.3       کاربردی و شی گرا Functional and object-orientedشما به عنوان توسعه دهنده جاوا بدون شک با مفاهیم اصلی برنامه نویسی شی گرا آشنا هستید ، اما برنامه نویسی functional  ممکن است برای شما تازگی داشته باشد. مفاهیم کلیدی برنامه نویسی functional به شرح زیر است:توابع درجه یک-( First-class functions) شما با توابع (pieces of behavior) به عنوان مقادیر کار می کنید. می توانید آنها را در متغیرها ذخیره کنید ، آنها را به عنوان پارامتر ارسال کنید یا آنها را از functions دیگر برگردانید.تغییرناپذیری(Immutability ) – شما با objects تغییرناپذیر کار می کنید، که وضعیت انها بعد از ایجادشون تغییر نمیکنه .بدون عوارض جانبی (No side effects )-  شما از توابع خالصی استفاده می کنید که با ورودی های یکسان نتیجه یکسانی را برمی گرداند و وضعیت اشیاء دیگر را تغییر نمی دهد یا با دنیای خارج تعامل ندارد.نوشتن کد به سبک functional چه مزایایی دارد؟ اول، مختصر بودن. کد Functional می تواند در مقایسه با نمونه imperative آن زیبا و مختصر باشد ، زیرا کارکردن با functions به عنوان values به شما قدرت abstraction بسیار بیشتری می دهد ، که به شما امکان می دهد از تکرار کد خود جلوگیری کنید.تصور کنید که دو قطعه کد مشابه دارید که وظیفه مشابهی را پیاده سازی می کنند (به عنوان مثال، به دنبال یک عنصر منطبق در یک مجموعه می گردند) اما در جزئیات (نحوه شناسایی عنصر منطبق) متفاوت هستند. شما به راحتی می توانید قسمت مشترک این عملیات  را در یک function بریزید  و قسمت های مختلف را به عنوان آرگومان ارسال کنید. آن آرگومان ها خود function هستند، اما می توانید آنها را با استفاده از یک  syntax مختصر به نام لامبدا (lambda ) برای function ها بیان کنید :دومین مزیت کد  functional ،multithreading  ایمن است . یکی از بزرگترین خطاها در برنامه های multithreading  ، اصلاح داده های یکسان از چندین thread بدون هم زمان سازی مناسب است. اگر از ساختارهای داده  تغییر ناپذیر (immutable ) و توابع خالص (pure functions) استفاده می کنید ، مطمئن باشید که چنین تغییرات ناامنی رخ نخواهد داد و نیازی به طرح های پیچیده هم زمان (synchronization)  سازی ندارید.در نهایت ، برنامه نویسی functional یعنی آزمایش آسان تر است .  Functions های بدون عوارض جانبی را می توان به صورت مجزا و بدون نیاز به کد راه اندازی زیادی برای ساختن کل محیطی که به آن وابسته است، تست کردبه طور کلی، سبک functional را می توان با هر زبان برنامه نویسی از جمله جاوا استفاده کرد و بسیاری از بخش های آن به عنوان استایل (style) برنامه نویسی خوب مطرح می شود. اما همه زبانها پشتیبانی syntactic و کتابخانهای (library) لازم برای استفاده بیدردسر از آن را فراهم نمیکنند. به عنوان مثال، این پشتیبانی بیشتر در نسخههای جاوا قبل از جاوا 8 وجود نداشت. این موارد شامل موارد زیر است:فانکشن Function types ، به توابع اجازه می دهد تا توابع دیگر را به عنوان پارامتر دریافت کرده یا توابع دیگر را برگردانندلامبدا Lambda expressions ، به شما امکان می دهد بلوک های کد را با حداقل تکرار بنویسیددیتا کلاس Data classes ، ارائه یک syntax مختصر برای ایجاد اشیاء با مقادیر تغییرناپذیر (immutable value objects)  مجموعه ای غنی از API ها در کتابخانه استاندارد برای کار با اشیاء و مجموعه ها با استایل functionalکاتلین به شما امکان می دهد به سبک functional برنامه ریزی کنید اما آن را اجرا نمی کند. هنگامی که به آن نیاز دارید، می توانید با مقادیر قابل تغییر کار کنید و توابعی را بنویسید که دارای عوارض جانبی هستند بدون اینکه از حلقه های اضافی عبور کنید. و البته کار با فریمورک هایی (frameworks) که متکی به  interfaces و سلسله مراتب کلاس ها هستند به همان راحتی جاوا است. هنگام نوشتن کد در کاتلین ، می توانید هر دو رویکرد شی گرا و functional را ترکیب کنید و از ابزارهایی استفاده کنید که برای حل مشکلتان مناسب هستند.1.2.4       رایگان و منبع باززبان کاتلین ، از جمله کامپایلر ، کتابخانه ها و همه ابزارهای مرتبط ، کاملاً منبع باز است و برای هر مقصودی رایگان است. این تحت مجوز Apache 2 موجود است. توسعه در سایتGitHub ( http://github.com/ jetbrains / kotlin )  انجام می شود و از مشارکت های همه استقبال می شود. شما همچنین می توانید از سه IDE منبع باز برای توسعه برنامه های کاتلین خود استفاده کنید: IntelliJ IDEA Community Edition ، Android Studio و Eclipse به طور کامل پشتیبانی می شوند. ( البته ، IntelliJ IDEA  نسخه نهایی هست که به خوبی کار میکند)حالا که فهمیدید زبان کاتلین چه نوع زبانیه ، بیایید ببینیم مزایای خاص و عملی کاتلین چیه که در applications کار می کند.1.3  برنامه های کاربردی کاتلینهمانطور که قبلا اشاره کردیم، دو حوزه اصلی که می توان از کاتلین استفاده کرد، سمت سرور و توسعه اندروید است. بیایید به آن دو حوزه نگاه کنیم و ببینیم که چرا کاتلین برای آنها مناسب است.1.3.1       کاتلین در سمت سروربرنامه نویسی سمت سرور یک مفهوم نسبتاً گسترده است. این شامل همه انواع برنامه های زیر و موارد دیگر است:برنامه هایApp   Web که صفحات HTML را به مرورگر باز می گردانندبَکنِد Backendsبرنامه های تلفن همراه که JSON API را بر روی HTTP نشان می دهدسرویس های خرد(Microservices ) که از طریق پروتکل RPC با سایر سرویس های کوچک ارتباط برقرار می کنندتوسعه دهندگان سال هاست که این نوع برنامه ها را در جاوا می سازند و مجموعه عظیمی از چارچوب ها (frameworks ) و فناوری ها را برای کمک به ساخت آنها جمع آوری کرده اند. چنین برنامه هایی معمولاً به صورت مجزا توسعه نمی یابند یا از ابتدا شروع نمی شوند. تقریباً همیشه یک سیستم موجود وجود دارد که در حال توسعه، بهبود یا جایگزینی است، و کد جدید باید با بخشهای موجود سیستم، که ممکن است سالها پیش نوشته شده باشد، ادغام شود.مزیت بزرگ کاتلین در این محیط، قابلیت همکاری یکپارچه آن با کد جاوا موجود است. صرف نظر از اینکه یک سری کد جدید می نویسید یا کد یک سرویس موجود را به کاتلین منتقل می کنید، کاتلین دقیقاً در آن جا درست سازگار می شود.وقتی که نیاز به گسترش کلاس های جاوا در کاتلین یا annotate متدها و فیلدهای یک کلاس به روش خاصی داشته باشید، با مشکل مواجه نخواهید شد. و مزیت این است که کد سیستم فشرده تر، قابل اطمینان تر و نگهداری آسان تر خواهد بود.در عین حال.کاتلین تعدادی از تکنیک های جدید را برای توسعه چنین سیستم هایی فعال می کند. به عنوان مثال، پشتیبانی آن از Builder pattern به شما امکان می دهد هر شیء گرافیکی را با syntax های مختصر و کوتاه ایجاد کنید، در حالی که مجموعه کامل ابزارهای abstraction و استفاده مجدد از کد را در زبان نگه دارید.یکی از ساده ترین موارد استفاده از آن خصوصیت (feature) ، یک کتابخانه تولید HTML است که می تواند یک الگوی زبان خارجی را با یک راه حل مختصر و کاملاً ایمن جایگزین کند.در اینجا مثالی آورده شده است:شما به راحتی می توانید توابعی را که به تگ های HTML و ساختارهای معمولی زبان کاتلین ترکیب کنید. شما دیگر نیازی به استفاده از یک زبان با template جداگانه، با یک syntax جداگانه برای یادگیری ، فقط برای استفاده از یک حلقه هنگام تولید یک صفحه HTML ندارید.مورد دیگری که می توانید از DSL های تمیز و مختصر کاتلین استفاده کنید، فریمورک های (frameworks ) ماندگاری است. به عنوان مثال، frameworkExposur ( https://github.com/jetbrains/exposed ) یک DSL آسان برای توصیف ساختار یک پایگاه داده SQL و انجام queries ها به طور کامل از کد Kotlin، با بررسی کامل نوع داده ( type ) ، فراهم می کند. در اینجا یک مثال کوچک برای نشان دادن آنچه ممکن است وجود دارد:ما بعداً در کتاب ، در بخش 7.5 و در فصل 11 ، این تکنیک ها را با جزئیات بیشتری بررسی خواهیم کرد.1.3.2       کاتلین در اندرویدیک اپلیکیشن موبایل معمولی با یک اپلیکیشن معمولی سازمانی بسیار متفاوت است. این بسیار کوچکتر است، کمتر به یکپارچه سازی با پایگاه های کد موجود وابسته است، و معمولاً باید به سرعت تحویل داده شود و در عین حال از عملکرد قابل اعتماد در انواع زیادی از دستگاه ها اطمینان حاصل شود. کاتلین برای پروژه هایی از این دست نیز به خوبی کار می کند.ویژگیهای زبان کاتلین، همراه با یک افزونه کامپایلر ویژه که از framework اندروید پشتیبانی میکند، توسعه اندروید را به تجربهای بسیار سازندهتر و لذتبخشتر تبدیل میکند. کارهای رایج توسعه، مانند افزودن listeners به کنترلها یا اتصال عناصر طرحبندی(layout ) به فیلدها، میتوانند با کد بسیار کمتر یا گاهی بدون کد انجام شوند (کامپایلر آن را برای شما تولید میکند). کتابخانه Anko ( https://github.com/kotlin/anko )   که توسط تیم کاتلین نیز ساخته شده است، با افزودن آداپتورهای سازگار با کاتلین در کنار بسیاری از APIهای استاندارد Android، تجربه شما را حتی بیشتر بهبود می بخشد.در اینجا یک مثال ساده از Anko آورده شده است، فقط برای اینکه حس و حال توسعه اندروید با کاتلین را بچشید. می توانید این کد را در یک Activity قرار دهید و یک برنامه اندروید ساده آماده است!یکی دیگر از مزایای بزرگ استفاده از کاتلین ، قابلیت اطمینان بهتر برنامه است. اگر تجربه ای در توسعه برنامه های اندروید دارید، بدون شک با dialog آشنا هستید، متاسفانه فرآیند متوقف شده است.این dialog زمانی نشان داده می شود که برنامه شما یک استثنا هندل نشده پرتاب می کند اغلب، یک NullPointerException. سیستم نوع کاتلین، با ردیابی دقیق مقادیر تهی، مشکل استثناهای اشاره گر تهی را بسیار کمتر تحت فشار قرار می دهد. اکثر کدهایی که منجر به NullPointerException در جاوا میشود، در کاتلین کامپایل نمیشوند و اطمینان حاصل میکنند که قبل از اینکه برنامه به کاربران برسد، خطا را برطرف کنید.در عین حال، از آنجایی که کاتلین کاملاً با جاوا 6 سازگار است، استفاده از آن هیچ نگرانی سازگاری جدیدی ایجاد نمی کند. شما از تمام ویژگی های زبان جدید و جالب کاتلین بهره مند خواهید شد و کاربران شما همچنان می توانند برنامه شما را بر روی دستگاه های خود اجرا کنند، حتی اگر آخرین نسخه اندروید را اجرا نکنند.از نظر عملکرد، استفاده از کاتلین هیچ ضرری به همراه ندارد. کد تولید شده توسط کامپایلر کاتلین به اندازه کدهای جاوا معمولی کارآمد اجرا می شود. زمان اجرا استفاده شده توسط کاتلین نسبتاً کم است، بنابراین شما افزایش زیادی در اندازه بسته برنامه کامپایل شده را تجربه نخواهید کرد. و هنگامی که از lambdas  استفاده می کنید، بسیاری از توابع کتابخانه استاندارد کاتلین آنها را درون خطی می کنند. lambdas های داخلی تضمین می کند که هیچ شی جدیدی ایجاد نمی شود و برنامه از توقف های اضافی GC رنج نمی برد.پس از بررسی مزایای کاتلین در مقایسه با جاوا، اکنون به فلسفه کاتلین نگاه می کنیم - ویژگی های اصلی که کاتلین را از سایر زبان های مدرن که JVM را هدف قرار می دهند متمایز می کند.1.4  فلسفه کاتلینوقتی درباره کاتلین صحبت می کنیم ، دوست داریم بگوییم که این یک زبان pragmatic، مختصر و ایمن با تمرکز بر قابلیت همکاری است. منظور ما از هر یک از این کلمات دقیقاً چیست؟ بیایید به نوبه خود به آنها نگاه کنیم.1.4.1       عملگرا Pragmaticpragmatic برای ما یک چیز ساده است: کاتلین یک زبان کاربردی است که برای حل مشکلات دنیای واقعی طراحی شده است. طراحی آن بر اساس سالها تجربه صنعت در ایجاد سیستمهای بزرگ است و ویژگیهای آن برای رسیدگی به موارد استفاده که توسط بسیاری از برنامه نویسان نرمافزار با آن مواجه میشوند انتخاب شدهاند. علاوه بر این، برنامه نویسان هم در JetBrains و هم در جامعه چندین سال است که از نسخه های اولیه Kotlin استفاده می کنند و بازخورد آنها نسخه منتشر شده این زبان است. این باعث میشود مطمئن باشیم که کاتلین میتواند به حل مشکلات در پروژههای واقعی کمک کند.کاتلین نیز یک زبان تحقیقاتی نیست. ما در تلاش برای پیشرفت در طراحی زبان برنامه نویسی و کشف ایده های نوآورانه در علوم کامپیوتر نیستیم. در عوض، هر زمان که ممکن باشد، ما به ویژگیها و راهحلهایی تکیه میکنیم که قبلاً در زبانهای برنامهنویسی دیگر ظاهر شدهاند و موفقیت آمیز بودنشان را ثابت کردهاند. این امر پیچیدگی زبان را کاهش میدهد و یادگیری آن را با تکیه بر مفاهیم آشنا آسانتر میکند.علاوه بر این، کاتلین از هیچ سبک یا پارادایم برنامه نویسی خاصی استفاده نمی کند. همانطور که شروع به مطالعه زبان می کنید، می توانید از سبک و تکنیک هایی استفاده کنید که از تجربه جاوا برای شما آشنا هستند. بعداً، به تدریج ویژگی های قدرتمندتر کاتلین را کشف خواهید کرد و یاد می گیرید که آنها را در کد خود به کار ببرید، تا آن را مختصرتر و مصطلح تر کنید.یکی دیگر از جنبه های pragmatic کاتلین تمرکز آن بر ابزارسازی است. یک محیط توسعه هوشمند به اندازه یک زبان خوب برای بهره وری یک توسعه دهنده ضروری است. و به همین دلیل، در نظر گرفتن پشتیبانی IDE به عنوان راه چاره ، جزو گزینه نیست. در مورد کاتلین ، پلاگین IntelliJ IDEA دقیقا به همون ترتیب با کامپایلر توسعه داده شد و ویژگی های زبان همیشه با در نظر گرفتن ابزار، طراحی می شدند.پشتیبانی IDE همچنین نقش مهمی در کمک به شما در کشف ویژگی های کاتلین ایفا می کند. در بسیاری از موارد، ابزارها به طور خودکار الگوهای کد معمولی را که میتوانند با ساختارهای مختصر جایگزین شوند، شناسایی میکنند و پیشنهاد میکنند کد را برای شما اصلاح کنند. با مطالعه ویژگی های زبان مورد استفاده توسط اصلاحات خودکار، می توانید یاد بگیرید که آن ویژگی ها را در کد خود نیز اعمال کنید.1.4.2       مختصر (Concise)معمولا توسعه دهندگان زمان بیشتری را صرف خواندن کدهای موجود می کنند تا نوشتن کد جدید. تصور کنید که بخشی از تیمی هستید که در حال توسعه یک پروژه بزرگ هستید و باید یک ویژگی جدید اضافه کنید یا یک باگ را برطرف کنید. اولین قدم های شما چیست؟ شما به دنبال بخش دقیق کدی که باید تغییر دهید میگردید و بعد اونو اصلاح میکنید. شما کدهای زیادی را می خوانید تا بفهمید چه کاری باید انجام دهید. این کد ممکن است اخیراً توسط همکاران شما، یا توسط شخصی که دیگر روی پروژه کار نمی کند، یا توسط شما، اما مدت ها پیش نوشته شده باشد. فقط پس از درک و تسلط کدها می توانید تغییرات لازم را انجام دهید.هرچه کد سادهتر و مختصرتر باشد، سریعتر متوجه خواهید شد که چه خبر است. البته طراحی خوب و نام های رسا در اینجا نقش بسزایی دارند. اما انتخاب زبان و مختصر بودن آن نیز مهم است. در صورتی این زبان مختصر است که syntax آن به وضوح هدف کدی را که خواندهاید بیان کند و آن را با صفحهای که برای مشخص کردن نحوه انجام این هدف لازم است پنهان نکند.در کاتلین ، ما تلاش زیادی کردهایم تا اطمینان حاصل کنیم که تمام کدهایی که مینویسید دارای معنی هستند و فقط برای برآوردن الزامات ساختار کد در آنجا نیستند. بسیاری از استانداردهای جاوا، مانند دریافتکنندهها(getters)، ارسال کننده ها (setters)و منطق اختصاص دادن پارامترهای سازنده به فیلدها، در کاتلین همیشه پیدا میشود و کد منبع شما را به هم نمیریزند.یکی دیگر از دلایل طولانی بودن کد غیر ضروری، نوشتن کد واضح برای انجام کارهایی که انجام می شود، مانند مکان یابی یک عنصر در یک مجموعه است. درست مانند بسیاری از زبانهای مدرن دیگر، کاتلین یک کتابخانه استاندارد غنی دارد که به شما امکان میدهد این بخشهای طولانی و تکراری کد را با صدا کردن method های کتابخانه جایگزین کنید. پشتیبانی کاتلین از لامبدا انتقال بلوک های کوچک کد به توابع کتابخانه را آسان می کند. این به شما امکان میدهد تمام قسمتهای مشترک کتابخانه را کپسوله (encapsulate )کنید و فقط بخش منحصر به فرد و مختص کار را در کد کاربر نگه دارید.در عین حال، کاتلین سعی نمی کند کد منبع را به کمترین تعداد کاراکتر ممکن جمع کند. به عنوان مثال، حتی اگر کاتلین از بارگذاری بیش از حد اپراتور پشتیبانی می کند، کاربران نمی توانند اپراتورهای خود را تعریف کنند. بنابراین، توسعهدهندگان کتابخانه نمیتوانند نام method ها را با علائمی مانند (punctuation )  نقطه، کاما و پرانتز و... جایگزین کنند. کلمات معمولاً راحتتر از علائم نگارشی خوانده میشوند و یافتن اسناد روی آنها آسانتر است.کد مختصرتر زمان کمتری برای نوشتن و مهمتر از آن زمان کمتری برای خواندن نیاز دارد. این کار بهره وری شما را بهبود می بخشد و به شما امکان می دهد کارها را سریعتر انجام دهید.1.4.3       امن (Safe)به طور کلی، وقتی از یک زبان برنامه نویسی به عنوان زبان ایمن صحبت می کنیم، به این معنی است که طراحی آن از انواع خاصی از خطاها در یک برنامه جلوگیری می کند. البته، این یک برتری مطلق نیست؛ هیچ زبانی از تمام خطاهای احتمالی جلوگیری نمی کند. علاوه بر این، جلوگیری از خطاها معمولاً هزینه دارد. شما باید به کامپایلر اطلاعات بیشتری در مورد عملکرد مورد نظر برنامه بدهید، بنابراین کامپایلر می تواند تأیید کند که اطلاعات با آنچه برنامه انجام می دهد مطابقت دارد. به همین دلیل، همیشه بین سطح ایمنی شما و از دست دادن بهره وری لازم برای قرار دادن annotations دقیق تر، تعادل وجود دارد.با کاتلین ، ما سعی کردهایم به سطح ایمنی بالاتری نسبت به جاوا با هزینه کلی کمتر دست یابیم. اجرای بر روی JVM در حال حاضر تضمین های ایمنی زیادی را ارائه می دهد: به عنوان مثال، ایمنی حافظه، جلوگیری از سرریز شدن بافر و سایر مشکلات ناشی از استفاده نادرست از حافظه تخصیص یافته پویا. به عنوان یک زبان تایپ استاتیک در JVM، کاتلین همچنین ایمنی نوع داده های برنامه های شما را تضمین می کند. این هزینه کمتری نسبت به جاوا دارد: لازم نیست تمام اعلانهای نوع داده را مشخص کنید، زیرا در بسیاری از موارد کامپایلر انواع داده ها را به طور خودکار میشناسد و جایگذاری میکند.کاتلین همچنین فراتر از آن است، به این معنی که می توان از خطاهای بیشتر با بررسی در زمان کامپایل به جای ارور در زمان اجرا (runtime) جلوگیری کرد. مهمتر از همه، کاتلین تلاش می کند NullPointerException را از برنامه شما حذف کند. سیستم نوع داده هایی کاتلین مقادیری را که میتوانند و نمیتوانند null باشند را ردیابی میکند و عملیاتهایی را که میتوانند منجر به NullPointerException در زمان اجرا شوند، ممنوع میکند. ضرر این کار حداقل است: علامتگذاری یک نوع داده بهعنوان  nullپذیر تنها یک نویسه دارد، یک علامت سوال در پایان:علاوه بر این، کاتلین راههای راحت بسیاری را برای مدیریت دادههای nullable ارائه میکند. این کمک زیادی به از بین بردن crashes های برنامه ها می کند.نوع دیگری از استثنایی که کاتلین به اجتناب از آن کمک می کند، ClassCastException است. زمانی اتفاق میافتد که یک شی را به یک نوع داده ارسال میکنید بدون اینکه قبلاً بررسی کنید که نوع مناسبی دارد یا خیر. در جاوا، توسعه دهندگان اغلب چک را کنار می گذارند، زیرا نام نوع داده باید چک و cast های زیر تکرار شود. از سوی دیگر، در کاتلین، چک و cast در یک عملیات واحد ترکیب میشوند: هنگامی که نوع داده را بررسی کردید، میتوانید بدون هیچ گونه cast اضافی به اعضای آن نوع داده مراجعه کنید. بنابراین، هیچ دلیلی برای رد شدن از بررسی و هیچ شانسی برای خطا وجود ندارد. نحوه کار اینگونه است:(در زبان انگلیسی واژه Cast دارای معانی متفاوتی است و این در حالی است که در زبان برنامه نویس جاوا این واژه تعریف خاصی دارد. از این رو از ترجمه لغوی این اصلاح خودداری می کنیم در فرایند تغییر جنس داده ای به داده ای دیگر اصطلاحا Castمیگویند )1.4.4       قابلیت همکاری (interoperable )در مورد قابلیت همکاری، اولین نگرانی شما احتمالاً این است که &quot;آیا می توانم از کتابخانه های موجود خود استفاده کنم؟&quot; با کاتلین، پاسخ این است: &quot;بله، کاملا&quot;. صرف نظر از نوع API هایی که کتابخانه از شما می خواهد استفاده کنید، شما میتونید از انها با کاتلین کار کنید. میتوانید متدهای جاوا را فراخوانی کنید، کلاسهای جاوا را گسترش دهید و interfaces را پیادهسازی کنید، annotations جاوا را در کلاسهای کاتلین خود اعمال کنید و غیره.برخلاف برخی دیگر از زبانهای JVM، کاتلین از قابلیت همکاری فراتر رفته و فراخوانی کد کاتلین از جاوا را نیز آسان میکند. هیچ ترفندی لازم نیست: کلاس ها و متدهای کاتلین را می توان دقیقاً مانند کلاس ها و متدهای معمولی جاوا فراخوانی کرد. این به شما انعطاف پذیری خیلی زیادی را در ترکیب کد جاوا و کاتلین در هر نقطه از پروژه به شما می دهد. هنگامی که شروع به استفاده از کاتلین در پروژه جاوا خود می کنید، می توانید مبدل Java-toKotlin را بر روی هر کلاسی در کدهای خود اجرا کنید و بقیه کدها بدون هیچ گونه تغییری به کامپایل و کار ادامه می دهند. این بدون توجه به وظیفه کلاسی که تبدیل کرده اید کار می کند.حوزه دیگری که کاتلین بر قابلیت همکاری متمرکز است، استفاده آن از کتابخانه های جاوا موجود به بیشترین میزان ممکن است. به عنوان مثال، کاتلین یک مجموعه کتابخانه برای خود را ندارد. پس  به طور کامل به کلاس های کتابخانه استاندارد جاوا متکی است و آنها را با توابع اضافی برای استفاده راحت تر در کاتلین گسترش می دهد. (ما در بخش 3.3 به مکانیسم این موضوع با جزئیات بیشتری نگاه خواهیم کرد.) این بدان معنی است که شما هرگز نیازی به بسته بندی یا تبدیل objects هنگام فراخوانی API های جاوا از کاتلین یا بالعکس ندارید. تمام API های معروف و قوی توسط کاتلین بدون هیچ هزینه ای در زمان اجرا ارائه می شود.ابزار کاتلین از پروژه های بین زبانی پشتیبانی کامل می کند. این میتواند ترکیبی دلخواه از فایلهای منبع جاوا و کاتلین را بدون توجه به اینکه چگونه به یکدیگر وابسته هستند، کامپایل کند. امکانات IDE در سراسر زبانها نیز کار میکنند و به شما این امکان را میدهند:بین فایلهای منبع جاوا و کاتلین آزادانه حرکت کنیدپروژه های با مخلوطی از زبان های مختلف را اشکال زدایی کنید و بین کدهای نوشته شده به زبان های مختلف حرکت کنیدمتدهای جاوا خود را اصلاح و از کد کاتلین و استفاده از آنها در کد کاتلین را به درستی به روز کنید و بالعکسامیدواریم تا کنون شما را متقاعد کرده باشیم که کاتلین را امتحان کنید. حالا، چطور می توانید از آن استفاده کنید؟ در بخش بعدی، فرآیند کامپایل و اجرای کد کاتلین ، هم از طریق خط فرمان (command line) و هم با استفاده از ابزارهای مختلف را مورد بحث قرار خواهیم داد.1.5  استفاده از ابزار کاتلیندرست مانند جاوا، کاتلین یک زبان کامپایل شده است. این بدان معناست که قبل از اینکه بتوانید کد کاتلین را اجرا کنید، باید آن را کامپایل کنید. بیایید در مورد نحوه عملکرد فرآیند کامپایل بحث کنیم و سپس به ابزارهای مختلفی که از آن برای شما محافظت می کنند نگاهی بیندازیم. اگر به اطلاعات بیشتری در مورد راهاندازی محیط خود نیاز دارید، لطفاً به بخش «آموزشها» در وبسایت کاتلین ( https://kotlinlang.org/docs/tutorials )  مراجعه کنید.1.5.1       کامپایل کد کاتلینکد منبع کاتلین معمولاً در فایل هایی با پسوند kt ذخیره می شود. کامپایلر کاتلین کد منبع را تجزیه و تحلیل می کند و فایل های کلاس تولید می کند، درست مانند کامپایلر جاوا. سپس فایلهای class. تولید شده با استفاده از روش استاندارد برای نوع برنامهای که روی آن کار میکنید، بستهبندی و اجرا میشوند. در ساده ترین حالت، می توانید از دستور kotlinc برای کامپایل کد خود از خط فرمان و از دستور java برای اجرای کد خود استفاده کنید:شرح ساده فرآیند ساخت کاتلین در شکل 1.1 نشان داده شده است.کد کامپایل شده با کامپایلر کاتلین به کتابخانه Kotlin runtime  بستگی دارد. این شامل تعاریف کلاسهای کتابخانه استاندارد خود کاتلین و افزونههایی است که کاتلین به APIهای استاندارد جاوا اضافه میکند. Kotlin runtime library باید با برنامه شما اشتراک گذاری شود.در بیشتر موارد واقعی، شما از یک سیستم ساخت مانند Maven، Gradle یا Ant برای کامپایل کد خود استفاده خواهید کرد. کاتلین با تمام آن build systems ها سازگار است، و ما جزئیات را در appendix A (فصل های بعدی )  مورد بحث قرار خواهیم داد. همه آن build systems ها از زبان های ترکیبی پروژهها نیز پشتیبانی میکنند که کاتلین و جاوا را در یک پایگاه کد ترکیب میکنند. علاوه بر این، Maven و Gradle از گنجاندن کتابخانه زمان اجرا کاتلین (Kotlin runtime library)  به عنوان وابستگی(dependency ) از برنامه شما محافظت می کنند.1.5.2       افزونه برای IntelliJ IDEA و Android Studioپلاگین IntelliJ IDEA برای کاتلین به موازات این زبان توسعه یافته است و این کامل ترین محیط توسعه موجود برای کاتلین است. کامل و پایدار است و مجموعه کاملی از ابزارها را برای توسعه کاتلین فراهم می کند.پلاگین کاتلین خارج از حیطه IntelliJ IDEA 15 و نسخههای جدیدتر ارائه میشود، بنابراین نیازی به اضافه کردن به setup نیست. می توانید از نسخه رایگان و متن باز IntelliJ IDEA Community Edition یا IntelliJ IDEA Ultimate استفاده کنید. کاتلین را درNew Project dialog انتخاب کنید، و شما آماده هستید.اگر از Android Studio استفاده می کنید، می توانید افزونه کاتلین را از plug-in manager نصب کنید. در Settings dialog ، Plugins را انتخاب کنید، سپس روی دکمه Install JetBrains Plugin کلیک کنید و کاتلین را از لیست انتخاب کنید.1.5.3       پوسته تعاملی (Interactive shell)اگر می خواهید به سرعت قطعات کوچک کد کاتلین را امتحان کنید، می توانید این کار را با استفاده از پوسته تعاملی (به اصطلاح REPL) انجام دهید. در REPL می توانید کد Kotlin را خط به خط تایپ کنید و بلافاصله نتایج اجرای آن را مشاهده کنید. برای شروع REPL، میتوانید دستور kotlinc را بدون آرگومان اجرا کنید یا از آیتم منوی مربوطه در افزونه IntelliJ IDEA استفاده کنید.1.5.4       پلاگین  Eclipseاگر کاربر Eclipse هستید، می توانید از کاتلین در IDE خود نیز استفاده کنید. پلاگین Kotlin Eclipse ،functionality های ضروری IDE مانند navigation و تکمیل کد را ارائه می دهد. این پلاگین در بازار Eclipse موجود است. برای نصب آن، آیتم منوی Help &gt; Eclipse Marketplace را انتخاب کنید و کاتلین را در لیست جستجو کنید.1.5.5       محیط کاری آنلاینساده ترین راه برای امتحان کاتلین نیازی به نصب یا پیکربندی(configuration) ندارد. در http://try.kotl.in ، می توانید یک محیط کاری آنلاین پیدا کنید که در آن می توانید برنامه های کوچک کاتلین را بنویسید، کامپایل و اجرا کنید. محیط کاری انلاین دارای نمونه کدهایی است که ویژگیهای کاتلین را نشان میدهد، از جمله تمام نمونههای این کتاب، و همچنین یک سری تمرین برای یادگیری کاتلین به صورت واکنشی.1.5.6       مبدل جاوا به کاتلینسرعت گرفتن با یک زبان جدید هرگز آسان نیست. خوشبختانه، ما یک میانبر کوچک زیبا ایجاد کرده ایم که به شما امکان می دهد با تکیه بر دانش موجود خود از جاوا، سرعت یادگیری و پذیرش خود را افزایش دهید. این ابزار تبدیل خودکار جاوا به کاتلین است.همانطور که شروع به یادگیری کاتلین می کنید، مبدل می تواند به شما کمک کند تا زمانی که syntax دقیق آن را به خاطر نمی آورید، چیزی را بیان کنید. میتوانید قطعه مربوطه را در جاوا بنویسید و سپس آن را در یک فایل کاتلین جایگذاری کنید، و مبدل به طور خودکار پیشنهاد میکند تا کد را به کاتلین تبدیل کند. نتیجه همیشه اصلاح شده ترین (مختصر و کامل) نخواهد بود، اما کد کار می کند و شما می توانید از این روش در کار خود پیشرفت کنید.این مبدل همچنین عالیه برای اضافه کردن کاتلین به یک پروژه جاوا که از قبل وجود دارد. هنگامی که نیاز به نوشتن یک کلاس جدید دارید، می توانید آن را از همان ابتدا در کاتلین انجام دهید. اما اگر نیاز به ایجاد تغییرات قابل توجه در کلاس موجود دارید، ممکن است بخواهید از کاتلین در این فرآیند نیز استفاده کنید. اینجاست که مبدل وارد عمل می شود. شما ابتدا کلاس را به کاتلین تبدیل می کنید و سپس تغییرات را با استفاده از تمام مزایای یک زبان مدرن اضافه می کنید.استفاده از مبدل در IntelliJ IDEA بسیار آسان است. میتوانید یک قطعه کد جاوا را کپی کرده و آن را در یک فایل کاتلین جایگذاری کنید، یا در صورت نیاز به تبدیل کل فایل ، فرآیند تبدیل فایل جاوا به فایل کاتلین را فراخوانی کنید. مبدل در Eclipse و مبدل آنلاین نیز قابل دسترسی است.1.6  خلاصهکاتلین به صورت static است و از inference پشتیبانی می کند و به آن اجازه می دهد صحت و عملکرد را حفظ کند و در عین حال کد منبع را مختصر نگه دارد.کاتلین از هر دو سبک برنامه نویسی شی گرا و functional پشتیبانی می کند، abstractions سطح بالاتر را از طریق functions درجه یک امکان پذیر می کند و آزمایش و توسعه multithreaded را از طریق پشتیبانی از مقادیر تغییرناپذیر(immutable ) ساده می کند.برای برنامه های سمت سرور به خوبی کار می کند، به طور کامل از تمام frameworks های جاوا که وجود دارند پشتیبانی می کند و ابزارهای جدیدی را برای کارهای رایج مانند تولید HTML و تداوم ارائه می دهد.پشتیبانی از کامپایلر ویژه برای APIهای اندروید، به لطف زمان اجرا کم، و یک کتابخانه غنی که functions های سازگار با کاتلین را برای کارهای متداول توسعه اندروید ارائه می دهد، برای اندروید نیز کار می کند.این برنامه رایگان و منبع باز(open source) است ، با پشتیبانی کامل از IDE های اصلی و build systems .کاتلین pragmatic ، ایمن، مختصر و تعاملی interoperable است، به این معنی که بر استفاده از راه حل های تایید شده برای کارهای متداول، جلوگیری از خطاهای رایج مانند NullPointerExceptions، پشتیبانی از کدهای فشرده و خوانا و تبدیل کد نامحدود با جاوا تمرکز دارد.میتونید بخش دوم از فصل اول رو در اینجا ببنید</description>
                <category>فرید محمدی</category>
                <author>فرید محمدی</author>
                <pubDate>Tue, 02 Nov 2021 18:04:56 +0330</pubDate>
            </item>
            </channel>
</rss>