در این تکلیف، شما درباره مقدارهای پیشفرض برای تابعها و متدها یاد میگیرید. شما درباره توابع فشرده، که میتوانند کد شما را خواندنی و مختصر کند یاد میگیرید، و میتوانید تعداد مسیرهای کد را برای تست کردن کاهش دهید. توابع فشرده، توابع تک عبارتی هم خوانده میشوند.
گام 1: یک مقدار پیشفرض برای یک پارامتر بسازید
در کاتلین، شما میتوانید آرگومانها را توسط نام پارامتر واگذار کنید. شما همچنین میتوانید مقدارهای پیشفرض برای پارامترها مشخص کنید: اگر یک آرگومان توسط صدا زننده تامین نشود، مقدار پیشفرض استفاده میشود. بعدتر میتوانید متد (تابع عضو) بنویسید.
1. در Hello.kt، یک تابع ()swim با یک پارامتر رشتهای به نام speed بنویسید که سرعت ماهی را چاپ میکند. پارامتر speed یک مقدار پیشفرض fast دارد.
fun swim(speed: String = "fast") { println("swimming $speed") }
2. از تابع ()main، تابع ()swim را به سه روش صدا بزنید. اول تابع را با مقدار پیشفرض صدا بزنید. بعد تابع را صدا بزنید و پارامتر (مقدار) speed را بدون نام واگذار کنید، بعد تابع را با نامگذاری پارامتر speed صدا بزنید.
swim() // uses default speed swim("slow") // positional argument swim(speed="turtle-like") // named parameter ⇒ swimming fast swimming slow swimming turtle-like
آرگومانها از نام پارامتر استفاده نمیکنند، شما میتوانید آرگومانها را به ترتیب تعریف شده واگذار کنید. اما با مقادیر پیشفرض، این میتواند مقداری گیج کننده باشد، پس راه بهتر این است که پارامترهای بدون مقدار پیشفرض را ابتدا قرار دهید و پارامترها با مقدار پیشفرض را بعدتر قرار دهید.
گام 2: پارامترهای مورد نیاز را اضافه کنید
اگر هیچ مقدار پیشفرضی برای یک پارامتر مشخص نشده باشد، آرگومان متناظر باید همیشه واگذار شود.
1. در Hello.kt یک تابع ()shouldChangeWater که سه پارامتر: day ، temperature و dirty را میگیرد بنویسید. تابع مقدار true را برمیگرداند اگر آب نیاز به عوض شدن داشته باشد، که به این شرط اتفاق میافتد: Sunday (یکشنبه) باشد، اگر دما زیاد بالا باشد، یا اگر آب کثیف باشد. روز هفته مورد نیاز است، اما دمای پیشفرض 22 است و سطح کثیفی (dirty) مقدار 20 است.
از عبارت when بدون آرگومان استفاده کنید، که در کاتلین مثل مجموعهای از چکهای if / else if عمل میکند.
fun shouldChangeWater (day: String, temperature: Int = 22, dirty: Int = 20): Boolean { return when { temperature > 30 -> true dirty > 30 -> true day == "Sunday" -> true else -> false } }
2. تابع ()shouldChangeWater از ()feedTheFish را صدا بزنید و روز را به آن بدهید. پارامتر day پیشفرض ندارد، پس باید یک آرگومان مشخص کنید. دو پارامتر دیگر ()shouldChangeWater مقادیر پیشفرض دارند، پس نیازی به واگذاری آرگومان به آنها نیست.
fun feedTheFish() { val day = randomDay() val food = fishFood(day) println ("Today is $day and the fish eat $food") println("Change water: ${shouldChangeWater(day)}") } => Today is Thursday and the fish eat granules Change water: false
گام 3: تابعهای فشرده بسازید
عبارت when که در گام قبل نوشتید مقدار زیادی منطق را در مقدار کمی کد بسته بندی میکند. اگر بخواهید آن را باز کنید، یا اگر شرطهایی که چک میکنید پیچیدهتر بودند، شما میتوانستید از متغیرهای محلی استفاده کنید. اما راه کاتلین برای انجام این کار تابع های فشرده است.
توابع فشرده، یا توابع تک عبارتی، یک الگوی معمول در کاتلین هستند. وقتی یک تابع نتایج یک تابع تک عبارتی را برمیگرداند، شما میتوانید بدنه تابع را بعد از یک نشانه = مشخص کنید، آکولاد {} و return را حذف کنید.
1. در Hello.kt، توابع فشردهای برای چک کردن شرطها اضافه کنید.
fun isTooHot(temperature: Int) = temperature > 30 fun isDirty(dirty: Int) = dirty > 30 fun isSunday(day: String) = day == "Sunday"
2. تابع ()shouldChangeWater را تغییر دهید تا توابع جدیدی را صدا بزند.
fun shouldChangeWater (day: String, temperature: Int = 22, dirty: Int = 20): Boolean { return when { isTooHot(temperature) -> true isDirty(dirty) -> true isSunday(day) -> true else -> false } }
3. برنامه را اجرا کنید. خروجی از ()println با ()shouldChangeWater باید یکی باشد.
مقادیر پیشفرض
مقدار پیشفرض برای یک پارامتر لازم نیست مقدار باشد. میتواند تابعی دیگر باشد، مثل مثال پایین:
fun shouldChangeWater (day: String, temperature: Int = 22, dirty: Int = getDirtySensorReading()): Boolean { ...
یک تابع به عنوان مقدار پیشفرض در زمان اجرا ارزیابی میشود، پس نمیتوانید یک عملیات سنگین مثل خواندن فایل یا تخصیص حافظه را درون تابع انجام دهید. این عملیات هر بار تابع شما صدا زده شود اجرا میشود و برنامه شما را کند میکند.