کاتلین یاد بگیریم! (قسمت ۶)

کنترل گردش اجرا - Flow Control
کنترل گردش اجرا - Flow Control

سلام و روزبخیر به همه. این هفته بر اساس قولی که داده بودیم میخوایم بریم سراغ «کنترل گردش» یا Flow Control, در زبان برنامه‌نویسی کاتلین(Kotlin) و قطعا مطالعه قسمت قبل مثل همیشه ضروری هست:

http://vrgl.ir/RqYpA

در زبان برنامه‌نویسی Kotlin گردش کار و قواعد مورد استفاده در اون بسیار شبیه به زبان‌های دیگه هست. اما بگذارید قبل از اینکه وارد دستورات بشویم، یک توضیحی بدیم در مورد مفهوم کنترل گردش برای کسایی که دارن همزمان با ما برنامه‌نویسی را هم یاد میگیرن:

تعریف ساده «کنترل گردش»:
تغییر فرآیند اجرای دستورات بر اساس یکسری شروط منطقی با خروجی‌های بله و خیر یا درست و غلط و تصمیم‌گیری روی آن‌ها.

مثال: فرآیند درست کردن ماکارونی. مثلاْ توی مرحله اول پختن ماکارونی این سوال را از خودمون میپرسیم که: «آیا ماکارونی داریم؟». اگر(if) جواب مثبت(true) باشه یک کاری میکنیم - مثلا میریم آب داغ میکنیم یا بررسی میکنیم ببینیم سس داریم یا نه - و در غیر اینصورت(else) اگر پاسخ منفی(false) باشه اونوقت یک کار دیگه ای میکنیم - مثلاً میریم ماکارونی میخریم.

با این تعریف ساده و نشانه‌هایی که از خودمون در توضیح به جا گذاشتیم میتونیم بریم سراغ اصل ماجرا. در زبان کاتلین دو - یا به عبارتی هم سه - دستور برای کنترل اجرای برنامه if و if..else و when.

گزاره کنترل گردش if

اولین دستور کنترل گردش دستور if هست. ساختار این دستور به شکل زیر هست:

https://gist.github.com/sobhanattar/2113630bdbaad07bed922dfd9b0a9214

در این دستور و در تمام دستورات کنترل گردش مقدار condition تنها می‌تواند مقدار درست true یا غلط false داشته باشه. در صورتی که حاصل condition برابر true باشد، گزاره‌های داخل شرط اجرا شده و در غیر اینصورت این دستور اجرا نمیشه. یک مثال دیگه ببینیم:

https://gist.github.com/sobhanattar/150d396333c95d44e1a46ae4adb60b7b

همونطور که در مثال بالا میبینیم، چون باقی‌مانده number به 2 مقدار 0 دارد و در نتیجه شرط خروجی true دارد، دستورات داخل گزاره شرط اجرا می‌شود. همونطور که گفتیم condition میتونه هر گزاره شرطی باشه که خروجی true یا false داشته باشه. در مثال زیر ما از کلمه کلیدی is برای بررسی نوع ثابت number استفاده کردیم که خروجی آن true یا false هست استفاده کردیم:

https://gist.github.com/sobhanattar/9da797bc550c9267d5479e458503e241

گزاره کنترل گردش if..else

گزاره if..else روش عملکردش این هست که اگر مقدار condition حاصلش true باشه گزاره‌های داخل if اجرا میشه و اگر حاصل false باشه گزاره‌های داخل else اجرا خواهد شد.

https://gist.github.com/sobhanattar/aa43fe1820fdd0fa7d96b512fb5c5b75

مثال زیر میتونه گویاتر باشه:

https://gist.github.com/sobhanattar/33b17b04051fe12ba1907467c7689dd4

همونطور که در مثال بالا میبینیم چون شرط number % 2 == 0 صادق نیست گزاره‌های داخل else اجرا شده و خروجی بالا را ایجاد می‌کند. اما یکی از ویژگی‌های فوق‌العاده‌ای که کاتلین داره و خیلی از زبان‌ها ندارند و واقعاً کاربردیه اینه که شما میتونین خروجی اجرای دستورات داخل if..else را به عنوان مقدار بازگشتی یا return value داخل یک متغیر بریزین! مثال زیر را ببینیم:

https://gist.github.com/sobhanattar/caa972f292fc1eb5b352853a7c2afaee

همونطور که در مثال بالا میبینیم ما مقدار داخل else را در متغیر result ریختیم و بعد از if..else آن را چاپ کردیم. دقت کنیم ما اینجا از کل if..else به عنوان یک گزاره که یک نتیجه برمیگردونه استفاده میکنیم و در نتیجه این فرآیند برای if تنها امکان‌پذیر نیست و اگر این کار را بکنیم خطای زیر را دریافت میکنیم:

https://gist.github.com/sobhanattar/164ac0070909c6425021be2dec2caeaf

نکته دیگه‌ای که وجود داره اینه که اگر ما داخل بخش if یا else بیش از یک مقدار برگشتی داشته باشیم فقط مقدار آخر برمیگرده:

https://gist.github.com/sobhanattar/809fa2cf10013b26fc9e7df61034f87c

و اینکه این مقدار بازگشتی برای هر نوعی امکانپذیره:

https://gist.github.com/sobhanattar/0e74090bb1f1692e6e5285eb5c8ffb71

در واقع با این روش کاتلین نیاز به اپراتور سه‌گانه یا ternary operator را حذف کرده و دیگه نیازی بهش نیست.

توجه کنید که شما هر تعداد if..else را که بخواهید میتونید توی هم استفاده کنید تا بتونید به بهترین شکل کنترل گردش کدتون را به دست بگیرید ولی حواستون باشه که استفاده if های تو در تو یا nested if میتونه بعداً در بازبینی و نگهداری و تغییر در کد کارتون را خیلی سخت کنه. پس سعی کنید تا میتونید if..else های ساده داشته باشید و برید به سمت if-less programming یا برنامه‌نویسی بدون if .

گزاره when

گزاره when که در زبان‌های مختلفی مانند ++C و Java و PHP و غیره با نام‌ switch..case شناخته میشه، کارکردش تصمیم‌گیری در مورد مقدار ورودی به آن هست و بسیار قدرتمندتر از switch..case است. گزاره when قابلیت انجام اعمال مختلفی روی مقادیر انواع کاتلین مثل Int Byte ، String و Short و یا هر شی دیگری دارد. مثال زیر را ببینیم:

https://gist.github.com/sobhanattar/7d1f37f4f0a93333cf96acd28e84bae8

در مثال بالا گزاره when مقدار number را بررسی کرده و بر اساس مقدار آن و مقادیری که داخل آن وجود دارد اقدام به تصمیم‌گیری می‌کند که در بالا منجر به چاپ گزاره داخل else که معادل break در switch..case است، شده است. حالا اگر بخواهیم بیش از یک دستور را در زمان یافتن مقدار مورد بررسی در when انجام دهیم میتونیم از {} استفاده کنیم:

https://gist.github.com/sobhanattar/a4d60d3771093c80a66882e7c1df9b45

علاوه بر این میتونیم برای چند مقدار یک عمل خاص را انجام دهیم:

https://gist.github.com/sobhanattar/d04162e2b82d56830bdf302599b5537f

خوب اینم از بحث گردش کنترل. متوقف نشید و مثال حل کنید.