پارامتر و آرگومان

پارامترها، داده‌های خامی هستند که، تابع آنها را پردازش می‌کند و سپس اطلاعاتی را که به دنبال آن هستید، در اختیار شما قرار می‌دهد. فرض کنید پارامترها مانند اطلاعاتی هستند که، شما به یک کارمند می‌دهید که بر طبق آنها کارش را به پایان برساند. یک تابع می‌تواند هر تعداد پارامتر داشته باشد. هر پارامتر می‌تواند از انواع مختلف داده باشد. در زیر یک تابع با N پارامتر نشان داده شده است :

fun functionName(param1: datatype , param2: datatype , ... paramN: datatype)
{
   code to execute;
}

پارامترها، بعد از نام تابع و بین پرانتزها قرار می‌گیرند. بر اساس کاری که تابع انجام می‌دهد، می‌توان تعداد پارامترهای زیادی به تابع اضافه کرد. بعد از فراخوانی یک تابع باید آرگومانهای آن را نیز تأمین کنید. آرگومان‌ها، مقادیری هستند که به پارامترها اختصاص داده می‌شوند. ترتیب ارسال آرگومانها به پارامترها مهم است. عدم رعایت ترتیب در ارسال آرگومانها باعث به وجود آمدن خطای منطقی و خطای زمان اجرا می‌شود. اجازه بدهید که یک مثال بزنیم :

  1: fun calculateSum(number1: Int, number2: Int): Int
  2: {
  3:     return number1 + number2
  4: }
  5: 
  6: fun main(args: Array<String>)
  7: {
  8:     print("Enter the first number: ")
  9:     val num1 = readLine() !!.toInt()
 10:     print("Enter the second number: ")
 11:     val num2 = readLine() !!.toInt()
 12: 
 13:     println("Sum = ${calculateSum(num1, num2)}")
 14: }
Enter the first number: 10
Enter the second number: 5
Sum = 15

در برنامه بالا یک تابع به نام ()calculateSum (خطوط 4-1) تعریف شده است که وظیفه آن جمع مقدار دو عدد است. چون این تابع مقدار دو عدد صحیح را با هم جمع می‌کند پس نوع برگشتی ما نیز باید int باشد. تابع دارای دو پارامتر است که اعداد را به آنها ارسال می‌کنیم. به نوع داده‌ای پارامترها توجه کنید. هر دو پارامتر یعنی number1 و number2 مقادیری از نوع اعداد صحیح (int) دریافت می‌کنند. در بدنه تابع دستور return نتیجه جمع دو عدد را بر می‌گرداند. در داخل تابع ()main برنامه از کاربر دو مقدار را درخواست می‌کند و آنها را داخل متغیرها قرار می‌دهد. حال تابع را که آرگومانهای آن را آماده کرده‌ایم فراخوانی می‌کنیم. مقدار num1 به پارامتر اول و مقدار num2 به پارامتر دوم ارسال می‌شود. حال اگر مکان دو مقدار را هنگام ارسال به تابع تغییر دهیم (یعنی مقدار num2 به پارامتر اول و مقدار num1 به پارامتر دوم ارسال شود) هیچ تغییری در نتیجه تابع ندارد چون جمع خاصیت جابه جایی دارد.

فقط به یاد داشته باشید که باید ترتیب ارسال آرگومانها هنگام فراخوانی تابع دقیقاً با ترتیب قرار گیری پارامترها تعریف شده در تابع مطابقت داشته باشد. بعد از ارسال مقادیر 10 و 5 به پارامترها، پارامترها آنها را دریافت می‌کنند. به این نکته نیز توجه کنید که نام پارامترها طبق قرارداد به شیوه کوهان شتری یا camelCasing (حرف اول دومین کلمه بزرگ نوشته می‌شود) نوشته می‌شود. در داخل بدنه تابع (خط 3) دو مقدار با هم جمع می‌شوند و نتیجه به تابع فراخوان (تابعی که تابع ()calculateSum را فراخوانی می‌کند) ارسال می‌شود.

در درس آینده از یک متغیر برای ذخیره نتیجه محاسبات استفاده می‌کنیم ولی در اینجا مشاهده می‌کنید که می‌توان به سادگی نتیجه جمع را نشان داد (خط 3). در داخل تابع ()main از ما دو عدد که قرار است با هم جمع شوند درخواست می‌شود.

در خط 13 تابع ()calculateSum را فراخوانی می‌کنیم و دو مقدار صحیح به آن ارسال می‌کنیم. دو عدد صحیح در داخل تابع با هم جمع شده و نتیجه آنها برگردانده می‌شود. مقدار برگشت داده شده از تابع به وسیله تابع ()print نمایش داده می‌شود. (خط 13) در برنامه زیر یک تابع تعریف شده است که دارای دو پارامتر از دو نوع داده‌ای مختلف است:

  1: fun showMessageAndNumber(message: String, number: Int)
  2: {
  3:     println(message)
  4:     println("Number = $number")
  5: }
  6: 
  7: fun main(args: Array<String>)
  8: {
  9:     showMessageAndNumber("Hello World!", 100)
 10: }
Hello World!
Number = 100

در مثال بالا یک تابع تعریف شده است که اولین پارامتر آن مقداری از نوع رشته و دومین پارامتر آن مقداری از نوع Int دریافت می‌کند. تابع به سادگی دو مقداری که به آن ارسال شده است را نشان می‌دهد. در خط 9 تابع را اول با یک رشته و سپس یک عدد خاص فراخوانی می‌کنیم. حال اگر تابع به صورت زیر فراخوانی می‌شد :

showMessageAndNumber(100, "Welcome to Gimme Kotlin!");

در برنامه خطا به وجود می‌آمد چون عدد 100 به پارامتری از نوع رشته و رشته !Hello World به پارامتری از نوع اعداد صحیح ارسال می‌شد. این نشان می‌دهد که ترتیب ارسال آرگومانها به پارامترها هنگام فراخوانی تابع مهم است.

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

fun showPersonStats(age: Int, height:Int)
{
    println("Age = $age")
    println("Height = $height")
}

//Using the proper order of arguments
showPersonStats(20, 160)

//Acceptable, but produces odd results
showPersonStats(160, 20)

در مثال بالا، نشان داده شده است که حتی اگر تابع دو آرگومان با یک نوع داده‌ای قبول کند باز هم بهتر است ترتیب بر اساس تعریف پارامترها رعایت شود. به عنوان مثال، در اولین فراخوانی تابع بالا اشکالی به چشم نمی‌آید، چون سن شخص 20 و قد او 160 سانتی متر است. اگر آرگومانها را به ترتیب ارسال نکنیم سن شخص 160 و قد او 20 سانتی متر می‌شود که به واقعیت نزدیک نیست. دانستن مبانی مقادیر برگشتی و ارسال آرگومانها باعث می‌شود که شما توابع کارآمدتری تعریف کنید. تکه کد زیر نشان می‌دهد که، شما حتی می‌توانید مقدار برگشتی از یک تابع را به عنوان آرگومان به تابع دیگر، ارسال کنید.

fun myFunction() : Int
{
    return 5
}

fun anotherFunction(number:Int)
{
    println(number)
}

fun main(args: Array<String>)
{
    // Codes skipped for demonstration
    anotherFunction(myFunction())
}

چون مقدار برگشتی تابع ()myFunction عدد 5 است و به عنوان آرگومان به تابع ()anotherFunctionارسال می‌شود، خروجی کد بالا هم عدد 5 است.