فصل6_ بخش چهاردهم:(Extension functionها و infix function ها و  operator over loading)

Extensionفانکشن ها منشا infix فانکشن ها است و infix فانکشن ها منشا operator over loading ها می باشد .

Extension فانکشن ها برای اضافه کردن ویژگی هایی به کلاس مان بدون ارث بری و استفاده از دیزاین پترن ها مثل دیزاین پترنDecorator (به بهترین حل مسیله در شرایط بهینه و پایدار دیزاین پترن می گویند ).

طرز نوشتن Extension فانکشن ها:

کلمه کلیدی ' fun '+فاصله+نام کلاسی که می خواهیم گسترش دهیم+نقطه+نام تابع مان

طرز نوشتن بقیه تابع Extentionمان مانند تابع معمولی است .

نکته برای صدا زدن Extenstion فانکشن مربوطه در فایل main.kt می بایست ابتدا کلاس مان را صدا بزنیم یا ابتدا از آن Object بسازیم سپس با نوشتن نام object و بلا فاصله گذاشتن یک نقطه و بلافاصله آوردن نام تابع انتخابی برایExtension فانکشن مان تابع مان صدا زده می شود .

طرز نوشتن infix فانکشن ها :

مانند نوشتن Extension فانکشن ها هست با این تفاوت که قبل از نوشتن کلمه کلیدی ' fun ' عبارت ' infix ' می آوریم جالب است بدانید با اوردن این عبارت

تنها می توانید یک پارامتر ورودی در امضای تابع تان بنویسید .

طرز نوشتن operator over loading :

مانند نوشتن infix فانکشن ها هست منتها بین دو عبارت ' fun ' و ' infix 'کلمه کلیدی ' operator ' را می آوریم . همچنین به جای نام دلخواه کلاسمان از عبارت های ' plus 'معادل '+' و 'minus' معادل '-' و ' div' معادل ' / ' و 'times' معادل ' * '

و پس از این کار ها به راحتی اعمال جمع و ضرب و تقسیم و ضرب را به راحتی روی خود object های کلاس مان به طور مستقیم انجام می دهیم(فقط روی یکی از آرگومان های object که از کلاس مان ساخته ایم اجرا خواهد شد )

به شکل های زیر بادقت توجه کنید:

>
شکل1:class.kt

>
شکل2:فایل معمولی file.kt

>
شکل3:فایل اصلی file.kt

>
شکل4: کنسول Intelij Idea

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

فصل6_ بخش سیزدهم :جلسه جبرانی setter و getter

مبحث setter و getter در 5 مفهوم خلاصه می شود که عبارتند از :

_ field

_value

_setter

_getter

_lateinit

field:همان مقدار اولیه متغییرمان = فیلد می باشد که به صورت variable مقدار دهی اولیه (init)می شود .

value:برابر است با آنچه پس از تغییر مقدار اولیه (field)بدست می آید . به طور مثال هنگامی که فیلد مان با عددی جمع ,منها,ضرب یا تقسیم میشود عدد حاصل این اعمال ریاضی را value می گوییم .

نکته :انچه که باعث تغییرات در مقدار اولیه می شود و value را حاصل می کند در فایل main.kt استقرار دارد . نه در class مان و جایگاه field و value در class.kt می باشد .

setter: شرط هایی را برقرار می کند که هنگامی که متغییر اولیه (field)((در فایل main.kt تغییر می کند)) انجام می شود .

getter:شرط هایی برقرار می کند که هنگامی که متغییر اولیه (field) نمایش داده می شود در کنسول هنگام نمایش اجرا می شود .

نکته:هر دو حالت setter , getter به هنگام اجرا شدن در زمانی که در فایل main.kt به وسیله نوشتن کد مربوطه دوباره اجرا می شوند, به هنگام اجرا مقدار جدید جایگزین مقدار قدیمی شده و در نهایت مقدار جدید تر جایگزین (value)خواهد شد . و این عمل ادامه دارد و همیشه این مداومت هست تا جایی که از نوشتن کد مربوطه که بخشی از آن تکرار می شود (به خاطر صدا زدن تک فیلد بالای setter ,getter ) (با printlnکردن همان تک فیلد با صدا زدن اسم class مربوطه یا تغییر دادن مقدار متغییر در فایل main.kt ) خودداری کنیم .

نکته:در setter چون بایستی مقدار قدیمی را به مقدار جدید تنظیم کنیم بایستی به دو مورد value و field دسترسی داشته باشیم .

نکته:در getter تنها به مقدار قدیمی دسترسی داریم ولی می توانیم با شرط نقض گذاشتن و بدون استفاده از کلمه کلیدی value برای آن هم مقدار بازگشتی داشته باشیم .

نکته :به مقدارشرط های settter بلافاصله بعد از صدا زدن فیلد و تغییر ایجاد کردن دسترسی پیدا خواهیم کرد (با دیباگ کردن متوجه این موضوع بهتر خواهید شد )ولی به مقدار getter در زمانی دسترسی داریم که از فیلدی که ساخته ایم در کلاس مان در فایل main.kt پرینت ال_ان یا پرینت بگیریم همجنین

می توانیم در خود setterمان ()println داشته باشیم که محتوای field مربوطه باشد تا getter به راحتی اجرا شود .

نکته:getter و setter می توانند به تنهایی یا باهم بیایند و اجباری هم در تقدم ندارند .

تمرین:یک setter بنویسید و یک فانکشن کمکی درون یک فایل از فانکشن کمکی تومان را به ریال تبدیل کنید در setter تان از آن استفاده کنید. تا کیف پولتان را مدیریت کنید و آخرین مبلغ باقی مانده برایتان به دلار چاپ شود .

شکل های زیر جواب این تمرین می باشد :

>
شکل1:class.kt

>
شکل2:فایل معمولی file.kt

>
شکل3:file.kt

>
شکل4: کنسول Intelij Idea

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

فصل6_ بخش دوازدهم:(data class ها )و دید کلی به Singleton

Data Class ها در واقع هر جا بیشتر با primary construcror injection سر و کار داریم و متد کمی داریم برای صرفه جویی در RAM مورد استفاده سیستم (در اینجا منظور تلفن همراه هوشمند است )به جای استفاده از کلاس معمولی ازدیتا کلاس استفاده می کنیم .

نکته دیتا کلاس می تواند به صورت insted زیر مجموعه کلاسی مثل interface ها و abstract class ها یا کلاس های معمولی قرار بگیرند و بدین طریق ارث بری را به صورت غیر مستقیم انجام دهند .

ولی یک دیتا کلاس به هیچ عنوان نمی تواند abstract , open , inner یا sealed باشد (Sealed را بعدا توضیح خواهیم داد .)

نکته یک کلاس که کمه کلیدی' data ' اولش آورده می شود حتما باید یک primary constructor داشته باشد و در آن باید حتما یکی یا بیشتر موجود باشد .

(هر تعداد مورد نیاز )constructor injection تعریف کرده باشیم که حتما ابتدای همه اش از کلمه کلیدی ' var ' یا ' val ' استفاده شده باشد .

نکته:نوشتن بدنه برای data class ضروری نیست ولی می توان از یک تا هر چند تا بخواهیم متد تعریف کنیم ولی بهتر است بدنه طولانی نشود در غیر اینصورت کلمه کلیدی ' data ' را از اول کلاسمان بایستی بر داریم .

به شکل های زیر خوب دقت کنید:

>
شکل1:interface.kt

>
شکل2:interface.kt

>
شکل3:interface.kt

>
شکل4:data class.kt

>
شکل5:file.kt

>
شکل6: کنسول Intelij Idea

دید کلی به دیزاین پترن سینگلتون :design Pattern (Singleton)

به بهترین روش حل مسیله خاص best parctice می گویند .حالا اگر best practice به یک حالت پایدار برسد به آن دیزاین پترن می گویند . سینگلتون یک نوع از انواع دیزاین پترن به حساب می آید .

هنگامی از این الگو استفاده می کنیم که به طور مثال می خواهیم با فایل ها کارکنیم یا به طور کلی یک منبع را به عنوان پاسخگو می خواهیم داشته باشیم .

شکل نوشتن این نوع دیزاین پترن به صورت زیر است :

ابتدا primary constructorموجودمان را private (خصوصی [دسترسی فقط از همان class.kt])می کنیم سپس در companion object مان یک شی از آن کلاس می سازیم سپس هر گاه خواستیم به متد ها و field injection ها دسترسی داشته باشیم می بایست ابتدا بدون ساخت شی از کلاسمان و با صدا زدن نام شی که در companion object ساختیم فقط می توانیم به متد ها وfield injection ها دسترسی داشته باشیم .

به شکل های زیر خوب دقت کنید:

>
شکل1:class.kt

>
شکل2:file.kt

>
شکل3: کنسول Intelij Idea

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

فصل6_ بخش یازدهم:کلاس های مربوط به متغیر های کیفی(Enum  Class ها)

متغییر های کیفی همان متغییر های اسمی و ترتیبی هستند برای اطلاعات بیشتر در google لطفا سرچ کنید .

Enumکلاس ها گروهی از کلاس ها هستند که متغییر های کیفی را در آن ها با لیست کردن آن ها با استفاده از نام انگلیسی آن ها و بدون استفاده از

دابل کوتیشن بین دو سر عبارت مانند عبارت مقابل که بین دو کوتیشن قرار گرفته : ' " X " ' که برای نمایش عبارات String از آن ها استفاده می کردیم

ولی حالا به صورت مستقل و فقط بین عبارات علامت کاما ' , ' را به کار می بریم .

و بعد از تمام شدن متغییر های کیفی مان بدنه کلاس را می بندیم .

در اینجا کارمان با خود enum class.kt تمام شد به طور کلی و برای تکمیل کار نیاز به یک کلاس کمکی داریم تا به راحتی کار را تمام کنیم .

در اینجا نام enum classs را Yesterday می گذاریم .

یک متد در کلاس کمکی درون compaion object آن می سازیم.

در امضای تابع یک پارامتر ورودی از جنس نام enum class.kt که قبلا ایجاد کردیم را می سازیم .

و سپس شروع به نوشتن بدنه تابع می کنیم .

قبل از همه چیز برای رعایت اصول D.R.Y یک *.import Yesterda در قسمت بالا قبل از شروع کد نوشتن class Helper می آوریم .

سپس در تکمیل کردن بدنه تابع یک ()when را می نویسم که درون ان نام پارامتری که در امضای تابع به کاربردیم را می آوریم و سپس در بدنه when یکی یکی می بایست تمامی متغییر های کیفی را که در کلاس yesterday نوشتیم را بیاوریم , وگرنه با خطا کامپایلر تایم مواجه می شوید .

برای به صورت خودکار پرکردن بدنه when کافی است در لامپ زرد Intelij Idea خود هنگامی که نشانگر موس در نزدیکی

when است به دنبال عبارت Add remaining branches باشید تا با انتخاب آن فقط کافی است کد های زرد شده را پاک کنید و کد دلخواه خود را اضافه کنید .

و برای صدا زدن انچه برای هریک از متغییر های کیفی نوشته اید به عنوان کد در فایل main.kt کافی است عبارت مقابل را بنوسید.

Helper.fun'sName (Yesterday:One of the qualitative variables ) بدین تر تیب هرانچه به عنوان Unite درون کد ها ی مربوطه نوشته بودید اجرا خواهد شد

وئ اگر بخواهید return ها در جایی ذخیره باشد کل عبارت بالا را می بایست مساوی با یک متغییر قرار دهید .

با توجه به مطالب بالا سه تکلیف برای شما دارم که می باست در سه قسمت مستقل از پروژه هایی که از Intelij Idea می نویسید پیاده سازی کنید :

تکلیف1 مشابه قسمت1شکل ها :

مراحل رشد و نمو انسان از دوران جنینی تا ناتوانی در پیری را در یک enum class بنویسید , سپس برای هرکدام از مراحل با استفاده از ()println و متد ()when دار در کلاس دیگری توضیحات هر مرحله را بنویسید .سپس به دلخواه چند object بسازید .

تکلیف 2 مشابه قسمت 2 شکل ها :

مشابه آنچه گفته شد در تکلیف 1 برای انواع کاموای بافتنی این کار را انجام دهید .

تکلیف 3 مشابه قسمت 3 شکل ها :

مشابه آنچه گفته شد در تکلیف 1 برای انواع گیاهان آپارتمانی(( البته اگر سر رشته ای ندارید با سرچ در گو گل اطلاعات لازم را بدست آورید .))

قسمت 1 شکل ها :

>
شکل1:enum class.kt

>
شکل2:class.kt

>
شکل3:file.kt

>
شکل4: کنسول Intelij Idea

قسمت2 شکل ها:

>
شکل1:enum class.kt

>
شکل2:class.kt

>
شکل3:file.kt

>
شکل4: کنسول Intelij Idea

قسمت 3 شکل ها:

>
شکل1:enum class.kt

>
شکل2:class.kt

>
شکل3:file.kt

>
شکل4: کنسول Intelij Idea

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

فصل6_ بخش دهم:شی همراه (Companion Object)

باید توجه داشته باشید در هر کلاس یک شی همراه بیشتر نمی توان داشت .

شی همراه بیشترین کاربرد آن در استفاده از field injection است بنابراین بهتر است فانکشن های خود را در یک فایل جداگانه بنویسیم و سپس به تعداد فانکشن ها variable یا همان field تعریف کنیم و مساوی با هریک از فانکشن ها قرار دهیم .

بدین صورت پارامتر ورودی را در همان جا (در شی همراه موجود در کلاس مربوطه )تعریف می کنیم و هنگام صدا زدن شی همراه درفایل main.kt از کلاس object نمی سازیم و مستقیما خود شی همراه و سپس آن field را صدا می زنیم .

در این روش بدون اینکه از سطوح دسترسی استفاده کرده باشیم (همان اصول Encapsulation) فایل اصلی مان (main .kt) هیچ دخالتی در مقدار دهی به فانکشن ها ندارد .

در صورتی که بخواهیم در فایلmain.kt برای فانکشن ها مقداردهی انجام دهیم می بایست اصل فانکشن یا خلاصه شده آن را در شی همراه بیاوریم .

نکته :می توان برای شی همراه نام گذاری انجام دهیم و این حالت در استفاده از کلاس های تو در تو و داخلی کاربرد دارد .

لطفا به شکل های زیر برای درک بیشتر آنچه توضیح داده شد توجه کنید :

>
شکل1:file.kt

>
شکل2:class.kt

>
شکل3:فایل main.kt

>
شکل4: کنسول Intelij Idea

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

فصل 6 _بخش نهم :جنریک (Generic:<>)

جنریک یا همان چیزی که بین دو علامت بزرگتر و کوچکتر قرار می گیرد که معمولا برای کلاس ها و لیست ها و مجموعه ها از علامت اختصاری T استفاده

می شود که مخفف لغت انگلیسی (Template)می باشد به معنای قالب می باشد .و برای مپ ها و برخی کلاس ها از دو کلمه (K,V)استفاده می شود که به ترتیب به فارسی یعنی کلید و مقدار .(Key,Value).

و کاربرد آن این است که وقتی از آن در کلاس بعد از نام گذاری نام کلاس استفاده می شود قادر خواهید بود به هنگام ساخت Object از آن کلاس بعد از آوردن نام کلاس مورد نظر و قبل از گذاشتن پرانتز باز و بسته این علامت را گذاشته ' <>' و بین دو علامت نوع داده ای که می خواهید استفاده کنید را قرار دهید .

جالب است که می توانید از کلاس هایی که خودتان ساخته اید نیز به عنوان نوع داده استفاده کنید به عنوان مثال کلاسی به عنوان Car ساخته اید و می توانید بین این دو علامت به این صورت بنویسید : '<()Car>'.

همچنین می توانید با آوردن کلمه where بعد از '' و دو باره آوردن آوردن عبارت مقابل ' : T ' نوعی که T به عنوان قالب بر ای خود می گیرد را مثلا به انواع عددی (Number )محدود کنید .

به شکل های زیر با دقت نگاه کنید.

>
شکل1:class.kt

>
شکل2:class.kt

>
شکل3:file.kt

>
شکل4: کنسول Intelij Idea

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''