فرید محمدی
فرید محمدی
خواندن ۲۹ دقیقه·۳ سال پیش

ترجمه کتاب Kotlin in Action


قسمت 1

معرفی کاتلین

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

فصل 1 شما را با ویژگی های کلی کاتلین آشنا می کند. در فصل های 2-4 ، خواهید آموخت که چگونه اساسی ترین مفاهیم برنامه نویسی جاوا-دستورات ، functions، classesو  types—mapهای کد کاتلین مطابقت دارد و چگونه کاتلین آنها را غنی می کند تا برنامه نویسی دلپذیرتر شود.

شما می توانید بر دانش موجود خود در زمینه جاوا و همچنین به کمک ابزارهایی مانند ویژگی های کد نویسی IDE و مبدل جاوا به کاتلین تکیه کنید تا سرعت خود را به سرعت افزایش دهید. در فصل 5 ، خواهید فهمید که چگونه lambdas به شما کمک می کند تا برخی از رایج ترین وظایف برنامه نویسی ، مانند کار با مجموعه ها را به طور موثر حل کنید. سرانجام ، در فصل 6 ، با یکی از ویژگی های تخصصی کلیدی کاتلین آشنا می شوید: پشتیبانی آن برای مقابله با مقادیر null .

Kotlin :What and why
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 ) ماندگاری است. به عنوان مثال، frameworkExposurhttps://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       عملگرا Pragmatic

pragmatic برای ما یک چیز ساده است: کاتلین یک زبان کاربردی است که برای حل مشکلات دنیای واقعی طراحی شده است. طراحی آن بر اساس سالها تجربه صنعت در ایجاد سیستمهای بزرگ است و ویژگیهای آن برای رسیدگی به موارد استفاده که توسط بسیاری از برنامه نویسان نرمافزار با آن مواجه میشوند انتخاب شدهاند. علاوه بر این، برنامه نویسان هم در 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 )

در مورد قابلیت همکاری، اولین نگرانی شما احتمالاً این است که "آیا می توانم از کتابخانه های موجود خود استفاده کنم؟" با کاتلین، پاسخ این است: "بله، کاملا". صرف نظر از نوع 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 > Eclipse Marketplace را انتخاب کنید و کاتلین را در لیست جستجو کنید.

1.5.5       محیط کاری آنلاین

ساده ترین راه برای امتحان کاتلین نیازی به نصب یا پیکربندی(configuration) ندارد. در http://try.kotl.in ، می توانید یک محیط کاری آنلاین پیدا کنید که در آن می توانید برنامه های کوچک کاتلین را بنویسید، کامپایل و اجرا کنید. محیط کاری انلاین دارای نمونه کدهایی است که ویژگیهای کاتلین را نشان میدهد، از جمله تمام نمونههای این کتاب، و همچنین یک سری تمرین برای یادگیری کاتلین به صورت واکنشی.

1.5.6       مبدل جاوا به کاتلین

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

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

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

استفاده از مبدل در IntelliJ IDEA بسیار آسان است. میتوانید یک قطعه کد جاوا را کپی کرده و آن را در یک فایل کاتلین جایگذاری کنید، یا در صورت نیاز به تبدیل کل فایل ، فرآیند تبدیل فایل جاوا به فایل کاتلین را فراخوانی کنید. مبدل در Eclipse و مبدل آنلاین نیز قابل دسترسی است.

1.6  خلاصه

  1. کاتلین به صورت static است و از inference پشتیبانی می کند و به آن اجازه می دهد صحت و عملکرد را حفظ کند و در عین حال کد منبع را مختصر نگه دارد.
  2. کاتلین از هر دو سبک برنامه نویسی شی گرا و functional پشتیبانی می کند، abstractions سطح بالاتر را از طریق functions درجه یک امکان پذیر می کند و آزمایش و توسعه multithreaded را از طریق پشتیبانی از مقادیر تغییرناپذیر(immutable ) ساده می کند.
  3. برای برنامه های سمت سرور به خوبی کار می کند، به طور کامل از تمام frameworks های جاوا که وجود دارند پشتیبانی می کند و ابزارهای جدیدی را برای کارهای رایج مانند تولید HTML و تداوم ارائه می دهد.
  4. پشتیبانی از کامپایلر ویژه برای APIهای اندروید، به لطف زمان اجرا کم، و یک کتابخانه غنی که functions های سازگار با کاتلین را برای کارهای متداول توسعه اندروید ارائه می دهد، برای اندروید نیز کار می کند.
  5. این برنامه رایگان و منبع باز(open source) است ، با پشتیبانی کامل از IDE های اصلی و build systems .
  6. کاتلین pragmatic ، ایمن، مختصر و تعاملی interoperable است، به این معنی که بر استفاده از راه حل های تایید شده برای کارهای متداول، جلوگیری از خطاهای رایج مانند NullPointerExceptions، پشتیبانی از کدهای فشرده و خوانا و تبدیل کد نامحدود با جاوا تمرکز دارد.



میتونید بخش دوم از فصل اول رو در اینجا ببنید

جاواکاتلینبرنامه نویسیترجمه کتاب برنامه نویسیترجمه کتاب kotlin in action
برنامه نویس اندروید ، دارای مدرک کارشناسی مهندسی نرم افزار ، برنامه نویس رفاه مارکت و استادیار
شاید از این پست‌ها خوشتان بیاید