قسمت 1
هدف این بخش از کتاب این است که شما را در نوشتن کد کاتلین که از API های موجود استفاده می کند ، بهره مند سازید.
فصل 1 شما را با ویژگی های کلی کاتلین آشنا می کند. در فصل های 2-4 ، خواهید آموخت که چگونه اساسی ترین مفاهیم برنامه نویسی جاوا-دستورات ، functions، classesو types—mapهای کد کاتلین مطابقت دارد و چگونه کاتلین آنها را غنی می کند تا برنامه نویسی دلپذیرتر شود.
شما می توانید بر دانش موجود خود در زمینه جاوا و همچنین به کمک ابزارهایی مانند ویژگی های کد نویسی IDE و مبدل جاوا به کاتلین تکیه کنید تا سرعت خود را به سرعت افزایش دهید. در فصل 5 ، خواهید فهمید که چگونه lambdas به شما کمک می کند تا برخی از رایج ترین وظایف برنامه نویسی ، مانند کار با مجموعه ها را به طور موثر حل کنید. سرانجام ، در فصل 6 ، با یکی از ویژگی های تخصصی کلیدی کاتلین آشنا می شوید: پشتیبانی آن برای مقابله با مقادیر null .
این فصل را پوشش می دهد
کاتلین در مورد چیست؟ این یک زبان برنامه نویسی جدید است که platform جاوا را هدف قرار می دهد. کاتلین مختصر ، ایمن ، عملگرا (pragmatic ) و متمرکز بر قابلیت همکاری با کد جاوا است. تقریباً در همه جا می توان از جاوا استفاده کرد: امروزه برای توسعه سمت سرور ، برنامه های Android و موارد دیگر. کاتلین با تمام کتابخانه ها و frameworks های جاوا عالی کار می کند و با همان سطح کارایی جاوا اجرا می شود. در این فصل ، ما ویژگی های اصلی کاتلین را با جزئیات بررسی می کنیم.
بیایید با یک مثال کوچک شروع کنیم تا نشان دهیم که کاتلین چگونه است. این مثال کلاس Person را تعریف می کند ، مجموعه ای از افراد را ایجاد می کند ، قدیمی ترین را پیدا می کند و نتیجه را چاپ می کند. حتی در این قطعه کد کوچک ، می توانید بسیاری از ویژگی های جالب کاتلین را مشاهده کنید. ما برخی از آنها را برجسته کرده ایم تا بتوانید بعداً به راحتی آنها را در کتاب پیدا کنید. کد به طور خلاصه توضیح داده شده است ، اما اگر چیزی فوراً مشخص نشد نگران نباشید. ما بعداً همه چیز را با جزئیات بحث خواهیم کرد. اگر می خواهید این مثال را اجرا کنید ، ساده ترین گزینه این است که از زمین بازی آنلاین به آدرس http://try.kotl.in استفاده کنید . مثال را وارد کرده و روی دکمه Run کلیک کنید تا کد اجرا شود.
شما یک کلاس داده ساده با دو ویژگی اعلان می کنید: نام و سن. ویژگی سن به طور پیش فرض null است (اگر مشخص نشده باشد). هنگام ایجاد لیست افراد ، سن آلیس را حذف می کنید ، بنابراین مقدار پیش فرض null استفاده می شود. سپس از تابع maxBy برای پیدا کردن مسن ترین فرد در لیست استفاده می کنید. عبارت lambda که به تابع منتقل می شود یک پارامتر می گیرد و شما از آن به عنوان نام پیش فرض آن پارامتر استفاده می کنید. Elvis operator (؟ :) اگر سن null باشد صفر را برمی گرداند. از آنجا که سن آلیس مشخص نیست ، اپراتور الویس آن را با صفر جایگزین می کند ، بنابراین باب جایزه را به عنوان مسن ترین فرد دریافت می کند.
آیا آنچه را دیده اید دوست دارید؟ ادامه مطلب را مطالعه کنید تا بیشتر بیاموزید و متخصص کاتلین شوید. امیدواریم به زودی چنین کدی را در پروژه های خود مشاهده کنید ، نه تنها در این کتاب.
احتمالاً شما از قبلاً ایده ای دارید که زبان کاتلین چیست. بیایید ویژگی های کلیدی آن را با جزئیات بیشتری بررسی کنیم. ابتدا بیایید ببینیم چه نوع برنامه هایی را می توانید با کاتلین بسازید.
هدف اصلی کاتلین ارائه یک جایگزین مختصر تر، سازنده تر(productive) و ایمن تر برای جاوا است که در همه زمینه هایی که جاوا امروزه استفاده می شود مناسب باشد. جاوا یک زبان بسیار محبوب است و از آن در محیط های بسیار متنوعی استفاده می شود ، از کارت های هوشمند (فناوری جاوا کارت) گرفته تا بزرگترین مراکز داده که توسط گوگل ، توییتر ، لینکدین و سایر شرکت های بزرگ اینترنتی اداره می شود. در اکثر این مکانها، استفاده از کاتلین میتواند به توسعهدهندگان کمک کند تا با کد کمتر و مزاحمتهای کمتر در مسیر دستیابی به اهداف خود داشته باشند.
رایج ترین مکان برای استفاده از کاتلین :
اما کاتلین در زمینه های دیگر نیز کار می کند. به عنوان مثال ، می توانید از 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 را پشتیبانی می کنند. بیایید در ادامه ویژگی های کلیدی کاتلین به عنوان یک زبان برنامه نویسی را بررسی کنیم.
درست مانند جاوا ، کاتلین یک زبان برنامه نویسی استاتیک است. این بدان معناست که نوع هر عبارت در یک برنامه در زمان کامپایل مشخص است و کامپایلر می تواند تأیید کند که methods ها و fields هایی که می خواهید به آنها دسترسی پیدا کنید در objects هایی که استفاده می کنید وجود دارد. این برخلاف زبان های برنامه نویسی پویا است ، که در JVM ، از جمله Groovy و JR uby نشان داده شده است. این زبانها به شما امکان میدهند متغیرها و توابعی را تعریف کنید که میتوانند دادهها را از هر نوع ذخیره کرده یا برگردانند و رفرنس های method و fieldرا در زمان اجرا حل کنند. این اجازه می دهد تا کد کوتاه تر و انعطاف پذیری بیشتری در ایجاد ساختارهای داده ایجاد شود. اما نکته منفی این است که مشکلاتی مانند غلط املایی نام های را نمی توان در طول کامپایل شناسایی کرد و می تواند منجر به خطاهای runtime شود.
از طرف دیگر، برخلاف جاوا، کاتلین از شما نمی خواهد که نوع هر متغیر را به صراحت در کد خود مشخص کنید. در بسیاری از موارد، نوع متغیر را می توان به طور خودکار از روی context تعیین کرد و به شما این امکان را می دهد که نوع متغییر را حذف کنید. در اینجا ساده ترین مثال ممکن در این مورد آمده است:
val x = 1
شما یک متغیر را اعلام می کنید و چون با یک مقدار صحیح مقداردهی اولیه شده است، کاتلین به طور خودکار تعیین می کند که نوع آن Int است. توانایی کامپایلر برای تعیین انواع از context ، type inference نامیده می شود
در زیر برخی از مزایای static typing آورده شده است:
به لطف حمایت کاتلین از inference ، بیشتر کلمات اضافی مرتبط با static typing از بین می رود ، زیرا نیازی به بیان صریح نوع متغییر ندارید. اگر به مشخصات سیستم نوع مغییرکاتلین نگاه کنید، مفاهیم آشنای زیادی خواهید یافت. Classes ، interfaces و generics روششون بسیار شبیه جاوا کار می کنند، پس پس با دانش جاوا شما باید به راحتی به کاتلین سوییچ کنید. هر چند بعضی چیزها جدید هستند.
مهمترین آنها پشتیبانی کاتلین از انواع nullable است ، که به شما امکان تشخیص موارد استثناء اشاره گر nullدر زمان کامپایل را میدهد ، پس میتونید برنامه های مطمئن تری بنویسید. بعداً در این فصل به انواع nullable باز می گردیم و در فصل 6 به تفصیل در مورد آنها صحبت می کنیم.
یکی دیگر از موارد جدید در کاتلین ، پشتیبانی از function types است . برای دیدن این که موضوع چیست ، بیایید ایده های اصلی برنامه نویسی functional را بررسی کنیم و ببینیم که چگونه در کاتلین پشتیبانی می شود.
شما به عنوان توسعه دهنده جاوا بدون شک با مفاهیم اصلی برنامه نویسی شی گرا آشنا هستید ، اما برنامه نویسی functional ممکن است برای شما تازگی داشته باشد. مفاهیم کلیدی برنامه نویسی functional به شرح زیر است:
نوشتن کد به سبک 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 وجود نداشت. این موارد شامل موارد زیر است:
کاتلین به شما امکان می دهد به سبک functional برنامه ریزی کنید اما آن را اجرا نمی کند. هنگامی که به آن نیاز دارید، می توانید با مقادیر قابل تغییر کار کنید و توابعی را بنویسید که دارای عوارض جانبی هستند بدون اینکه از حلقه های اضافی عبور کنید. و البته کار با فریمورک هایی (frameworks) که متکی به interfaces و سلسله مراتب کلاس ها هستند به همان راحتی جاوا است. هنگام نوشتن کد در کاتلین ، می توانید هر دو رویکرد شی گرا و functional را ترکیب کنید و از ابزارهایی استفاده کنید که برای حل مشکلتان مناسب هستند.
زبان کاتلین ، از جمله کامپایلر ، کتابخانه ها و همه ابزارهای مرتبط ، کاملاً منبع باز است و برای هر مقصودی رایگان است. این تحت مجوز Apache 2 موجود است. توسعه در سایتGitHub ( http://github.com/ jetbrains / kotlin ) انجام می شود و از مشارکت های همه استقبال می شود. شما همچنین می توانید از سه IDE منبع باز برای توسعه برنامه های کاتلین خود استفاده کنید: IntelliJ IDEA Community Edition ، Android Studio و Eclipse به طور کامل پشتیبانی می شوند. ( البته ، IntelliJ IDEA نسخه نهایی هست که به خوبی کار میکند)
حالا که فهمیدید زبان کاتلین چه نوع زبانیه ، بیایید ببینیم مزایای خاص و عملی کاتلین چیه که در applications کار می کند.
همانطور که قبلا اشاره کردیم، دو حوزه اصلی که می توان از کاتلین استفاده کرد، سمت سرور و توسعه اندروید است. بیایید به آن دو حوزه نگاه کنیم و ببینیم که چرا کاتلین برای آنها مناسب است.
برنامه نویسی سمت سرور یک مفهوم نسبتاً گسترده است. این شامل همه انواع برنامه های زیر و موارد دیگر است:
توسعه دهندگان سال هاست که این نوع برنامه ها را در جاوا می سازند و مجموعه عظیمی از چارچوب ها (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 ، این تکنیک ها را با جزئیات بیشتری بررسی خواهیم کرد.
یک اپلیکیشن موبایل معمولی با یک اپلیکیشن معمولی سازمانی بسیار متفاوت است. این بسیار کوچکتر است، کمتر به یکپارچه سازی با پایگاه های کد موجود وابسته است، و معمولاً باید به سرعت تحویل داده شود و در عین حال از عملکرد قابل اعتماد در انواع زیادی از دستگاه ها اطمینان حاصل شود. کاتلین برای پروژه هایی از این دست نیز به خوبی کار می کند.
ویژگیهای زبان کاتلین، همراه با یک افزونه کامپایلر ویژه که از framework اندروید پشتیبانی میکند، توسعه اندروید را به تجربهای بسیار سازندهتر و لذتبخشتر تبدیل میکند. کارهای رایج توسعه، مانند افزودن listeners به کنترلها یا اتصال عناصر طرحبندی(layout ) به فیلدها، میتوانند با کد بسیار کمتر یا گاهی بدون کد انجام شوند (کامپایلر آن را برای شما تولید میکند). کتابخانه Anko ( https://github.com/kotlin/anko ) که توسط تیم کاتلین نیز ساخته شده است، با افزودن آداپتورهای سازگار با کاتلین در کنار بسیاری از APIهای استاندارد Android، تجربه شما را حتی بیشتر بهبود می بخشد.
در اینجا یک مثال ساده از Anko آورده شده است، فقط برای اینکه حس و حال توسعه اندروید با کاتلین را بچشید. می توانید این کد را در یک Activity قرار دهید و یک برنامه اندروید ساده آماده است!
یکی دیگر از مزایای بزرگ استفاده از کاتلین ، قابلیت اطمینان بهتر برنامه است. اگر تجربه ای در توسعه برنامه های اندروید دارید، بدون شک با dialog آشنا هستید، متاسفانه فرآیند متوقف شده است.
این dialog زمانی نشان داده می شود که برنامه شما یک استثنا هندل نشده پرتاب می کند اغلب، یک NullPointerException. سیستم نوع کاتلین، با ردیابی دقیق مقادیر تهی، مشکل استثناهای اشاره گر تهی را بسیار کمتر تحت فشار قرار می دهد. اکثر کدهایی که منجر به NullPointerException در جاوا میشود، در کاتلین کامپایل نمیشوند و اطمینان حاصل میکنند که قبل از اینکه برنامه به کاربران برسد، خطا را برطرف کنید.
در عین حال، از آنجایی که کاتلین کاملاً با جاوا 6 سازگار است، استفاده از آن هیچ نگرانی سازگاری جدیدی ایجاد نمی کند. شما از تمام ویژگی های زبان جدید و جالب کاتلین بهره مند خواهید شد و کاربران شما همچنان می توانند برنامه شما را بر روی دستگاه های خود اجرا کنند، حتی اگر آخرین نسخه اندروید را اجرا نکنند.
از نظر عملکرد، استفاده از کاتلین هیچ ضرری به همراه ندارد. کد تولید شده توسط کامپایلر کاتلین به اندازه کدهای جاوا معمولی کارآمد اجرا می شود. زمان اجرا استفاده شده توسط کاتلین نسبتاً کم است، بنابراین شما افزایش زیادی در اندازه بسته برنامه کامپایل شده را تجربه نخواهید کرد. و هنگامی که از lambdas استفاده می کنید، بسیاری از توابع کتابخانه استاندارد کاتلین آنها را درون خطی می کنند. lambdas های داخلی تضمین می کند که هیچ شی جدیدی ایجاد نمی شود و برنامه از توقف های اضافی GC رنج نمی برد.
پس از بررسی مزایای کاتلین در مقایسه با جاوا، اکنون به فلسفه کاتلین نگاه می کنیم - ویژگی های اصلی که کاتلین را از سایر زبان های مدرن که JVM را هدف قرار می دهند متمایز می کند.
وقتی درباره کاتلین صحبت می کنیم ، دوست داریم بگوییم که این یک زبان pragmatic، مختصر و ایمن با تمرکز بر قابلیت همکاری است. منظور ما از هر یک از این کلمات دقیقاً چیست؟ بیایید به نوبه خود به آنها نگاه کنیم.
pragmatic برای ما یک چیز ساده است: کاتلین یک زبان کاربردی است که برای حل مشکلات دنیای واقعی طراحی شده است. طراحی آن بر اساس سالها تجربه صنعت در ایجاد سیستمهای بزرگ است و ویژگیهای آن برای رسیدگی به موارد استفاده که توسط بسیاری از برنامه نویسان نرمافزار با آن مواجه میشوند انتخاب شدهاند. علاوه بر این، برنامه نویسان هم در JetBrains و هم در جامعه چندین سال است که از نسخه های اولیه Kotlin استفاده می کنند و بازخورد آنها نسخه منتشر شده این زبان است. این باعث میشود مطمئن باشیم که کاتلین میتواند به حل مشکلات در پروژههای واقعی کمک کند.
کاتلین نیز یک زبان تحقیقاتی نیست. ما در تلاش برای پیشرفت در طراحی زبان برنامه نویسی و کشف ایده های نوآورانه در علوم کامپیوتر نیستیم. در عوض، هر زمان که ممکن باشد، ما به ویژگیها و راهحلهایی تکیه میکنیم که قبلاً در زبانهای برنامهنویسی دیگر ظاهر شدهاند و موفقیت آمیز بودنشان را ثابت کردهاند. این امر پیچیدگی زبان را کاهش میدهد و یادگیری آن را با تکیه بر مفاهیم آشنا آسانتر میکند.
علاوه بر این، کاتلین از هیچ سبک یا پارادایم برنامه نویسی خاصی استفاده نمی کند. همانطور که شروع به مطالعه زبان می کنید، می توانید از سبک و تکنیک هایی استفاده کنید که از تجربه جاوا برای شما آشنا هستند. بعداً، به تدریج ویژگی های قدرتمندتر کاتلین را کشف خواهید کرد و یاد می گیرید که آنها را در کد خود به کار ببرید، تا آن را مختصرتر و مصطلح تر کنید.
یکی دیگر از جنبه های pragmatic کاتلین تمرکز آن بر ابزارسازی است. یک محیط توسعه هوشمند به اندازه یک زبان خوب برای بهره وری یک توسعه دهنده ضروری است. و به همین دلیل، در نظر گرفتن پشتیبانی IDE به عنوان راه چاره ، جزو گزینه نیست. در مورد کاتلین ، پلاگین IntelliJ IDEA دقیقا به همون ترتیب با کامپایلر توسعه داده شد و ویژگی های زبان همیشه با در نظر گرفتن ابزار، طراحی می شدند.
پشتیبانی IDE همچنین نقش مهمی در کمک به شما در کشف ویژگی های کاتلین ایفا می کند. در بسیاری از موارد، ابزارها به طور خودکار الگوهای کد معمولی را که میتوانند با ساختارهای مختصر جایگزین شوند، شناسایی میکنند و پیشنهاد میکنند کد را برای شما اصلاح کنند. با مطالعه ویژگی های زبان مورد استفاده توسط اصلاحات خودکار، می توانید یاد بگیرید که آن ویژگی ها را در کد خود نیز اعمال کنید.
معمولا توسعه دهندگان زمان بیشتری را صرف خواندن کدهای موجود می کنند تا نوشتن کد جدید. تصور کنید که بخشی از تیمی هستید که در حال توسعه یک پروژه بزرگ هستید و باید یک ویژگی جدید اضافه کنید یا یک باگ را برطرف کنید. اولین قدم های شما چیست؟ شما به دنبال بخش دقیق کدی که باید تغییر دهید میگردید و بعد اونو اصلاح میکنید. شما کدهای زیادی را می خوانید تا بفهمید چه کاری باید انجام دهید. این کد ممکن است اخیراً توسط همکاران شما، یا توسط شخصی که دیگر روی پروژه کار نمی کند، یا توسط شما، اما مدت ها پیش نوشته شده باشد. فقط پس از درک و تسلط کدها می توانید تغییرات لازم را انجام دهید.
هرچه کد سادهتر و مختصرتر باشد، سریعتر متوجه خواهید شد که چه خبر است. البته طراحی خوب و نام های رسا در اینجا نقش بسزایی دارند. اما انتخاب زبان و مختصر بودن آن نیز مهم است. در صورتی این زبان مختصر است که syntax آن به وضوح هدف کدی را که خواندهاید بیان کند و آن را با صفحهای که برای مشخص کردن نحوه انجام این هدف لازم است پنهان نکند.
در کاتلین ، ما تلاش زیادی کردهایم تا اطمینان حاصل کنیم که تمام کدهایی که مینویسید دارای معنی هستند و فقط برای برآوردن الزامات ساختار کد در آنجا نیستند. بسیاری از استانداردهای جاوا، مانند دریافتکنندهها(getters)، ارسال کننده ها (setters)و منطق اختصاص دادن پارامترهای سازنده به فیلدها، در کاتلین همیشه پیدا میشود و کد منبع شما را به هم نمیریزند.
یکی دیگر از دلایل طولانی بودن کد غیر ضروری، نوشتن کد واضح برای انجام کارهایی که انجام می شود، مانند مکان یابی یک عنصر در یک مجموعه است. درست مانند بسیاری از زبانهای مدرن دیگر، کاتلین یک کتابخانه استاندارد غنی دارد که به شما امکان میدهد این بخشهای طولانی و تکراری کد را با صدا کردن method های کتابخانه جایگزین کنید. پشتیبانی کاتلین از لامبدا انتقال بلوک های کوچک کد به توابع کتابخانه را آسان می کند. این به شما امکان میدهد تمام قسمتهای مشترک کتابخانه را کپسوله (encapsulate )کنید و فقط بخش منحصر به فرد و مختص کار را در کد کاربر نگه دارید.
در عین حال، کاتلین سعی نمی کند کد منبع را به کمترین تعداد کاراکتر ممکن جمع کند. به عنوان مثال، حتی اگر کاتلین از بارگذاری بیش از حد اپراتور پشتیبانی می کند، کاربران نمی توانند اپراتورهای خود را تعریف کنند. بنابراین، توسعهدهندگان کتابخانه نمیتوانند نام method ها را با علائمی مانند (punctuation ) نقطه، کاما و پرانتز و... جایگزین کنند. کلمات معمولاً راحتتر از علائم نگارشی خوانده میشوند و یافتن اسناد روی آنها آسانتر است.
کد مختصرتر زمان کمتری برای نوشتن و مهمتر از آن زمان کمتری برای خواندن نیاز دارد. این کار بهره وری شما را بهبود می بخشد و به شما امکان می دهد کارها را سریعتر انجام دهید.
به طور کلی، وقتی از یک زبان برنامه نویسی به عنوان زبان ایمن صحبت می کنیم، به این معنی است که طراحی آن از انواع خاصی از خطاها در یک برنامه جلوگیری می کند. البته، این یک برتری مطلق نیست؛ هیچ زبانی از تمام خطاهای احتمالی جلوگیری نمی کند. علاوه بر این، جلوگیری از خطاها معمولاً هزینه دارد. شما باید به کامپایلر اطلاعات بیشتری در مورد عملکرد مورد نظر برنامه بدهید، بنابراین کامپایلر می تواند تأیید کند که اطلاعات با آنچه برنامه انجام می دهد مطابقت دارد. به همین دلیل، همیشه بین سطح ایمنی شما و از دست دادن بهره وری لازم برای قرار دادن 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) و هم با استفاده از ابزارهای مختلف را مورد بحث قرار خواهیم داد.
درست مانند جاوا، کاتلین یک زبان کامپایل شده است. این بدان معناست که قبل از اینکه بتوانید کد کاتلین را اجرا کنید، باید آن را کامپایل کنید. بیایید در مورد نحوه عملکرد فرآیند کامپایل بحث کنیم و سپس به ابزارهای مختلفی که از آن برای شما محافظت می کنند نگاهی بیندازیم. اگر به اطلاعات بیشتری در مورد راهاندازی محیط خود نیاز دارید، لطفاً به بخش «آموزشها» در وبسایت کاتلین ( https://kotlinlang.org/docs/tutorials ) مراجعه کنید.
کد منبع کاتلین معمولاً در فایل هایی با پسوند 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 ) از برنامه شما محافظت می کنند.
پلاگین 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 کلیک کنید و کاتلین را از لیست انتخاب کنید.
اگر می خواهید به سرعت قطعات کوچک کد کاتلین را امتحان کنید، می توانید این کار را با استفاده از پوسته تعاملی (به اصطلاح REPL) انجام دهید. در REPL می توانید کد Kotlin را خط به خط تایپ کنید و بلافاصله نتایج اجرای آن را مشاهده کنید. برای شروع REPL، میتوانید دستور kotlinc را بدون آرگومان اجرا کنید یا از آیتم منوی مربوطه در افزونه IntelliJ IDEA استفاده کنید.
اگر کاربر Eclipse هستید، می توانید از کاتلین در IDE خود نیز استفاده کنید. پلاگین Kotlin Eclipse ،functionality های ضروری IDE مانند navigation و تکمیل کد را ارائه می دهد. این پلاگین در بازار Eclipse موجود است. برای نصب آن، آیتم منوی Help > Eclipse Marketplace را انتخاب کنید و کاتلین را در لیست جستجو کنید.
ساده ترین راه برای امتحان کاتلین نیازی به نصب یا پیکربندی(configuration) ندارد. در http://try.kotl.in ، می توانید یک محیط کاری آنلاین پیدا کنید که در آن می توانید برنامه های کوچک کاتلین را بنویسید، کامپایل و اجرا کنید. محیط کاری انلاین دارای نمونه کدهایی است که ویژگیهای کاتلین را نشان میدهد، از جمله تمام نمونههای این کتاب، و همچنین یک سری تمرین برای یادگیری کاتلین به صورت واکنشی.
سرعت گرفتن با یک زبان جدید هرگز آسان نیست. خوشبختانه، ما یک میانبر کوچک زیبا ایجاد کرده ایم که به شما امکان می دهد با تکیه بر دانش موجود خود از جاوا، سرعت یادگیری و پذیرش خود را افزایش دهید. این ابزار تبدیل خودکار جاوا به کاتلین است.
همانطور که شروع به یادگیری کاتلین می کنید، مبدل می تواند به شما کمک کند تا زمانی که syntax دقیق آن را به خاطر نمی آورید، چیزی را بیان کنید. میتوانید قطعه مربوطه را در جاوا بنویسید و سپس آن را در یک فایل کاتلین جایگذاری کنید، و مبدل به طور خودکار پیشنهاد میکند تا کد را به کاتلین تبدیل کند. نتیجه همیشه اصلاح شده ترین (مختصر و کامل) نخواهد بود، اما کد کار می کند و شما می توانید از این روش در کار خود پیشرفت کنید.
این مبدل همچنین عالیه برای اضافه کردن کاتلین به یک پروژه جاوا که از قبل وجود دارد. هنگامی که نیاز به نوشتن یک کلاس جدید دارید، می توانید آن را از همان ابتدا در کاتلین انجام دهید. اما اگر نیاز به ایجاد تغییرات قابل توجه در کلاس موجود دارید، ممکن است بخواهید از کاتلین در این فرآیند نیز استفاده کنید. اینجاست که مبدل وارد عمل می شود. شما ابتدا کلاس را به کاتلین تبدیل می کنید و سپس تغییرات را با استفاده از تمام مزایای یک زبان مدرن اضافه می کنید.
استفاده از مبدل در IntelliJ IDEA بسیار آسان است. میتوانید یک قطعه کد جاوا را کپی کرده و آن را در یک فایل کاتلین جایگذاری کنید، یا در صورت نیاز به تبدیل کل فایل ، فرآیند تبدیل فایل جاوا به فایل کاتلین را فراخوانی کنید. مبدل در Eclipse و مبدل آنلاین نیز قابل دسترسی است.