اسکوپ فانکشن (Scope functions) یا توابع دامنه باعث ساده شدن کد های ما برای نوشتن یک پروژه و همچنین برای اینکه کد های ما تمیز باشند استفاده می شود و همچنین یکی از کاربرد های مهم آن این است که به وسیله اسکوپ فانکشن (Scope functions) می توانیم . یک کار تیمی بزرگی را انجام بدهیم .
اسکوپ فانکشن (Scope functions) چیه؟
واما سوال مهم تر این است که Scope functions یا توابع دامنه چی هستن؟ توابعی در کتابخانه های استاندارد کاتلین وجود دارد که هدف اول و آخر آنها اجرای یک بلوک کد در چارجوب یک شی است . و هنگامی که ما چنین توابعی را بر روی شی با بیان لامبدا ارائه شده فراخوانی می کنیم . یک دامنه موقتی تشکیل می شود که در این محدوده می توانید بدون نام آن به شی دسترسی داشته باشید. به صورت خلاصه بگم بهتون برای شی ما یک قمرو ایجاد می کند.
شاید برای شما یکم گیچ کننده باشد ولی اصلا نگران نباشین چون با مشاهده مثال های که برای شما میزنیم کاملا آنها را متوجه خواهید شد . ابتدا بزارید یک مثال ساده بزنم براتون تا متوجه بشید که چرا باید از اسکوپ فانکشن(Scope functions) ها استفاده بکنیم و روش های دیگر را کنار بگذاریم.
فرض کنید ما یک کلاس تو کاتلین داریم . اون کلاس مقادیری نظیر نام و نام خانوادگی و سن را از مخاطبین خودش می گیرد .
1 |
class UserData(var user_name :String , var user_LastName : String ,var user_Age : Int) |
احتمال دارد یک مقدار مثل سن را گرفته باشیم . ولی قصد داریم دو مقدار بعدی را در طول برنامه از کاربران خود دریافت کنیم . حالا ما برای اینکه این اطلاعات را کاربران در طول برنامه وارد کنند . دوتا راه داریم . یک راه این است که ما باید یک شی از کلاس بسازیم . برای نام و نام خانوادگی که یک خاصیت هستند . هر دفعه با استفاده شی کلاسمون مقدار آن ها را اضافه کنیم.
1 2 3 |
val user=UserData("","",20) user.user_name="AliReza" user.user_LastName="Habibi" |
و اما دومین راه استفاده از اسکوپ فانکشن هست . که برای شی ما یک قلمرو درست می کند و می توانیم همه این کار ها را در آن انجام بدهیم . و این کار ها به وسیله اسکوپ فانکشن ها خیلی راحت انجام می شود .
1 2 3 4 5 |
UserData("","",25).run { user_name="AliReza" user_LastName="Habibi" } |
توابع دامنه یا اسکوپ فانکشن چند حالت دارد.؟
این را برای شما بگویم که اسکوپ فانکشن (Scope functions) یا توابع دامنه 5 حالت می باشد که ما همه آنها را برای شما توضیح می دهیم . کاربرد آن هارا نیز برای شما بیان می کنیم .این 5تا عبارتند از let , run , with , apply , also می باشد . که دونه دونه برای شما توضیح می دهیم .

دستورات scope functions در کاتلین
دستور Let در اسکوپ فانکشن (Scope functions) یا توابع دامنه
ابتدا اندروید استودیو را باز کنید . و یک پروژه دلخواه به نام “kotlinme” در اندروید استودیو درست کنید . در هنگام درست کردن این پروژه یک اکتیویتی نیز به اسم MainActivity درست می شود .

پروژه جدید در اندروید استودیو در برنامه نویسی کاتلین
و بعد از آن یک کلاس به نام Data درست کنید . مانند تصویر زیر :

ایجاد کلاس Data در اندروید استودیو در برنامه نویسی کاتلین
حالا کد های زیر را در DataClass بنویسید . ما می خواهیم برای شما نشان دهیم که چگونه از داخل MainActivity به این داده ها توسط Scope functions یا توابع دامنه ها دسترسی پیدا می کنیم و می توانیم آن ها به راحتی تغیر دهیم .
1 2 3 4 5 6 7 |
package com.example.kotlinme class UserData(var user_name :String , var user_LastName : String ,var user_Age : Int){ fun test(){ user_Age++ } } |
کد های بالا در داخل کلاس Data قرار دارد حالا ما می خواهیم به وسیله دستور Let به آن دسترسی پیدا کنیم و تغییر بدیم و یا هر کاری که می خواهید انجام بدهید .
کد های زیر برای لایه activity ما هستند . صفحه ی که ساخته ایم تا این مبحث را بهتر درک کنید .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:id="@+id/txt1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" /> <TextView android:id="@+id/txt2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" /> <TextView android:id="@+id/txt3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" /> </LinearLayout> |
همانطور که در قسمت پایین مشاهده می کنید . من به وسیله دستور Let به کلاس Data دسترسی پیدا کردم. ما در داخل براکت Let به وسیله اشاره گر it که به مقادیر داخل کلاس Data اشاره دارد. و ما به وسیله اشاره it میتوانیم آن ها را تغیر بدهیم و یا اگر مقادیری دارند. از آن ها استفاده کنیم . و هم چنین یکی دیگر از کاربرد های let این است که آخرین مقدار را برای ما بر می گرداند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
package com.example.kotlinme import android.nfc.Tag import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.util.Log import android.widget.TextView class MainActivity : AppCompatActivity() { lateinit var Text1: TextView lateinit var Text2: TextView lateinit var Text3: TextView override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) Text1 = findViewById(R.id.txt1) Text2 = findViewById(R.id.txt2) Text3 = findViewById(R.id.txt3) Data(25).let { val item = it.test() Text1.text = it.name Text2.text = it.lastname Text3.text = item.toString() } } } |
خروجی کد بالا نام ونام خانوادگی و سن کاربر هست که ما چاپ می کنیم و شما هم می توانید با انجام دادن کار هایی که به شما گفتم نحوی کار اسکوپ فانکشن ها رو مشاهده کنید.
دستور also در Scope functions یا توابع دامنه
این دستور هم مانند دستور Let کار خود را انجام می دهد . و اما تفاوت های آن این است که Let آخرین دستور را برای ما برمی گرداند. ولی also اخرین شی را برمی گرداند . مثال پایین نمونه استفاده از also و اینکه ما می توانیم در یک اسکوپ فانکشن از دستور دیگرش هم استفاده بکنیم.
1 2 3 4 5 6 7 8 |
val res= UserData("","",25).also { it.user_name="AliReza" it.user_LastName="Habibi" UserData("","",24).let { it.test() } } |
دستور apply در اسکوپ فانکشن (Scope functions) یا توابع دامنه
من در این دستور یک استفاده متفاوت از Scope functions یا توابع دامنه را برای شما آورده ایم . آن هم Intent ها هست . و از استفاده های دیگر که می توانیم ما با این دستور انجام بدهیم. ضمن این که ما در این دستور از this استفاده می کنیم . و همچنین توجه داشته باشید که مانند دستور also خود شی را برای ما برمی گرداند و همچنین شما می توانید در داخل دستور های Scope functions یا توابع دامنه دستور های دیگر رو هم استفاده کنیم .
1 2 3 4 5 6 7 8 |
UserData("","",25).apply { user_name="AliReza" user_LastName="Habibi" UserData().let { it.user_age } } |
کد پایین هم از استفاده های apply در Intent هست . که دیگر نیاز نیست ما از inten در put کردن استفاده بکنیم . می توانیم یک قلمره ایجاد کنیم و کارهای خود را در آن انجام دهیم .
1 2 3 4 5 |
val intent = Intent(applicationContext, MainActivity2::class.java).apply { putExtra("name", "ali") } startActivity(intent) |
دستور run در اسکوپ فانکشن (Scope functions) یا توابع دامنه
ببین این دستور هایی که من خدمت شما عزیزان آموزش می دهم . تفاوت های اندکی باهم دارند . که آنها هم با کمی دقت متوجه می شوید. run نکته مابین دستور let , و apply یعنی دستور run مانند دستور apply نیازی به it ندارد و همچنین مانند دستور let اخرین مقدار را برای ما بر می گرداند .یعنی اینکه ما دیگر مستقیم به خود داده دسترسی داریم . کد های زیر را مشاهده کنید تا بهتر حرف های من را درک کنید .
1 2 3 4 5 |
Data(25).run { val item=test() Text1.text=name Text2.text=lastname } |
همانطور که در کد بالا میبینید ما دیگه از اشاره گر it استفاده نکردیم و مستقیما به مقادیر دسترسی داریم. برای مشاهده نتیجه کد بالا را جایگزین کد های مربوط به let در MainActivity کنید .
دستور with در اسکوپ فانکشن یا توابع دامنه
1 2 3 4 |
with(Data(24)){ name="farshid" lastname="habibi" } |
ما در کد بالا هم this رو داریم یعنی به کل داده های کلاسData دسترسی داریم . یه جور آسون تر برای شما بگم اینجوری بفهمید که مثل اینکه دارید داخل کلاس UserData کدنویسی می کنید .
مثال هایی که برای شما از این دستورات زدم. خیلی شبیه به هم هستند و اندکی با هم تفاوت دارند و همه ی این ها یک کار خاص را انجام می دهند.
جمع بندی مطالب اسکوپ فانکشن Scope functions
ما در این آموزش فهمیدیم که Scope functions در زبان برنامه نویسی کاتلین چی هستن و به ما کمک می کنن که یک کدنویسی تمیز داشته باشیم . و همچنین بتونیم تو پروژه های بزرگ یک کار تیمی انجام دهیم و نکته مهم تر این که کد های ما را مختصر تر می کند . بعد برای شما 5 تا حالت توابع دامنه را توضیح دادیم و برای هر کدام مثال هایی را آوردیم .

حالت های مختلف Scope Function در کاتلین
ولی بزارید گفته های خودم را به صورت خلاصه برای شما بیان کنم دستور let از اشاره گر it استفاده می کند . یعنی انگار ما یک شی از کلاس خود ساخته ایم و به تمام متد های داخل آن کلاس توسط it دسترسی داریم . و اینکه ما به کمک دستور let میتونیم اخرین دستور ویا همان اخرین مقدار را برگردانیم . اما دستور also که شباهت زیادی با دستور let دارد چون آن نیز دارای کلمه it هست . تفاوت آن فقط و فقط این است که let آخرین دستور را برای ما بر می گرداند ولی also آخرین شی را بر می گرداند.
دستور بعدی apply هست ما در این دستور کلمه this را داریم ومقدار برگشتی برای ما خود شی می باشد . دستور بعدی run هست و این دستور نقطه وسط let , apply هست . چون مانند دستور apply دارای کلمه this است و از یه طرف هم مقدار برای ما بر می گردونه و از این راه هم شبیه let هست . دستور آخر هم with هست که دارای کلمه this می باشد . امیدوارم آموزش اسکوپ فانکشن از ادامه آموزش کاتلین برای شما عزیزان مفید باشد .
موفق باشید.
دیدگاهتان را بنویسید