3 | سایت جدید کاتلین فارسی ، قدرت گرفته با Jekyll
4 |
5 |
6 |
7 | ## ویژگی ها
8 |
9 | - صفحه جدید **رادیو کاتلین**، مصاحبه هایی که با افراد موفق انجام میشود در این صفحه قرار میگیرد
10 | - دوره های **رایگان** آموزشی در سایت نیز قرار گرفت.
11 | - مقاله های خبری، آموزشی نیز در سایت قرار میگیرد و همچنین افراد مختلف که خواهان درج مقاله خود هستند نیز **میتوانند** مقاله ی خود را به نام خود به اشتراک بگذارند.
12 | - صفحه **کاتلین رو امتحان کن** نیز به افراد تازه وارد این امکان را میدهد که بدون نصب چیزی تنها در مرورگر بتوانند کاتلین را امتحان کنند.
13 |
14 |
15 |
16 | ## نحوه مشارکت
17 |
18 | برای مشارکت کافی است این مخزن را clone کرده و تغییرات خود را در آن وارد و سپس به صورت pull-request درخواست دهید.
19 |
20 |
21 |
22 | ## چگونه دوره خود را در کاتلین فارسی ایجاد کنم
23 |
24 | شما میتوانید دوره ی خود را درکاتلین فارسی قرار دهید و آن را چه به صورت رایگان و چه با پرداخت هزینه در اختیار دیگران قرار دهید. برای قرار دادن دوره خود کافی است یک **استاد** شوید. میتوانید به صورت مستقیم در توییتر و یا تلگرام و یا به صورت ایمیل درخواست خود را مطرح نمایید.
25 |
26 |
22 |
--------------------------------------------------------------------------------
/_plugins/markdown.rb:
--------------------------------------------------------------------------------
1 | module Jekyll
2 | class MarkdownBlock < Liquid::Block
3 | def initialize(tag_name, text, tokens)
4 | super
5 | end
6 | require "kramdown"
7 | def render(context)
8 | content = super
9 | "#{Kramdown::Document.new(content).to_html}"
10 | end
11 | end
12 | end
13 | Liquid::Template.register_tag('markdown', Jekyll::MarkdownBlock)
14 |
15 | # this function will force html tags to support Markdown, so out text is not inherit from normal htmls
16 | # and we can now use "rtl" tag
--------------------------------------------------------------------------------
/_posts/2017-4-18-use-kotlin-with-npm-webpack-and-react/2017-4-18-use-kotlin-with-npm-webpack-and-react.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: "استفاده از کاتلین به همراه npm، webpack و react"
4 | date: 2017-04-18 00:00:00
5 | categories: post
6 | editlink: https://github.com/KotlinFarsi/KotlinFarsi-WebSite/edit/master/_posts/2017-4-18-use-kotlin-with-npm-webpack-and-react/2017-4-18-use-kotlin-with-npm-webpack-and-react.md
7 | author: "سینا درویشی"
8 | profilepic: /assets/profile/sina_darvishi.jpg
9 | ---
10 |
11 |
12 |
13 | > *این صفحه صرفا ترجمه شده [این مقاله](https://blog.jetbrains.com/kotlin/2017/04/use-kotlin-with-npm-webpack-and-react/) میباشد*
14 |
15 |
16 |
17 | همینطور که میدونید در نسخه 1.1 کاتلین، قابلیت نوشتن کد کاتلین و کامپایل به جاوا اسکریپت ممکن شد. البته که داشتن پشتیبانی کامپایلر به تنهایی نمیتونه مشکلاتی که در واقعیت بهش میخوریم رو برطرف کنه، بنابراین درنظر این شدیم که کاتلین رو به داخل اکوسیستم های بزرگتری وارد کنیم.
18 |
19 | امروز مفتخریم که دو پروژه جدید رو برای شما پرزنت کنیم: یک پلاگین Gradle که کاتلین رو همراه npm و webpack و Karma کرده و یک برنامه نمونه full-stack که در بک اند از Kotlin/JVM استفاده میکنه و از Kotlin/JS برای React در فرانت اند استفاده میکنه.
20 |
21 |
22 |
23 | **پلاگین فرانت اند کاتلین:**
24 |
25 | [پلاگین فرانت اند کاتلین](https://github.com/Kotlin/kotlin-frontend-plugin) این امکان رو میده که بتونیم یک برنامه فرانت اند کاتلین رو به کمک webpack بسازیم و دیپلوی کنیم همچنین میتونیم پکیج های npm رو به صورت وابستگی یک برنامه اجرا کنیم و سپس پلاگین مسئولیت دانلود و به همراه کردن اونها برای ساختن فایل JS دلخواه به عهده میگیره. همچنین برای بهبود کاربری این پلاگین کامپایل های پشت سر هم و hot-reload رو نیز انجام میده که بتونیم همواره اخرین ورژن از برنامه رو در مرورگر خودمون ببینیم.
26 |
27 | فایل [README](https://github.com/Kotlin/kotlin-frontend-plugin/blob/master/README.md) به شما نحوه استفاده از این پلاگین رو نشون میده و همچنین فولدر سمپیل شامل [نمونه های ساده](https://github.com/Kotlin/kotlin-frontend-plugin/tree/master/examples/frontend-only) است که به شما نحوه اجرا برروی برنامه های واقعی رو نشون میده.
28 |
29 |
30 |
31 | **مثال Kotlin-React :**
32 |
33 | [Thinkter](https://github.com/Kotlin/kotlin-fullstack-sample) یک نمونه برنامه full-stack هه که به صورت کامل با Kotlin پیاده سازی شده. بک اند تحت Jetty اجرا میشه و از [Ktor](https://github.com/kotlin/ktor) استفاده میکنه که یک فریمورک وب کاتلینه که توسط تیم کاتلین توسعه داده شده. فرانت اند از React استفاده میکنه. شما میتونید از این Wrapper ها استفاده کنید و یا به دلخواه خودتون تغییرشون بدین.
34 |
35 | برای این که ببنید کد React-Kotlin چگونه کار میکنه، میتونید [یک کامپوننت](https://github.com/Kotlin/kotlin-fullstack-sample/blob/master/frontend/src/org/jetbrains/demo/thinkter/NewThoughtComponent.kt) برنامه رو ببینید.
36 |
37 | برای آشنا شدن با نحوه عملکرد Kotlin/JS میتونید [دوره مرورگر کاتلین فارسی](https://kotlinfarsi.com/courses/) رو مشاهده کنید.
38 |
39 |
12 |
13 | > *این صفحه صرفا ترجمه شده [این مقاله](https://blog.jetbrains.com/kotlin/2017/04/kotlin-1-1-event-report/) میباشد*
14 |
15 | انتشار نسخه 1.1 کاتلین به گرمی توسط جامعه کاتلین پذیرفته شد. برای شرح دادن ویژگی های جدید در کاتلین 1.1 ، Jetbrains پیشنهاد برگزاری یک مراسم آنلاین رو داد. افراد مشتاق قادر بودن که استریم پرزنت آندری(Andrey Breslav) رو به صورت زنده ببینند و سوال هاشون در جلسه Q&A پاسخ داده میشد.
16 |
17 | تمام انجمن ها تشویق شدن که یک دورهمی برگزار کنند. بیش از 30 گروه در 21 کشور جهان میزبان مراسم های دورهمی کاتلین شدند.
18 |
19 | شما میتونید لیست تمام اونت ها رو در [صفحه جامعه کاتلین](http://kotlinlang.org/community/talks.html?time=kotlin) ببینین. بیش از 3000 نفر پخش زنده رو مشاهده کردند.
20 |
21 | ویدیو پرزنت آندری و Q&A در سایت آپارات قابل مشاهده است.
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 | **فیدبک مراسم کاتلین 1.1 :**
31 |
32 | در این مراسم از بیننده گان درخواست شد که نظرات خودشون رو در مورد کاتلین
33 |
34 | بیان کنند. شما نیز میتونید فیدبک خودتون رو [در این فرم پر کنید](https://docs.google.com/forms/d/e/1FAIpQLSdgKsJzwc1ToAusi-xpEiiE1O4t3HA5xjlbZXDU5Mg0i3qvNg/viewform). نظرات شما باعث بهبود ویژگی های کاتلین میشه.
35 |
36 |
12 |
13 | > *این صفحه صرفا ترجمه شده [این مقاله](https://blog.jetbrains.com/kotlin/2017/05/kotlinnative-v0-2-is-out/) میباشد*
14 |
15 |
16 | > *یادآور شویم که در حال حاضر کاتلین نیتیو ورژن بالاتری را دارا است*
17 |
18 |
19 |
20 | ما خیلی خوشحالیم که اعلام کنیم کاتلین/نیتیو 0.2 منتشر شده است که به همراه یک ویژگی و فیکس شدن باگ های [بررسی تکنولوژی کاتلین نیتیو]() آمده است. در این آپدیت coroutines و توابع بین خطی cross-module ساپورت شده است و همچنین بسیاری از باگ ها اصلاح شده و بسیاری بهبود سازی صورت گرفته است.
21 |
22 | این انتشار شامل تعدادی مثال مفید است که به عنوان مثال نحوه استفاده از coroutine ها در concourent non-blocking I/O توضیح داده شده و یا سورس [یک برنامه با رابط کاربری ساخته شده با GTK](https://github.com/JetBrains/kotlin-native/tree/master/samples/gtk) مثال زده شده است و همچنین [یک کلاینت یادگیری ماشین TensorFlow](https://github.com/JetBrains/kotlin-native/tree/master/samples/tensorflow) نیز مثال زده شده است.
23 |
24 | به عنوان مثال، کد ساده ای مثل زیر:
25 |
26 |
51 |
52 | میتونه در پردازش چندین Socket I/O ی همزمان با استفاده از coroutine ها و خدمت دادن به همه کلاینت ها به صورت کاملا مستقل و همزمان استفاده بشه!
53 |
54 | و همچنین برای ساختن یک دکمه GTK به همراه یک event Listener، میشه اینجوری کد زد:
55 |
56 |
67 |
68 | بنابراین با استفاده از ورژن 0.2 میشه برنامه های ساده نوشته شده با کاتلین رو پیاده سازی کنید.
69 |
70 | هم زمان تایم کامپایل و هم عملکرد در زمان اجرا به شدت بهبود پیدا کرده است و همچنین سایز بازنشردهنده (redistributable) نیز کاهش پیدا کرده است.
71 |
72 | لیست تغییرات این انتشار رو میتونید در [changelog](https://github.com/JetBrains/kotlin-native/blob/v0.2.0/CHANGELOG.md) ببینید.
73 |
74 | همچنین فایل های باینری از قبل کامپایل شده برای [Linux](http://download.jetbrains.com/kotlin/native/kotlin-native-linux-0.2.tar.gz) و [MacOS](http://download.jetbrains.com/kotlin/native/kotlin-native-macos-0.2.tar.gz) نیز در دسترس است.
75 |
76 |
12 |
13 | یکی از سایت هایی محبوب در زمینه کاتلین، [هفته نامه کاتلین](http://kotlinweekly.net/) اهه. که بعد از عضویت به صورت هفتگی از آپدیت ها، ویژگی ها و تازه ها با خبر میشید. حالا ما هم در کاتلین فارسی انشالا اگه مشکلی پیش نیاد، شما رو از تازه های کاتلین باخبر میکنیم. همراهمون باشید.
14 |
15 |
16 |
17 | ## [ورژن 2 کتابخانه Koin](https://100androidquestionsandanswers.us12.list-manage.com/track/click?u=f39692e245b94f7fb693b6d82&id=ff78f51d61&e=9da6128bd8)
18 |
19 | ورژن دوم کتابخانه Koin به صورت پایدار و رسمی منتشر شد. بعد از شش ماه توسعه، بازنویسی، نوسازی API و فیدبک های کاربران این نسخه منتشر شد. مقاله ای که در مورد ویژگی ها و اخبار جدید صحبت کرده رو بخونید.
20 |
21 |
22 |
23 | ## [دیباگ کامپایلر کاتلین/Native](https://100androidquestionsandanswers.us12.list-manage.com/track/click?u=f39692e245b94f7fb693b6d82&id=efedb0a79c&e=9da6128bd8)
24 |
25 | برای اضافه کردن generic ها به هدر خروجی کاتلین/نیتیو، Kevin Galligan مجبور شده کاتلین/نیتیو رو با استفاده از یک debugger مهندسی معکوس کنه.
26 |
27 |
28 |
29 | ## [ازبین بردن Coroutine leaks در تست ها](https://100androidquestionsandanswers.us12.list-manage.com/track/click?u=f39692e245b94f7fb693b6d82&id=559a91c961&e=9da6128bd8)
30 |
31 | مبحث Coroutine ها خیلی توی بورس افتاده و اگر شما درحال نوشتن coroutine ای هستید، شاید بخواین براش تست ای هم بنویسید. نوشتن تست برای coroutine ها میتونه سخت باشه، نه تنها به خاطر concurrency بلکه ممکنه leak هایی رو در یک تست به صورت منفرد به وجود اورده باشید.
32 |
33 |
34 |
35 | ## [Kotlin Destructuring Declarations and ComponentN](https://100androidquestionsandanswers.us12.list-manage.com/track/click?u=f39692e245b94f7fb693b6d82&id=94a9f11709&e=9da6128bd8)
36 |
37 | در این مقاله Rafael Monreno توضیح میده چطور میشه Declaration ها رو تجزیه کرد و نگاهی به دو جا میندازه که این سینتکس تجزیه میتونه مفید باشه.
38 |
39 |
40 |
41 | ## [چطور توسعه برنامه های اندروید، Kotlin-First شد؟](https://100androidquestionsandanswers.us12.list-manage.com/track/click?u=f39692e245b94f7fb693b6d82&id=3807442fbd&e=9da6128bd8)
42 |
43 | در کنفرانس سالانه توسعه دهندگان I/O ، گوگل بیان کرد که کاتلین زبانی با پشتیبانی اولیه برای توسعه اندروید شده. ولی چی شد که تصمیم به ترک Java گرفتن؟ و چی شد که اهمیت کاتلین از جاوا پیشی گرفت؟
44 |
45 |
12 |
13 | یکی از سایت هایی محبوب در زمینه کاتلین، [هفته نامه کاتلین](http://kotlinweekly.net/) اهه. که بعد از عضویت به صورت هفتگی از آپدیت ها، ویژگی ها و تازه ها با خبر میشید. حالا ما هم در کاتلین فارسی انشالا اگه مشکلی پیش نیاد، شما رو از تازه های کاتلین باخبر میکنیم. همراهمون باشید.
14 |
15 |
16 |
17 | ## [استفاده از کلیدواژه synchronized در Coroutines](https://jacquessmuts.github.io/post/coroutine_sync_mutex/)
18 |
19 | کار کردن با coroutines مقداری با تابع های locking معمولی فرق داره. برای این که یاد بگیرید چگونه coroutines را به صورت thread-safe استفاده کنید به مقاله بالا مراجعه کنید.
20 |
21 |
22 |
23 | ## [Kotlin Smart Casting By Immutability](https://brunoaybar.com/kotlin-smart-casting)
24 |
25 | زمانی که کاتلین مینویسید، در اکثر مواقع لازم نیست که type ها رو به صورت صریح بیان کنید زیرا که سیستم Type کاتلین به اندازه ای هوشمند است که خودش متوجه بشه. این مقاله در مورد این موضوع بیشتر توضیح میده.
26 |
27 |
28 |
29 | ## [Execution context of Kotlin Flows](https://medium.com/@elizarov/execution-context-of-kotlin-flows-b8c151c9309b)
30 |
31 | در خیلی از مواقع زمینه اجرای کد مهمه. به عنوان مثال در اپلیکیشن های دارای UI(مثل موبایل)، اون widget ها تنها زمانی میتونن لمس بشن در thread اصلی باشن. این میتونه باعث ایجاد مشکل بشه وقتی کدتون بزرگتر شد، مخصوصا زمانی که سعی کنید تولید کننده دیتا و مصرف کننده دیتا رو از هم جدا کنید. Flow ها در کاتلین طراحی شدن برای همین مشکل!
32 |
33 |
34 |
35 | ## [تحلیل و تجزیه کلاس های Sealed شده در کاتلین](https://arturdryomov.online/posts/abstracting-kotlin-sealed-classes/)
36 |
37 | یکی از نمود های کاتلین کلاس های sealed شده است که میتونیم بگیم در اکثر مواقع به درستی استفاده نمیشن.
38 |
39 | ## [Class delegation in Kotlin](https://hackernoon.com/kotlin-what-is-class-delegation-all-about-683eb543e391)
40 |
41 | کیوان در این مقاله در مورد مزایای الگوی Delegation صحبت میکنه و سپس به بررسیش در کاتلین میپردازه.
42 |
43 |
18 |
19 |
20 | پنج شنبه هفته گذشته اولین مراسم KotlinEverywhere به لطف بچه های [Logcat](https://irlogcat.ir/) برگزار شد. در ابتدا keynote این مراسم توسط سینا درویشی ارائه شد و از برنامه های کاتلین فارسی در طی سال جاری خبر داد.
21 |
22 |
23 |
34 |
35 | اولین ارائه توسط وحید مواجی درمورد برنامه نویسی Functional در کاتلین پرزنت شد. ارائه جالبی که در اون ویژگی های یک زبان Functional توضیح داده شد و سپس با ارائه مثال تفاوت های زبان کاتلین، هسکل و اسکالا در برنامه نویسی Functional شرح داده شد. برای اطلاعات بیشتر میتونید به مثال هاش در [رپوی گیتهابش](https://github.com/mavaji/ke2019) سربزنید (استار یادتون نره!)
36 |
37 |
38 |
39 | ## توسعه بک اند به کمک Ktor
40 |
41 |
42 |
43 |
44 |
45 | دومین ارائه توسط سینا رضایی درمورد توسعه بک اند بود. توی این ارئه جذاب، سینا ابتدا در مورد Ktor صحبت کرد، سپس Ktor رو با چند فریم ورک جاوایی و غیر جاوایی مقایسه کرد. سپس چند مثال از نحوه پیاده سازی و توانایی های Ktor زد. اسلاید های ارائه سینا رو میتونید از [اینجا](\assets\img\posts\2019-06-24-kotlin-everywhere-report\Ktor.odp) دانلود کنید.
46 |
47 |
48 |
49 | ## ساخت UI با استفاده از Kotlin DSL ها
50 |
51 |
52 |
53 |
54 |
55 | سومین ارائه توسط کیوان اثباتی درباره ساخت UI ها به روشی متفاوت در اندروید بود. روشی که چندی پیش توسط شرکت Jetbrains با ارائه کتابخانه Anko معرفی شد و روش نوین دیگری که Google با معرفی Jetpack Compose ارائه کرد. اسلاید های ارائه کیوان رو میتوید در [اینجا](https://docs.google.com/presentation/d/1oZGGD-UH_0C8THVjvjpQwU_xNlkLW0v_u3pT-Cz9LBs/edit?usp=sharing) ببینید.
56 |
57 |
58 |
59 | ## استفاده از Kotlin برای مرورگر
60 |
61 |
62 |
63 |
64 |
65 | آخرین ارائه توسط سینا درویشی درمورد نحوه استفاده از Kotlin/JS بود. در این ارائه سینا نحوه استفاده از Kotlin/JS برای سمت کلاینت رو توضیح داد و سپس فریمورک Kotlin-React رو معرفی کرد و با استفاده از اون و تنها آموزش های خود React سعی به پیاده سازی دو نمونه پروژه کرد. [بازی دوز](https://github.com/sinadarvi/tic-tac-toe) و [ترجمه گر فینگلیش به فارسی](https://github.com/sinadarvi/what-am-i-saying)
66 |
67 |
68 |
69 | ## حضور بچه های [#اینجوری](http://injouri.ir/)
70 |
71 | بچه های اینجوری هم لطف داشتن و با محیا کردن استیکرهای کاتلین، جمع کاتلینی ما رو، پر رنگ تر کردن.
72 |
73 |
74 |
75 |
76 |
77 | در انتها از تمامی دوستانی که در این مراسم حضور داشتن و همراه ما بودن کمال تشکر رو میکنیم، مخصوصا بچه های تیم logcat ای که بدون اونا این مراسم برگزار نمیشد. انشالا در مراسم بعدی KotlinEverywhere هم شاهد حضور گرمتون باشیم.
78 |
79 |
80 |
11 | # دوره های Android Jetpack
12 |
13 | با سلام خدمت دوستان اندرویدی عزیز. مجموعه دوره های Jetpack حاصل تلاش تعدادی از دوستان و همکاران کاتلین فارسی است که سعی کردن دوره هایی براساس سمپل های گوگل و شرکت های اساسی دنیای اندروید فراهم کنند تا برخلاف دیگر دوره ها، دوره هایی را دراختیار قرار دهند که براساس اصول و قوائد درست برنامه نویسی اندروید پیاده سازی شده باشند.
14 |
15 | به زودی جدول و حوزه های مورد پوشش این مجموعه در این قسمت قرار خواهند گرفت. تا اون موقع میتونید از اولین دوره تهیه شده ی ما لذت ببرید.
16 |
17 | روز خوبی داشته باشین.
18 |
19 | دوره Room
20 |
21 |
14 |
15 | کد های این قسمت رو میتونید در مرحله 5 [گیتهاب](https://github.com/KotlinFarsi/kf01-BasicSample/tree/Step.05-Solution-Adding-Comments-To-App) پیدا کنید.
16 |
17 |
--------------------------------------------------------------------------------
/_tutorials/android-jetpack/room/adding-search-feature-and-migration-and-final.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: tutorial
3 | title: "اضافه کردن ویژگی سرچ به برنامه و Migration و مرحله نهایی"
4 | category: android-jetpack/room
5 | unit:
6 | chapter: 9
7 | ---
8 |
9 |
26 | کد های این قسمت رو میتونید در مرحله 7 [گیتهاب](https://github.com/KotlinFarsi/kf01-BasicSample/tree/Step.07-Solution-Adding-Search-Feature-And-Final-Part) پیدا کنید.
27 |
28 |
29 |
30 | در انتها لازمه که از شرکت ویرانیکا واسه همکاری و کمک هایی که کردن تشکر کنم. 🙏
31 |
32 | روز خوبی داشته باشید.
33 |
34 | سینا درویشی
35 |
36 |
15 | رسیدیم به Entity ها. همینطور که از اسمشون مشخصه، Entity ها در واقع یک سری موجودیت اطراف ما هستن. از کتاب ها، صندلی ها، میز ها گرفته تا User ها و ... . به عنوان مثال همین User ها میتونن دو شناسه اصلی داشته باشن. `firstName` و `UserName` .
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 | در زبان کاتلین برای ذخیره اطلاعات از دیتا کلاس استفاده میکنیم.
24 |
25 |
26 |
27 |
28 |
29 | برای این که به Room بفهمونیم که این کلاسمون میخوایم Entity باشه، از `Entity@` استفاده میکنیم.
30 |
31 |
32 |
33 |
34 |
35 | برای این که به Room بگیم، شناسه `id` ما باید PrimaryKey باشه و از این به بعد یونیک در نظرش بگیر باید از `PrimaryKey@` استفاده کنیم.
36 |
37 |
38 |
39 | ## ساخت ProductEntity
40 |
41 |
42 |
43 |
44 |
45 | بعد از این که نگاهی به مدل Productامون داشتیم، میتونیم برای ساخت `ProductEntity` از کد زیر استفاده کنیم
46 |
47 |
15 |
16 |
17 | برای شروع کار لازمه که کد شروع رو از این [لینک](https://github.com/KotlinFarsi/kf01-BasicSample/archive/starter-code.zip) دریافت کنید. همینطور میتونید با استفاده از کد زیر به شاخه `starter-code` برین و اونو چک اوت کنین.
18 |
19 |
28 |
29 | قبل از این که شروع به خواند کد بکنین، بد نیست نگاهی به اپلیکیشن نهایی بنذازین.
30 |
31 | (عکس)
32 |
33 |
34 |
35 | ## اضافه کردن وابستگی Gradle
36 |
37 |
38 |
39 |
40 |
41 |
42 | بعد از این ها، اولین اقدام برای شروع به کار با Room، اضافه کردن دپندنسی زیر به فایل `build.gradle` موجود در فولدر app اه:
43 |
44 |
10 | با سلام خدمت دوستان عزیز با یک دوره دیگه در خدمتتونیم از سری دوره های Android Jetpack که همینطور که قبلا گفته شده، پشت سر هم و به یک ترتیب نیستن ولی همشون یک هدف رو دنبال میکنن. توی این دوره هم قصد داریم کتابخونه Room رو بهتون معرفی کنیم.
11 |
12 | این آموزش ویدیویی است و برروی **Youtube** آپلود شده است، برای استفاده بهتر از تغییر دهنده ای پی استفاده کنید!
13 |
14 |
15 |
16 |
17 |
18 | شاید شده باشه که دلتون بخواد توی برنامه تون بعد از این که کاربر برنامه رو بست یک سری اطلاعات رو ذخیره کرده باشین یا یک پلی لیست از موزیک های کاربر داشته باشین و دلتون بخواد اپتون توانایی این رو داشته باشه که اون پلی لیست رو به مرور زمان آپدیت کنه و بعد از بستن اپلیکیشن این اطلاعات از بین نرن. برنامه نویسان اندروید در گذشته از دیتابیسی استفاده میکردن تحت عنوان SQLite که خب یکم کارکردن باهاش سخت و دشوار بود تا این که برنامه نویسان گوگل کتابخونه ای رو درست کردن تحت عنوان Room که بهتون این امکان رو میداد که بتونین به راحتی با اون دیتابیس ارتباط برقرار کنید.
19 |
20 |
21 |
22 |
23 |
24 | ## توی این دوره چی یاد میگیریم؟
25 |
26 | توی این دوره علاوه بر این که با Room آشنا میشیم، یاد میگیریم که Entity ها چی هستن، فایل های Data Access Object چه کاری برامون میکنن، نحوه کار و ساخت Database و Repository رو یاد میگیریم، با Forgin Relationship آشنا میشیم، با TypeConverter ها کار میکنیم و در انتها یک نگاهی به Full Text Search و Migration میندازیم.
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 | ## قبل شروع دوره چی باید بدونیم؟
35 |
36 | توی این دوره از زبان **کاتلین** و فریم ورک **اندروید** استفاده میکنیم پس باید به این دو مسلط باشیم. همچنین از معماری **MVVM** استفاده میکنیم، پس برای فهم بهتر روی کد ها باید آشنایی با **LiveData** و **ViewModel** داشته باشیم. همچنین برای طراحی صفحات از **Databinding** استفاده میکنیم پس بهتره برای فهم بهتر این مفاهیم به دوره های قبلی ما مراجعه داشته باشید( در حال حاظر این دوره ها تولید نشده اند! )
37 |
38 | همچنین اگر با **دیتابیس** آشنایی ندارید بهتره یک نگاهی به این لینک بندازین. ( لینک)
39 |
40 |
14 |
15 | کد های این قسمت رو میتونید در مرحله 6 [گیتهاب](https://github.com/KotlinFarsi/kf01-BasicSample/tree/Step.06-Solution-Modifying-Product-View) پیدا کنید.
16 |
17 |
17 |
18 | ```kotlin
19 | class ProductListViewModel(application: Application) : AndroidViewModel(application) {
20 |
21 | private var mRepository: DataRepository
22 |
23 | private var mObservableProducts: MediatorLiveData>
24 |
25 | init {
26 | mObservableProducts = MediatorLiveData()
27 | // set by default null, until we get data from the database.
28 | mObservableProducts.value = null
29 | mRepository = (application as BasicApp).getRepository()
30 | val products = mRepository.getProducts()
31 | mObservableProducts.addSource(products , mObservableProducts::setValue)
32 | }
33 |
34 | fun getProducts(): LiveData> {
35 | return mObservableProducts
36 | }
37 |
38 | fun searchProducts(query: String){
39 | }
40 | }
41 | ```
42 |
43 | ```kotlin
44 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
45 | super.onViewCreated(view, savedInstanceState)
46 | viewModel = ViewModelProvider(this).get(ProductListViewModel::class.java)
47 | mBinding.lifecycleOwner = this
48 |
49 | subscribeUi(viewModel.getProducts())
50 | }
51 |
52 | private fun subscribeUi(liveData: LiveData>) {
53 | liveData.observe(viewLifecycleOwner, Observer { myProducts ->
54 | if (myProducts != null) {
55 | mBinding.isLoading = false
56 | mProductAdapter?.setProductList(myProducts)
57 | } else {
58 | mBinding.isLoading = true
59 | }
60 | mBinding.executePendingBindings()
61 | })
62 | }
63 | ```
64 |
--------------------------------------------------------------------------------
/_tutorials/android/anko-and-extension-functions.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: tutorial
3 | title: "Anko و توابع الحاقی"
4 | category: android
5 | unit: 7
6 | chapter: 0
7 | sub_headers:
8 | - Anko چیست؟
9 | - شروع به استفاده از Anko
10 | - توابع الحاقی
11 | ---
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 | ## Anko چیست؟
21 |
22 |
23 |
24 | Anko یک کتابخونه قدرتمند توسعه یافته توسط شرکت JetBrains هه. هدف اصلیش تولید صفحات UI با استفاده از Code به جای فایل xml هه .این یک ویژگی خیلی جالبه که بهتون پیشنهاد میکنم امتحانش کنید ولی من توی این پروژه ازش استفاده نمیکنم.برای من استفاده از xml راحت تره ولی شما میتونین این روش رو پیش بگیرین.
25 |
26 | اگرچه این تنها ویژگی نیست که ما از این کتابخونه بدست میاریم.Anko شامل تعداد زیادی از خصیصه ها و توابعه که میتونه کار رو براتون راحت¬تر کنه.شما مثال¬های زیادی توی این دوره خواهین دید و سریعا متوجه خواهید شد که چه مشکلاتی رو این کتابخونه حل میکنه.
27 |
28 |
29 |
30 | ## شروع به استفاده از Anko
31 |
32 |
33 |
34 | قبل از اینکه جلوتر بریم بهتره از Anko برای خلاصه سازی کدهامون استفاده کنیم. همینطور که خواهید دید، زمانی که از Anko استفاده میکنیم، اون همیشه یک import رو به همراه نام اون خصیصه یا تابع که ازش استفاده میکنیم رو به فایل اضافه میکنه. به این دلیل که Anko از توابع الحاقی استفاده میکنه تا بتونه ویژگیهای جدید رو به محیطتون اضافه کنه.
35 |
36 | داخل کلاس `MainActivity` ما میتونیم از تابع ساده¬تری برای پیداکردن `RecyclerView` استفاده کنیم:
37 |
38 |
39 |
40 | ```kotlin
41 | val forecastList: RecyclerView = find(R.id.forecast_list)
42 | ```
43 |
44 | بهتره که با این کتابخونه بیشتر آشنا شین چون که خیلی از توابع این کتابخونه میتونه کارهارو براتون راحت تر کنه.
45 |
46 |
47 |
48 |
49 |
50 | ## توابع الحاقی
51 |
52 |
53 |
54 | تابع الحاقی تابعیه که میتونه رفتار جدیدی رو به کلاس اضافه کنه، حتی زمانی که دسترسی به سورس کد اون کلاس نداشته باشیم. مزیت استفاده از این توابع توی کاتلین اینه که لازم نیست اون شی رو به عنوان یک آرگومان ورودی به تابع پاس بدیم.تابع الحاقی دقیقا طوری عمل میکنه انگار جزئی از کلاسه و ما حتی میتونیم خود اون کلاس رو با استفاده از `this` به تابعمون پاس بدیم!
55 |
56 | به عنوان مثال ما میتونیم یک `toast` درست کنیم که دیگه لازم نباشه `context` رو بهش پاس بدیم! و این میتونه توی `Activity` ها و `Service` ها مورد استفاده قراربگیره!
57 |
58 |
78 |
79 | البته که Anko یک تابع `Toast` به مانند همین تابع درست کرده.Anko توابع مختلفی برای هم `CharSequence` و هم `resource` درست کرده که از اونجا رشته رو بهش پاس بدین، همچنین توابعی برای `toast` های کوتاه و بلند هم درست کرده!
80 |
81 |
89 |
90 | توابع الحاقی حتی میتونن روی خصیصه ها هم انجام بشن!مثال بعدی که میبینین درواقع یک تابع الحاقی پیاده شده برروی یک خصیصه است که به مانند توابع الحاقی معمولیه. اینجا ما `getter` و `setter` دلخواه خودمون رو نوشتیم
91 |
92 |
101 |
102 | توابع الحاقی در واقع کلاس اصلی رو تغییر نمیدن بلکه تنها یک static import به جاییه که ازش استفاده میشه. توابع الحاقی میتونه در هر کلاسی تعریف بشه، این میتونه تمرین خوبی باشه اگه یک دسته از توابع الحاقی مرتبط رو توی یک فایل ذخیره کنیم.
103 |
104 |
15 |
16 |
17 |
18 | کلاس های دیتا یکی از قدرتمندترین کلاس های کاتلین هستن که از نوشتن کدهای اضافی و بیهوده جلوگیری میکنن.
19 |
20 | POJO : کلاس هایی که برای نگه داشتن وضعیت به کار میرن و معمولا فعالیت های ساده ای رو انجام میدن. معمولا تنها توابع `getter` و `setter` ای مهیا میکنن که اجازه دسترسی به `field` هاشون رو میده.
21 |
22 | تعریف کلاس های دیتا در کاتلین واقعا به سادگی کد زیره :
23 |
24 |
25 |
26 | ```kotlin
27 | data class Forecast(val date: Date, val temperature: Float, val details: String)
28 | ```
29 |
30 |
31 |
32 |
33 |
34 | ## توابع اضافی
35 |
36 |
37 |
38 | کلاس های دیتا یکسری توابع جالب در اختیارمون قرار میده و اینها همه جدا از دسترسی به خصیصه¬هاش هستن.
39 | * `equals()` : خصیصه¬های دو شی رو با هم مقایسه میکنه که ببینه برابر هستن یا نه.
40 | * `hashCode()` : hash-Code محاسبه شده از روی خصیصه هارو برمیگردونه.
41 | * `copy()` : میتونیم با استفاده از این یک شی رو به علاوه با خصیصه هاش کپی کنیم
42 | * تعدادی دیگه از توابع
43 |
44 |
45 |
46 | ## کپی کردن یک کلاس دیتا
47 |
48 |
49 |
50 | اگه ما از خاصیت مصون بودن استفاده کنیم نمیتونیم مقدارش رو عوض کنیم، مگر این که یک مقدار جدید بهش بدیم( منظور اینه که یک شی جدید ازش بسازین و بهش نسبت بدین) . توی کلاس های دیتا تابعی ظاهر شده به نام `copy()` که کارش کپی کردن از یک شی هه ولی یکی دیگه از خوبیاش اینه که شما هم میتونین از یک شی کپی بگیرین و هم مقدار جدید به جای خصیصه های دلخواهتون بذارین:
51 |
52 |
53 |
54 | ```kotlin
55 | val f1 = Forecast(Date(), 27.5f, "Shiny day")
56 | val f2 = f1.copy(temperature = 30f)
57 | ```
58 |
59 |
60 |
61 | الان ما با استفاده از این تابع دیتای شی اول رو کپی کردیم و تنها مقدار `temperature` رو عوض کردیم، بدون این که مقدار بقیه حالت ها و شی اول عوض شه !
62 |
63 |
64 |
65 | ## مپ کردن یک شی به متغیرها
66 |
67 |
68 |
69 | این روند به نام multi-declaration انجام میگیره و به معنی مپ کردن هر خصیصه داخل یک شی به یک متغیره. (اگر دقت کرده باشین، در هنگام استفاده از شی ها، توابعی به نام `ComponentX` وجود دارن که به صورت اتومات ساخته میشن و دلیل ساخته شدنشون هم همینه). به مثال زیر دقت کنین:
70 |
71 |
72 | ```kotlin
73 | val f1 = Forecast(Date(), 27.5f, "Shiny day")
74 | val (date, temperature, details) = f1
75 | ```
76 |
77 |
78 |
79 | این multi-declaration به کد های زیر کامپایل میشه:
80 |
81 |
82 |
83 | ```kotlin
84 | val date = f1.component1()
85 | val temperature = f1.component2()
86 | val details = f1.component3()
87 | ```
88 |
89 |
90 |
91 | ایده پشت این ویژگی خیلی قدرتمنده و میتونه توی خلاصه سازی کدمون توی شرایط مختلف کمک کنه. به عنوان مثال کلاس Map یکسری توابع الحاقی داره که پیاده سازی شده تا بتونن کلیدها و مقادیر اون هارو شناسایی کنن:
92 |
93 |
14 |
15 |
16 |
17 | خب حالا که فهمیدید چه کارهایی میشه با کاتلین انجام داد، من مطمئنم شما منتظر اینین که هرچه زودتر در عمل ازش استفاده کنین. نگران نباشید، بخش های ابتدایی این دوره بهتون کمک میکنه که چطور محیط توسعه اتون رو برای کاتلین تنظیم کنین تا بتونین هرچه زودتر شروع به کدزنی کنین.
18 |
19 |
20 |
21 |
22 |
23 | ## اندروید استودیو
24 |
25 |
26 |
27 | اولین چیزی که مسلما نیازدارین اینه که اندروید استودیو رو نصب کرده باشین. همینطور که میدونین اندروید استودیو یک محیط توسعه رسمی برای اندرویده که از سال 2013 به صورت پیشنمایشی و سال 2014 به صورت نهایی درمعرض استفاده قرارگرفت.
28 |
29 | اندروید استودیو به صورت پلاگین برروی IntelliJ IDEA پیاده سازی شد. IDEA یک محیط توسعه جاواست که توسط شرکت JetBrains ساخته شده.همین شرکت سازنده Kotlin هم هست و همینطور که میبینین همهی اینها با هم ارتبط دارن.
30 |
31 | قبول کردن اندروید استدیو به عنوان محیط توسعه نرمافزاری یکی از مهمترین قدم هایی بود که توسعه دهندگان اندروید برداشتن، اول به این دلیل که محیط باگ دار Eclipse رو ترک کردن و به سمت محیطی رفتن که مخصوص توسعهدهندگان جاوا طراحی شده بود.ما امروزه از خیلی از ویژگی های این محیط مثل هوشمندی، سرعت، تکمیل کد ، آنالیز کدش لذت و استفاده میبریم.
32 |
33 | و دلیل دوم به خاطر Gradle بود، چراکه به عنوان یک Build System رسمی برای اندروید شناخته شده بود که خیلی از امکانات جدید مربوط به version Building و deploy رو ممکن کرده بود. دوتا از امکانات جذاب Gradle یکی build systems و دیگری flavours هه که این امکان رو بهمون میده که به تعداد زیادی از یک بیس کد، اپ های مختلف توسعه بدیم.
34 |
35 | اگه هنوز از Eclipse استفاده میکنین، متاسفانه برای این که تا پایان این دوره همراهمون باشین نیازه که به Android Studio سویچ کنین.تیم توسعهدهنده کاتلین برای Eclipse هم پلاگینی درست کردن ولی خب مسلما همیشه نسبت به اندروید استودیه عقب خواهد بود و مطمئنن طولی نخواهد کشید که متوجه بشین چه چیزهایی رو دارین ازدست میدین به محض این که استفاده ازش رو شروع کنین.
36 |
37 | هدف این دوره استفاده از Android Studio و Gradle نیست ولی اگر از این ابزارها استفاده نکردین، نگران نباشین. من مطمئنم که شما میتونین در این بین چیزهایی رو یادبگیرین و همراه این دوره باشین.
38 |
39 |
40 |
41 |
42 |
43 | ## نصب پلاگین کاتلین
44 |
45 |
46 |
47 | از IntelliJ 15 پلاگین کاتلین به صورت نصب شده برروی IDEA ارائه میشه، این ممکنه که Android Studio شما هنوز این پلاگین رو نداشته باشه و لازم باشه که شما به قسمت Plugins در خود استودیو مراجعه کنین و این پلاگین رو نصب کنین.
48 |
49 | حالا محیط شما اماده شده تا بدون یک ذره تفاوت نسبت به جاوا ، این زبون رو بفهمه ، کامپایل و اجرا کنه.
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
--------------------------------------------------------------------------------
/_tutorials/android/making-the-forecast-list-clickable.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: tutorial
3 | title: "قابل کلیک سازی لیست پیشبینی"
4 | category: android
5 | unit:
6 | chapter:
7 | sub_headers:
8 | ---
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | آیتم های فعلی لیوت مون نیاز به مقداری کار داره تا برای اپ واقعی اماده بشه. اولین کار ساختن یک Xml مناسب با نیاز های ابتداییمونه. ما میخوایم یک آیکون، یک date و یک توضیحات به علاوه بالا و پایین بودن دما رو نشون بدیم. خب پس شروع میکنیم به ساختن لیوت `item_forecast.xml` :
17 |
18 |
11 |
12 |
13 |
14 | درواقع Annotation های کاتلین کاملا با Annotation های جاوا همسو هستن. در قسمت Advance میبینیم که چه طور Annotation های دلخواه خودمون رو درست کنیم ولی فعلا یادتون میدم که چجوری بتونین از Annotation های آماده ی جاوا استفاده کنید.
15 |
16 | برای یادگیری این مبحث لازمه که حداقل با Junit اشنا باشین و Junit رو به پروژتون اضافه کنین
17 |
18 |
31 |
32 | دقیقا به همون طریقی که Annotation هارو توی جاوا استفاده میکردیم اینجا هم با قراردادن @ میتونیم از اون ها استفاده کنیم.
33 |
34 | همینطور که کلاس هارو میتونیستم با استفاده از as با نام دیگه صدا بزنیم اینجاهم میتونیم همین کار رو انجام بدیم
35 |
36 |
49 |
50 | **خلاصه بخش 8:**
51 |
52 | 1- با SmartCasting اشنا شدیم
53 |
54 | 2- فهمیدم که چندگانه ها در کاتلین محدود هستند، بیشتر از 3گانه باید از کلاس های دیتا استفاده بشه
55 |
56 | 3- یادگرفتیم چگونه یک مقدار رو بشکنیم و این زمانیکه میخوایم از کلاس های دیتا یا چندگانه ها استفاده کنیم مفیده و معنی بهتری داره
57 |
58 | 4- نیازی به Exception های چک شده در کاتلین وجود ندارند.
59 |
60 | 5- Constant ها میتونند یا به صورت objectو یا به عنوان خصیصه های Top-Level استفاده بشن
61 |
62 | 6- Annotation ها در کاتلین قابل دسترسی اند و همچنین Annotation های جاوا رو میشه در کاتلین استفاده کرد
63 |
64 |
65 |
11 |
12 |
13 |
14 | خب حالا که با چند تا از ویژگی های Lambda آشنا شدین خوبه که سراغ بحث دیگه ای به نام Closure ها بریم:
15 |
16 |
17 |
18 | ```kotlin
19 | fun unaryOperation(x:Int,op: (Int) -> Int){
20 | op(x)
21 | }
22 | fun outsideFunction() {
23 | val number = 10
24 | unaryOperation(20) { it * number }
25 | }
26 | ```
27 |
28 |
29 |
30 | یک تابع نوشتیم که یک تابع High-Order داخلش استفاده شده. (همون unaryOperation که توی جلسه قبلی ساختیمش) و دیدین که این تابع High-Order به متغیر خارج عبارت لاندایی که تعریف کردیم دسترسی داره! و اگه با IntelliJ IDEA این کد رو بزنین متوجه میشین که با نگه داشتن موشواره بر روی number بهمون میگه که “variable captured in a closure” و درواقع این بهمون میفهمونه که ما به مقدار متغییری دسترسی داشتیم که خارج عبارت lambda تعریف شده و مشکلی هم نداره.
31 |
32 | بذارین یه حلقه for داشته باشیم
33 |
34 |
55 |
56 | که بیاد و در هر مرتبه اجرا مقدار number رو پرینت کنه. اگه توی main تابع outsideFunction رو صدا بزنیم متوجه میشیم که مقادیر تغییر میکنن و لازم به گفتنه که در بعضی زبانها اینجوری تعریف شدن که مقدار متغییرها ثابت بمونن ولی در کاتلین میتونن تغییر کنند.
57 |
58 |
11 |
12 |
13 |
14 | خب ما توی این دوره قراره که کلی کد کاتلین بزنیم، بنابراین بهتره که با یک سری قرارداد های اون آشنا بشیم. کاتلین تمرکز اصلیش روی Java بوده بنابراین ما همون قرارداد های جاوا رو دنبال میکنیم بنابراین اگر با قرارداد های جاوا آشنا نیستید بهتره که همین الان با هم یک مروری بکنیم. ما از LowerCamelCase ها برای نامگذاری استفاده می کنیم، این به این معنیه :
15 |
16 |
24 |
25 | تایپ ها(Types) رو با حروف درشت مینویسیم، متد ها و خاصیت هارو با lower camelcase مینویسیم ، نقطه ویزگول ها اختیاری هستند و تنها یک جا ازشون استفاده میشه( بعدا راجع بهش صحبت میکنیم) ، پکیج ها برعکس نوشته میشوند یعنی به جای introduction.kotlinfarsi.com مینویسیم com.kotlinfarsi.introduction
26 |
27 | شما میتونید چندین کلاس در یک فایل داشته باشید و همچنین پکیج ها نیاز ندارند که دقیقا هم نام فولدرها باشند هرچند که پیشنهاد میشود که اینگونه باشند.
28 |
29 | ## خلاصه این بخش:
30 |
31 | 1- کاتلین زبونیه که Java و هم JavaScript رو هم پوشش میده ( البته روی ورژنی از کاتلین داره کار میشه به نام Kotlin Native که اون دیگه اوج برنامه نویسیه و یک دوره مجزا نیاز داره تا بشه توضیح بدیم، این بخش درحال توسعه است)
32 |
33 | 2- کاتلین بایت کد هایی رو درست میکنه که با JVM قابل اجرا هستش.
34 |
35 | 3- کاملا با جاوا همزیسته، هم میتونید در جاوا از کلاس ها و توابع کاتلین استفاده کنید و هم برعکس داخل کاتلین از جاوا.
36 |
--------------------------------------------------------------------------------
/_tutorials/introduction/declaring-constants.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: tutorial
3 | title: "constant ها"
4 | category: introduction
5 | unit: 8
6 | chapter: 5
7 | ---
8 |
9 |
10 |
11 |
12 |
13 |
14 | مبحث بعدی که میخوام دربارش صحبت کنم Constant هاست. ما خیلی درمورد constant ها صحبت نکردیم تنها جایی که اشاره ای بهش شد زمانی بود که میخواستیم یک object بسازیم. خب حالا چجوری میتونیم Constant ها رو بسازیم، در واقع ما نحوه ساخت اون ها رو قبلا دیدیم
15 |
16 |
25 |
26 | یک object ساختیم و یک خصیصه بهش دادیم. همین. در واقع فرقی با ساختن یک object که قبلا دیدیم نداره. ما درواقع از همین به عنوان constant استفاده میکنیم.
27 |
28 | و من میتونم توی هرجایی ازش استفاده کنم
29 |
30 |
44 |
45 | و درواقع من هر موقع پکیجش رو اضافه کنم میتونم از این استفاده کنم.
46 |
47 | همچنین ما میتونیم Constant ها رو به عنوان Top-Level معرفی کنیم
48 |
49 |
65 |
66 | خب درواقع این سوال پیش میاد که آیا من باید Constant ها رو توی جاهای رندوم قرارشون بدم و هر موقع خواستم صداشون بزنم؟
67 |
68 | درواقع این به معماری برنامتون بستگی داره، به نظر من این خیلی بهتره که Constant ها رو توی یک Object دسته بندی کنین تا این که همه رو در هرجای برنامه استفاده کنیم.
69 |
70 | مثلا وقتی میخوایم تنظیمات یک Camera رو به صورت Constant نگه داری کنیم، یک object به عنوان CameraSettings درست کنیم و constant هارو توی اون نگه داریم.
71 |
72 |
11 |
12 |
13 |
14 | خب وارد بخش پایه ای کاتلین شدیم، اولین چیزی که میخوایم در موردش صحبت کنیم اینه که چگونه متغیر ایجاد کنیم. اول بیام یک فایل کاتلین به نام Variables توی پروژمون بسازیم.
15 |
16 |
17 |
18 |
19 |
20 | همینطور که میبینین به خاطر ساختر پکیجم اون بالا چه طور نوشته شده. بیاین `main` رو باز کنیم.
21 |
22 |
31 |
32 | همینطور که میبینید args در واقع نام متغیر و تایپ و اون هم از جنس Array هستش و این هم یک generic type هستش که بعدا در موردش صحبت میکنیم ولی مهمترین قسمتش سینتکس کد هستش، نام متغیر ، دونقطه و تایپ اون متغیر.
33 | حالا بیاین و یک متغیر داخل main بنویسیسم
34 |
35 |
36 |
37 | ```kotlin
38 | var streetNumber: Int
39 | ```
40 |
41 |
42 |
43 | اگه دقت کنید IntelliJ میاد و streetNumber رو خاکستری میکنه و اینم تنها به این دلیله که ازش استفاده نشده و فعلا چیز مهمی نیست. میتونم بیام و یک متغیر دیگه بنویسم:
44 |
45 |
52 |
53 | کاتلین در واقع اجازه میده که من متغیر رو همون اول که تعریف میکنم مقدار دهی بکنم، به عنوان مثال مقادار `High Street` رو به متغییر `streetName` دادم. یک چیز دیگه که لازمه بهش توجه کنید اینه که ما از کلیدواژه `var` استفاده کردیم، درواقع این کلیدواژه میگه که ایا این متغیر یک متغییر Immutable هست یا نه، به این معنی که میتونیم مقدار جدید بهش بدیم یا نه، درواقع یک کلید واژه دیگه هم هست به نام `val` که مثل `var` هست ولی با یک تفاوت، val یک متغییر رو Immutable میکنه و var یک متغییر رو mutable، به این معنی که میتونیم مقدار جدید به یک متغییر var بدیم ولی به val نه .
54 | مثلا مینویسیم
55 |
56 |
65 |
66 | میبینیم که در خطی که داریم مقدار جدیدی به zip ارور داریم و اگه موس رو روی اون خط نگه داریم متوجه میشیم که IntelliJ میگه که نمیتونیم به متغیر val مقدار جدید بدیم. پس var به این معنی است که من دارم یک متغییر میسازم که اسیب پذیره یعنی میتونه مقدار جدید بگیره و زمانی که val مینویسیم به این معنیه که من دارم یک متغیر غیر آسیب پذیر تولید میکنم، یعنی نمیتونیم مقدار جدید بهشون بدیم. اگه حالا با Java اشنا باشین val انگار همون متغییریه که اولش final داشت.
67 |
68 | یک نکته دیگه هم بگم، ما در واقع نیازی نداریم که تایپ متغیر رو ذکر کنیم، یعنی میتونیم بنویسیم
69 |
70 |
77 |
78 | و خود کامپایلر میفهمه که با streetName چه نوع تایپی رو بده و اونو بهش نسبت بده، البته این به این معنی نیستش که میتونیم وسط برنامه تایپش رو عوض کنیم.
79 |
80 |
11 |
12 |
13 |
14 | ما دیدیم که زمانی که داریم به دوگانه ها یا سه گانه ها دسترسی پیدا میکنیم، هر دسترسی رو با استفاده از first و second و third انجام میدیم، خب البته مشکلی هم نیست ولی خب یکی از هدف های کاتلین این بود که دقیق تر کد بزنیم و این که بگیم اولی یا دومی یا سومی دقیق نیست یعنی اصلا اولی یا دومی چی هستند؟ و درواقع من باید برم به محل تعریف تابع تا متوجه بشم اولی چیه یا دومی یا سومی.
15 |
16 | به عنوان مثال کدی که نوشتیم رو نگاه کنین:
17 |
18 |
33 |
34 | خب ما اینجا result رو داریم و در نتیجه میتونیم first و second رو بدست بیاریم، ولی first چه مقداری رو بهمون میداد ؟ یا second چی؟ خب برای این که بفهمیم میریم بالا و نگاه میکنیم میبینیم که String و Long رو داریم برمیگردونیم ولی بازم دیدگاهی نداریم که این دو نماینده چه متغییر هایی بودن.
35 |
36 | کاتلین برای حل این مشکل بهمون این امکان رو میده که متغییر هارو بشکنین، به عنوان مثال کد زیر رو نگاه کنین:
37 |
38 |
54 |
55 | در واقع این به معنیه اینه که من میتونم به جای این که جواب رو توی یک متغیر بریزم، جواب رو توی دومتغیر با نام دلخواه بریزم.البته این شکستن تنها برای چندگانه ها نیست. اگر به کد تعریف دوگانه ها یا سه گانه ها مراجعه کنید(در IntelliJ IDEA دکمه ctrl را نگه دارید و موس را برروی Pair ببرید و کلیک کنید) متوجه خواهید شد که درواقع دوگانه ها یا سه گانه ها کلاس های دیتای از پیش تعریف شده ای هستند که ما از انها استفاده میکنیم. پس همینطور که ما میتونیم برای دوگانه ها به عنوان مثال مقادیر خروجی رو بشکنیم، همین کار رو برای کلاس های دیتا هم میتونیم انجام بدیم. به عنوان مثال
56 |
57 |
11 |
12 |
13 |
14 | اخرین موردی که میخوایم توی این بخش در موردش صحبت کنیم استفاده، صدازدن توابع الحاقی کاتلین از جاوا است. بیاین به فایل CustomerKotlin مراجعه کنیم و یک تابع الحاقی بهش اضافه کنیم
15 |
16 |
35 |
36 | درواقع ما اینجا از همون فایل استفاده میکنیم و چون میخوایم روی یک کلاس شی خاصمون این تابع رو اعمال کنیم، این شی رو به تابع پاس بدیم و در نهایت همون فرآیند که میخوایم روی اون شی به عمل میاد.
37 |
38 |
11 |
12 |
13 |
14 | کاتلین یک ویژگی خیلی مهم رو ساپورت میکنه به نام توابع الحاقی، که درواقع از C# الهام گرفته شده. ایده پشت این ویژگی اینه که من بتونم یک تابع رو به یک کلاس الحاق کنم بدون این که از اون کلاس ارث بری کنم
15 |
16 | کد زیر رو نگاه کنین:
17 |
18 |
27 |
28 | در واقع اینجا یک الحاق به کلاس String انجام دادیم. یک تابع جدید به کلاس String اضافه کردیم که تنها یک رشته رو چاپ میکنه و برای استفاده ازش کافیه بنویسیم :
29 |
30 |
57 |
58 | نیاز نیست که حالا درمورد این زنجیره و توابع داخلش نگران باشین، چیزی که اینجا مهمه اینه که با استفاده از this مقدار خود String که این تابع به اون الحاق شده رو داخل تابع الحاقیمون استفاده کردیم.
59 |
60 |
61 |
62 | ```kotlin
63 | fun String.toTilteCase(): String {
64 | return this.split(" ").joinToString(" ") { it.capitalize() }
65 | }
66 |
67 | fun main(args: Array) {
68 | println("this is a sample string to title case".toTilteCase())
69 | }
70 | ```
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 | **خلاصه بخش 9:**
79 |
80 | 1- ما توی این قسمت نگاهی به توابع High-Order انداختیم و دیدیم که توابع High-Order حساب میشن که یا یک تابع رو به عنوان ورودی قبول کنن و یا این که تابع رو به عنوان خروجی پاس بدن
81 |
82 | 2- دیدم که کاتلین استفاده از Lambda را ممکن کرده
83 |
84 | 3- دیدم که کاتلین اجازه دسترسی به Closure های تغییر داده شده رو میده، به این معنی که اگر در داخل عبارت لاندامون از متغییری استفاده کردیم که تغییر میکنه، اون تغییر به داخل لاندامون هم سرایت میکنه.
85 |
86 | 4- و دیدیم که توابع الحاقی توابعی هستند که میتونیم اون هارو بدون ارث بری از کلاس به اون کلاس اضافه کنیم. که این کار رو درواقع برای کلاس های جاوا هم میتونیم انجام بدیم.
87 |
88 |
89 |
11 |
12 |
13 |
14 | حالا، یکی از ویژگی هایی که همراه کاتلین میاد اینه که توابعمون میتونن مقادیر پیشفرض داشته باشند. مثلا تابع sum رو نوشیتم که یادتون میاد.خب حالا فرض کنین من میخوام یک مقدار z هم در نظر بگیرم، که البته بعضی جاها نیاز به 2 پارامتر و بعضی جاها نیاز به 3 پارامتر داریم! یعنی بعضی جاها پارامتر سوممون به صورت دیفالت صفر باید درنظر گرفته بشه.
15 |
16 |
28 |
29 | نگاه کنین، کامپایلر میاد نگاه میکنه،اگه پارامتر سوم فراهم شده بود که همون مقدار رو استفاده میکنه، اگه پارامتر سوم فراهم نشده بود از مقدار دیفالت استفاده میکنه! و این خوبه، چراکه بهمون این قابلیت رو میده که یک تابع با چندین پارامتر دیفالت داشته باشیم و از تکرار بی مورد(overload) توابع جلوگیری کنیم. مثلا توی جاوا اگر میخواستیم یک تابع داشته باشیم که در بعضی مواقع دو ورودی میگرفت و در بعضی مواقع 3 ورودی، این کار امکان پذیر نبود و برای عملی شدن آن باید 2 تابع مینوشتیمف یکی با 2 ورودی و یکی با 3 ورودی که خب این مشکل در کاتلین رفع شده است.
30 |
31 | خب بیاین یک تابع دیگه رو مثال بزنیم،مثلا
32 |
33 |
42 |
43 | اومدم یک تابع درست کردم که مقدار اول و سوم رو درخواست میکنه ولی اگه مقدار دوم وارد نشد به صورت دیفالت یک مقدار جایگزینش میشه. حالا کد main رو هم مینویسم
44 |
45 |
52 |
53 | برای مقدار name نام خودم رو دادم و برای مقدار شماره هم شماره خودم رو وارد کردم. ولی وقتی اجراش کنیم متوجه میشیم که ارور میده، دلیلش هم اینه که مقدار شماره تلفن رو که من به عنوان دومین ورودی وارد کردم رو به عنوان email میگیره! در واقع میمونه که شما دارین پارامتر phone رو پاس میدین یا پارامتر email . برای رفع این مشکل هم راه حل خیلی ساده ای داریم، کاتلین این قابلیت رو توی کد نویسی به توسعه دهنده میده که وقتی میخواین به یک تابع مقدار بدین، دقیق مشخص کنین که به کدوم پارامتر میخواین مقدار بدین، پس کد درست بالا میشه:
54 |
55 |
62 |
63 | در ضمن این خاصیت این قابلیت رو به ما میده که ما خارج از ترتیبی که تابع رو تعریف و پارامتر های اونو درخواست کردیم به تابع ورودی بدیم.
64 | در ضمن این قابلیت در واقع اونجایی خوبه که ما تعداد زیادی پارامتر ورودی میخوایم و در واقع گیج میشیم که کدوم ورودی برای کدوم پارامتره و ما با نام دهی به مقادیری که میخوایم به تابع پاس بدیم از این گیج شدن جلوگیری میکنیم.
65 |
66 |
67 |
--------------------------------------------------------------------------------
/_tutorials/introduction/function-with-unlimited-parameters-in-kotlin-and-summary.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: tutorial
3 | title: "تابع با پرامترهای نامحدود و خلاصه بخش چهارم"
4 | category: introduction
5 | unit: 4
6 | chapter: 3
7 | ---
8 |
9 |
10 |
11 |
12 |
13 |
14 | اخرین بخشی که میخوایم در قسمت توابع به اون نگاه کنیم، پاس دادن تعداد نامشخص پارامتر های ورودی به تابعه. به عنوان مثال من میخوام تابعی رو تعریف کنم که قبل از این که از اون استفاده کنم، تعداد نامحدودی پارامتر ورودی قبول کنه.
15 |
16 |
27 |
28 | تابع بالا رو نگاه کنین، با استفاده از کلید واژه vararg این مفهوم رو به کامپایلر میدم که من میخوام تابعی رو استفاده کنم که تعداد ورودی هاش مشخص نیست ولی همه انها از جنس رشته هستند.
29 |
30 | حالا من میتونم از این تابع استفاده کنم
31 |
32 |
41 |
42 | و هر چه قدر که ورودی دلم بخواد به تابع پاس بدم.
43 |
44 | فقط یک نکته اینجا هست، اگر من بخوام این vararg رو به یک تابع دیگه پاس بدم چه طور باید عمل کنم
45 |
46 |
61 |
62 | واقعیتش راه حل خیلی ساده است، باید یک تابع دیگه بسازیم که vararg بگیره ولی خود پارامتر vararg رو مستقیم به تابع پاس ندیم.مثلا در اینجا string رو مستقیم پاس ندیم بلکه با استفاده از "*" قبل نام پارامتر اونو پاس بدیم!
63 |
64 | **خلاصه بخش 4**
65 |
66 | 1- توابع با استفاده از کلیدواژه fun ساخته میشوند
67 |
68 | 2- به صورت پیشفرص یک تابع تایپ Unit رو به عنوان پارامتر بازگشتی برمیگردونه
69 |
70 | 3- توی توابع به ما اجازه داده شده تا از
71 |
72 | - پارامتر های پیشفرص داشته باشیم
73 |
74 | - از پارامتر های نام دهی شده استفاده کنیم
75 |
76 | - و بی شمار ورودی برای یک تابعمون درنظر بگیریم
77 |
78 |
79 |
80 |
--------------------------------------------------------------------------------
/_tutorials/introduction/higher-order-functions-in-kotlin.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: tutorial
3 | title: "توابع Higher-Order"
4 | category: introduction
5 | unit: 9
6 | chapter: 1
7 | ---
8 |
9 |
10 |
11 |
12 |
13 |
14 | زمانی که در مورد توابع در کاتلین صحبت شد به این اشاره کردم که باید بتونیم با توابع به صورت کلاس های شهروند مرتبه اول برخورد کنیم و یکی از ویژگی های مهمی که یک زبون رو Functional میکنه اینه که توابعش بتونن به صورت Higher-Order ظاهر شن و اگر با مفهوم Higher-Order اشنا نیستین به این معنیه که توابع بتونن توابع دیگر رو به صورت پارامتر ورودی قبول کنن یا این که یک تابع بتونه توابع دیگر رو برگردونه. کاتلین این رو و البته چیز های دیگه ای مثل عبارت های Lambda و یا توابع بی نام و غیره و غیره رو هم ساپورت میکنه و الان میخوایم ببنیم چجوری میتونیم از تموم ویژگی های یک زبان Functional استفاده کنیم.
15 |
16 | بیاین چند خط کد بنویسیم:
17 |
18 |
27 |
28 | یک تابع نوشتیم به نام operation که دو متغیر x و y و همچنین یک تابع دیگر رو به عنوان ورودی دریافت میکنه که البته این تابع ورودی، دو متغیر از جنس Int دریافت میکنه و یک مقدار Int برمیگردونه و در انتها هم ما مقدار x و y رو به تابع op دادیم و مقدارش رو برمیگردونیم.به همین سادگی در کاتلین یک تابع High-Order نوشتیم.
29 |
30 | خب ما چطور میتونیم از این استفاده کنیم؟ مسلما باید یک تابع بنوسیم که با الگو (Int,Int) -> Int جور دربیاد، به عنوان مثال تابع زیر رو درنظر بگیرین
31 |
32 |
33 |
34 | ```kotlin
35 | fun sum(x: Int, y: Int) = x + y
36 | ```
37 |
38 |
39 |
40 | توی کاتلین برای صدا زدن به وسیله نام اون تابع باید از "::" استفاده کنیم
41 |
42 |
43 |
44 |
45 | ```kotlin
46 | fun operation(x: Int, y: Int,op: (Int,Int)->Int): Int {
47 | return op(x,y)
48 | }
49 |
50 | fun sum(x: Int, y: Int) = x + y
51 |
52 | fun main(args: Array) {
53 | println(operation(2,3,::sum))
54 | }
55 | ```
56 |
57 |
58 |
59 | شما توی کاتلین هرجور که دوست دارین میتونین توابع High-Order بنویسین:
60 |
61 |
11 |
12 |
13 |
14 | کاتلین ارث بری رو مثل بقیه زبون های شی گرا ساپورت میکنه و توی کاتلین، کلاس پایه ای همه ی کلاس ها Any هستش. یعنی درواقع اگه یک کلاس باز کنم به این فرم
15 |
16 |
33 |
34 | خب حالا بیاین یه کلاس پدر برای Customer بسازیم.
35 |
36 |
37 |
38 | ```kotlin
39 | class Person
40 |
41 | class Customer: Person()
42 | ```
43 |
44 |
45 |
46 | فقط یادتون باشه وقتی کلاس رو inherit میکنین کانستراکتورش رو هم مشخص کنین.
47 |
48 | اگه کد بالا رو بزنین متوجه میشین که ارور توی برنامتون هست.مشکل اینجاست که توی کاتلین همه ی تایپ ها final هستند بنابراین نمیشه ازشون ارث بری بشه.یه جورایی میشه گفت برعکس جاوا که همیشه میتونیم ارثبری کنیم مگر این که final باشه، توی کاتلین هم میشه گفت همیشه میتونیم از یک کلاس ارث بری کنیم اگر اون کلاس open باشه.
49 |
50 |
51 |
52 | ```kotlin
53 | open class Person
54 |
55 | class Customer: Person()
56 | ```
57 |
58 |
59 |
60 | برای توابع هم اگه میخوایم ازشون ارث بری بشه باید open قبلشون بیاد
61 |
62 |
63 |
64 | ```kotlin
65 | open class Person{
66 | open fun validate(){
67 |
68 | }
69 | }
70 |
71 | class Customer: Person(){
72 | override fun validate() {
73 | super.validate()
74 | }
75 | }
76 | ```
77 |
78 |
79 |
80 | خب حالا اگه به همراه main بخوایم تابع validate رو صدا کنیم داریم
81 |
82 |
83 |
84 | ```kotlin
85 | open class Person{
86 | open fun validate(){
87 |
88 | }
89 | }
90 |
91 | class Customer: Person(){
92 | override fun validate() {
93 | super.validate()
94 | }
95 | }
96 |
97 | fun main(args: Array) {
98 | val customer = Customer()
99 |
100 | customer.validate()
101 | }
102 | ```
103 |
104 |
105 |
106 | خب حالا فرض کنین توی Customer هستیم و میخوایم کانستراکتور پدرش رو صدا بزنیم، یادتونه گفتیم یه کانستراکتور دوم داریم؟ اینجا تقریبا میخوایم از همون استفاده کنیم، با این تفاوت که به جای this باید از super استفاده کنیم
107 |
108 |
129 |
130 | فقط اینجا توجه کنین که علاوه بر این که به جای this از super استفاده کردیم پس باید کانستراکتور Person رو زمان ارث بری حذف کنیم، یعنی مثلا اینجا اومدیم و پرانتز های جلوی Person رو برداشتیم.
131 |
132 |
11 |
12 |
13 |
14 | خب بیشتر این دوره کدنوشتنه و اگه شما بتونین هم پای من بیاین و کد بزنین خیلی بهتر میشه.
15 |
16 | برای این که شروع کنیم شما به یک سری نرم افزار و ابزار ها نیاز دارین. خب مسلما به JDK نیاز خواهید بود که ما به نام Java Development Kit میشناسیمش و شما میتونین از نسخه 6 یا 7 یا 8 استفاده کنید. شما همچنین به کامپایلر Kotlin نیاز خواهید داشت و همچنین یک Editor و یا یک IDE .
17 |
18 | من قراره از IntelliJ IDEA استفاده کنم ولی شما میتونین از هر IDE که دلتون میخواد و کاتلین رو ساپورت کنه استفاده کنین.
19 |
--------------------------------------------------------------------------------
/_tutorials/introduction/interfaces-in-kotlin/result-1.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/interfaces-in-kotlin/result-1.PNG
--------------------------------------------------------------------------------
/_tutorials/introduction/interop-with-java-7-and-8-and-summary.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: tutorial
3 | title: "همکاری با جاوا 7 و 8 و خلاصه بخش دهم"
4 | category: introduction
5 | unit: 10
6 | chapter: 7
7 | ---
8 |
9 |
10 |
11 |
12 |
13 |
14 | ما گفتیم که کاتلین قابلیت همکاری با Java 6.0 رو هم داره به این معنی که هرچی که روی جاوا 6 اجرا میشه ( به عنوان مثال اندروید) میتونه روی کاتلین هم اجرا بشه پس نیازه که Java 6.0 رو هم هدفمون قرار بدیم. به عنوان مثال توابع Lambda در جاوا 6 کلاس های بی نام هستن.
15 |
16 |
17 | **خلاصه بخش 10:**
18 |
19 | 1- متوجه شدیم که هم از کاتلین میتونیم به فایل جاوا دسترسی داشته باشیم و هم از جاوا به کاتلین
20 |
21 | 2- این که یک مقدار null باشه یا نه به توسعه دهنده بستگی داره و همچنین قابلیت استفاده از Annotation ها رو هم داریم
22 |
23 | 3- میتونیم از API های 8 و 7 استفاده کنیم
24 |
25 |
--------------------------------------------------------------------------------
/_tutorials/introduction/interoperability-with-java.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: tutorial
3 | title: "همکاری با جاوا"
4 | category: introduction
5 | unit: 10
6 | chapter: 1
7 | ---
8 |
9 |
10 |
11 |
12 |
13 |
14 | در ابتدای این دوره دیدیم که در بعضی مواقع از کلاس های جاوا استفاده کردیم ولی توی این قسمت میخوایم بیشتر روی قابلیت همکاری کاتلین صحبت کنیم و همینطور که چندبار در طول این دوره اشاره کردم، کاتلین به راحتی میتونه با کلاس ها و توابع جاوا همکاری و ارتباط برقرار کنه به این معنی که میتونین در یک پروژه به راحتی از این دو زبون استفاده کنین و مزیتش اینه که اگر شما یک پروژه جاوا داشته باشین نیازی نیست که پروژه رو دور بریزین و همه چیز رو از اول بنویسین، تنها کاری که باید بکنین اینه که یک کلاس کاتلین بنویسین و از اون توابع و کلاس های جاوایی که قبلاً ساختین رو در اون استفاده کنین و همچنین یک ویژگی جالب و قشنگی که Intellij IDEA داره اینه که میتونه یک کلاس جاوا رو بگیره و اون رو به یک کلاس کاتلین تبدیل کنه.
15 |
16 | همکاری با کلاسهای جاوا این مزیت رو بهمون میده که بتونیم از تموم کتابخانه هایی که برای JVM نوشته شده استفاده کنیم و همونطور که گفتم این مزیت رو بهمون میده که نیازی نباشه همه چیز رو از اول بنویسیم، نیازی نباشه که صبر کنیم تا یک سیستم بالابیاد و بعدش بتونیم در پروژه هامون استفاده اش کنیم. البته که خب به مراتب کاتلین با مفهوم تر و خلاصه تر و بهتر از جاواست و این به توسعهدهنده ها این اجازه رو میده که برای این که استفاده از یک API راحت تر بشه بیان و لایبری های کاتلین رو درست کنن که البته این کار خوبیه ولی دلیل نمیشه که نتونیم از همون کتابخونه های قبلی استفاده کنیم.
17 |
18 | البته زمانی که داریم از جاوا داخل کاتلین استفاده میکنیم باید بر طبق روند کاتلین حرکت کنیم و بلعکس اگر از کاتلین در جاوا استفاده میکنیم باید طبق روند جاوا عمل کنیم.
19 |
20 |
11 |
12 |
13 |
14 | JVM یا Java Virtual Machine یک ماشین انتزائیه که برنامه های Java رو اجرا میکنه. ولی این محیط از چند بخش تشکیل شده؛ به عنوان مثال برای اجرای برنامه های جاوا ما نیاز به یک محیطی داریم که بتونیم توش برنامه های جاوامون رو اجرا کنیم که اون محیط JRE و یا Java Runtime Environment نام داره. همچنین برای توسعه برنامه های جاوا ما نیاز به JDK و یا Java Development Kit داریم که با این کیت بتونیم برنامه های جاوامون رو توسعه بدیم.
15 | خب به قسمتی میرسیم که ببنیم که کاتلین چگونه برنامه های خودش رو اجرا میکنه ولی قبلش باید ببینیم که جاوا چجوری یک فایل رو اجرا میکنه.
16 | اول این که ما مسلماً یک سری کد مینویسم و توی یک فایل مثلا Customer.java ذخیره میکنیم. حالا کامپایلر جاوا رو صدا میزنیم که اون کد هارو جوری کامپایل کنه که اون فایل ها قابل اجرا باشن بر روی ماشین مجازی، پس کامپایلر یک سری بایت کد درست میکنه که اون فایل ها اجرا بشن.
17 | حالا بریم سمت کاتلین:
18 | فرض میکنیم که ما میخواهیم فایل Customer.kt را اجرا کنیم.ابتدا این فایل توسط کامپایلر کاتلین به فایل Customer.Class تبدیل میشه که این فایل همون ByteCode های جاواست و این فایل همون فایلیه که توسط JVM اجرا میشه. دقت کردین که اینجا هیچگونه بار اضافه اجرایی یا به اصطلاح ( overhead ) به سیستم وارد نمیشه و عملا داریم همون بایت کد هایی رو اجرا میکنیم که اگه کدمون رو به جاوا مینوشتیم درست میشد!
19 | همون طور که گفتیم یکی از خصوصیات Kotlin اینه که باید قابلیت همکاری با Java را داشته باشد و همینطور که می بینین همینجوریه چون عملا بایت کد ها چون از یک جنس هستند میتونن با هم همکاری کنن ولی خب در بخش همکاری پذیری به این ویژگی بیشتر میپردازیم.
20 | پس یادمون باشه که نیازی به نوشتن یا تبدیل کردن پروژه های جاوامون نیست! ما میتونیم همینجوری از اون ها داخل پروژه های جدیدمون استفاده کنیم. یعنی میتونید توی یک پروژه هم کاتلین کد بزنین و هم جاوا!
21 |
--------------------------------------------------------------------------------
/_tutorials/introduction/kotlin-data-classes/result-1.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/kotlin-data-classes/result-1.PNG
--------------------------------------------------------------------------------
/_tutorials/introduction/kotlin-data-classes/result-2.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/kotlin-data-classes/result-2.PNG
--------------------------------------------------------------------------------
/_tutorials/introduction/kotlin-data-classes/result-3.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/kotlin-data-classes/result-3.PNG
--------------------------------------------------------------------------------
/_tutorials/introduction/kotlin-data-classes/result-4.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/kotlin-data-classes/result-4.PNG
--------------------------------------------------------------------------------
/_tutorials/introduction/kotlin-standard-library-and-working-with-collections-in-kotlin/kotlin-collection.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/kotlin-standard-library-and-working-with-collections-in-kotlin/kotlin-collection.png
--------------------------------------------------------------------------------
/_tutorials/introduction/kotlin-standard-library-and-working-with-collections-in-kotlin/list-collection.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/kotlin-standard-library-and-working-with-collections-in-kotlin/list-collection.png
--------------------------------------------------------------------------------
/_tutorials/introduction/kotlin-standard-library-and-working-with-collections-in-kotlin/listof-type.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/kotlin-standard-library-and-working-with-collections-in-kotlin/listof-type.png
--------------------------------------------------------------------------------
/_tutorials/introduction/kotlin-standard-library-and-working-with-collections-in-kotlin/listof.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/kotlin-standard-library-and-working-with-collections-in-kotlin/listof.png
--------------------------------------------------------------------------------
/_tutorials/introduction/kotlin-with-intellij-idea/compiled-application.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/kotlin-with-intellij-idea/compiled-application.PNG
--------------------------------------------------------------------------------
/_tutorials/introduction/kotlin-with-intellij-idea/create-main.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/kotlin-with-intellij-idea/create-main.PNG
--------------------------------------------------------------------------------
/_tutorials/introduction/kotlin-with-intellij-idea/debug-application.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/kotlin-with-intellij-idea/debug-application.PNG
--------------------------------------------------------------------------------
/_tutorials/introduction/kotlin-with-intellij-idea/new-project-1.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/kotlin-with-intellij-idea/new-project-1.PNG
--------------------------------------------------------------------------------
/_tutorials/introduction/kotlin-with-intellij-idea/new-project-2.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/kotlin-with-intellij-idea/new-project-2.PNG
--------------------------------------------------------------------------------
/_tutorials/introduction/kotlin-with-intellij-idea/new-project-3.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/kotlin-with-intellij-idea/new-project-3.PNG
--------------------------------------------------------------------------------
/_tutorials/introduction/kotlin-with-intellij-idea/view-of-first-application.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/kotlin-with-intellij-idea/view-of-first-application.PNG
--------------------------------------------------------------------------------
/_tutorials/introduction/kotlin-with-intellij-idea/view-of-main.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/kotlin-with-intellij-idea/view-of-main.PNG
--------------------------------------------------------------------------------
/_tutorials/introduction/kotlin-with-intellij-idea/welcome-to-intellij-idea.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/kotlin-with-intellij-idea/welcome-to-intellij-idea.PNG
--------------------------------------------------------------------------------
/_tutorials/introduction/lambda-expressions-in-kotlin/result-1.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/lambda-expressions-in-kotlin/result-1.PNG
--------------------------------------------------------------------------------
/_tutorials/introduction/loops-and-ranges-in-kotlin.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: tutorial
3 | title: "حلقه ها در کاتلین"
4 | category: introduction
5 | unit: 3
6 | chapter: 3
7 | ---
8 |
9 |
10 |
11 |
12 |
13 |
14 | حالا بیاین یکم نگاه حلقه ها کنیم،
15 |
16 | یک فایل دیگه به نام `LoopsAndRanges` درست میکنیم و `main` رو داخلش مینویسیم
17 |
18 |
19 |
20 |
21 |
22 |
23 | اگه دقت کنیم داخل این فایل هم `main` داریم و داخل فایل قبلی هم `main` داریم. ایا همچین چیزی ممکن است؟ درواقع کاتلین همیچین اجازه رو میده که به ازای هر فایل یک `main` داشته باشیم.
24 |
25 | خب حالا از این قضیه بگذریم، بیاین یک حلقه `for` درست کنیم
26 |
27 |
36 |
37 |
38 | ابتدا نام یک متغیر رو تعریف میکنیم که میخوایم بر روی اون راه بریم. سپس تایپش رو معرفی میکنیم سپس با استفاده از کلید واژه `in` میگیم که میخوایم در چه محدوده ای(هرچی جلوش میاد) راه بریم و بعدش محدوده رو تعریف میکنیم و در انتها هم هرچی جلوی اکولاد ها میاد رو هر دفعه انجام میده. در واقع ما اینجا هم میتونیم تایپ رو مشخص نکنیم و خود کامپایلر میفهمه منظورمون کدوم تایپه.
39 | نکته ای که در اینجا باید توجه کنیم بهش اینه که اون `..` که اومده درواقع همان تابع `rangeTo()` است. در واقع ما میتونیم اینجور بنویسیم:
40 |
41 |
101 |
102 | حالا کار نداشته باشین اون listOf چیه و چگونه کار میکنه فعلا فقط بدونین که یک لیست درست میکنه. به همین راحتی این لیست رو به for میدیم و اون روی این لیست راه میره و تموم اون مرکز شهر هارو چاپ میکنه.
103 |
104 | خب حلقه ها تنها for نیستند، مثلا while و do while نیز به صورت زیر نوشته میشوند
105 |
106 |
107 |
108 | ```kotlin
109 | var i = 100
110 | while (i>0){
111 | i--
112 | }
113 | var x = 10
114 | do {
115 | x--
116 | }while (x>0)
117 | ```
118 |
119 |
120 |
121 | حالا خارج از بحث حلقه ها، کاتلین این ویژگی را به کاربر میدهد که بتواند حلقه را ادامه دهد یا از حلقه بیرون بیایید. به عنوان مثال به تکه کد زیر دقت کنید:
122 |
123 |
124 |
125 | ```kotlin
126 | loop@ for (i in 1..100){
127 | for(j in 1..100){
128 | if(i%j == 0)
129 | break@loop
130 | }
131 | }
132 | ```
133 |
134 |
135 |
136 | در اینجا ما با هدف قرار دادن حلقه اول از حلقه دوم خارج میشویم به این صورت که وقتی break را مینویسم با یک @ یک لیبل را مشخص میکنیم که میخواهیم به ان وارد شویم. و همینطور با continue
137 |
138 |
11 |
12 |
13 |
14 |
15 | ما دیدیم که چگونه یه تابع Top-Level بسازیم، اما به هرحال کاتلین یه زبون شی گراست و بنابراین باید بتونیم داخل کلاس هم تابع بنویسیم که به این تابع ها Member-Functions میگن.
16 |
17 | ولی خب تعریف تابع داخل کلاس خیلی راه حل سر راستی داره، به همون راحتی که قبلا توی یک فایل تابع مینوشیتم، مثلا کد زیر رو نگاه کنین
18 |
19 |
20 |
21 | ```kotlin
22 | class Customer(var id: Int, var name: String, var yearOfBirth: Int){
23 |
24 | fun customerAsString(){
25 | println("id : $id - name : $name")
26 | }
27 | }
28 | ```
29 |
30 |
31 |
32 | که تابعمون دو خاصیت رو از کلاسمون چاپ میکنه.
33 |
34 | برای استفاده ازش هم کافیه از شی که از کلاسمون ساختیم تابع رو صدا بزنیم
35 |
36 |
11 |
12 |
13 |
14 | نمیدونم که آیا تفاوت کلاس و Object رو میدونید یا نه؟ واسه همین یه توضیح کوچولو میدم.
15 |
16 | واضح ترین تفاوت میان این دو اینه که کلاس به مانند یک نقشه برای طراحی ساختمون میمونه، یعنی در واقع شما با ساختن یک کلاس یک، نمونه میسازین که اشیاء ارث بری شده ازشون میتونن کار های دلخواهتون رو انجام بدن. ولی به عنوان مثال در JavaScript کلاس تعریف نشدس و به جای اون Object هایی ساخته میشن که میتونن 2 کار رو انجام بدن، یا به صورت یک نمونه برای Object های دیگه عمل کنن و یا خودشون همون اعمال رو انجام بدن.
17 |
18 | در کاتلین شما هم تعریفی به نام Object داری و هم تعریفی به نام Class و خب در نتیجه مواقعی که لازمه میتونید از Object استفاده کنید مخصوصا مواقعی که میخواین Functional کد بنویسین.
19 |
20 | خب حالا بیاین ببینیم چجوری:
21 |
22 |
35 |
36 | به همین سادگی که میبینین. من حتی میتونم همین object رو به صورت یک عبارت بیان کنم.
37 |
38 |
39 |
40 | ```kotlin
41 | object Global{
42 | val PI = 3.14
43 | }
44 |
45 | fun main(args: Array) {
46 | val localObject = object {
47 | val PI = 3.14159
48 | }
49 |
50 | println(localObject.PI)
51 | println(Global.PI)
52 | }
53 | ```
54 |
55 |
56 | تفاوتی که این دو دارن اینه که عبارت ها سریعا ساخته میشن! خب البته درمورد استفاده های Object بعدا بیشتر صحبت میکنیم.
57 |
58 | **خلاصه بخش 5:**
59 |
60 | 1- کلاس ها به مانند شهروند رتبه اول در کاتلین به حساب میان( به مانند Top-level-functions)
61 |
62 | 2- میتونن خصیصه و توابع داخل خودشون داشته باشن
63 |
64 | 3- توی کاتلین چیزی به نام feild وجود نداره( البته منظورمون متغییر های feild هستش و نه اون که توی بخش کلاس های دیتا دیدیم)
65 |
66 | 4- با کلاس های دیتا اشنا شدیم
67 |
68 | 5- با enum ها اشنا شدیم
69 |
70 | 6- Object ها یک روش خیلی ساده برای ساختن singleton ها هستند
71 |
72 |
73 |
11 |
12 |
13 |
14 | خب اگه تموم مثال هایی که زدیم رو دیده باشین متوجه شدین که ما تقریبا به یک پکیج محدود بودیم و ما داخل اون پکیج کار میکردیم.مثلا اگه همون فایل Main که دفعه اول استفاده کردیم رو نگاه کنیم متوجه خواهیم شد که ما از تابعی به نام println() استفاده کردیم . این تابع از کجا آمد؟ چجوری ازش استفاده کردیم ؟
15 |
16 | اگه روی ویندوز هستید و دکمه Ctrl رو نگه دارید و روی تابع کلیک کنین به سمت تعریف اون تابع هدایت میشین. و اگر به ابتدای اون فایل برین متوجه میشین که این تابع داخل بسته ای به نام kotlin.ioهستش. پکیج ها به مانند جاوا و دیگر زبون ها میتونن import بشن ولی در واقع نیازی به import کردن توابعی مثل println() و به مانند این ها نیست، در واقع اونها به طور ضمنی import شدن ولی من میتونم پکیج های دیگه رو از جاهای دیگه ی برنامم import کنم. به عنوان مثال بیاین و داخل همون پکیج basic یک پکیج دیگه به نام utils باز کنیم. و داخل اون هم یک فایل به نام SampleUtils باز کنیم.
17 |
18 |
19 |
20 |
21 |
22 | حالا بیایم و یک تابع به نام SomeUtility() در اون باز کنیم که یک متغییر name از جنس String میگیره.
23 |
24 | خب حالا اگر به فایل Main برگردم میتونم با استفاده از کلیدواژه import ابتدا فایل SampleUtils رو اضافه کنم و بعدش از توابع داخلش استفاده کنم. توجه کنین که اگر هم ابتدا اون فایل رو import نکنم و مستقیم بنویسم SomeUtility خود intelliJ برام فایل رو import میکنه و یا از من سوال میپرسه که import اش کنم یا نه.
25 |
26 |
27 |
42 |
43 | ما میتونیم به جای این که مشخص کنیم از چه فایلی میخوایم دقیقا استفاده کنیم بگیم از کل فایل های داخل این پکیج استفاده کن و اون رو با گذاشتن * به جای someUtility انجام میدیم.
44 |
45 |
52 |
53 | همچنین اومدیم و فایل رو import کردیم و متوجه شدیم فایلی که import شده هم نام با یکی از فایل های دیگمونه،میتونیم به این روش جور دیگه ای ازش استفاده کنیم
54 |
55 |
11 |
12 |
13 |
14 | برای تمرین این قسمت بهتر است از IntelliJ IDEA استفاده شود
15 |
16 | خب بیاین در داخل کاتلین با جاوا صحبت کنیم. توجه داشتین که یک کلاس CustomerJava داشتیم که در واقع یک Java Bean بود.خب حالا بیاین توی یک کلاس کاتلین از این کلاس جاوا یک متغیر بسازیم و بعد به یک خصیصه از اون کلاس جاوا دسترسی داشته باشم
17 |
18 |
28 |
29 | اگه دقت کنین برای استفاده از email نیازی نیست که تابع getEmail رو صدا بزنیم! تنها کاری که لازمه اینه که نام اون متغیر رو صدا بزنیم و کاتلین خودش حدس میزنه که به چی نیاز داریم. البته به این معنی نیست که تابع getEmail رو نداریم و در واقع اگه بخوایم میتونیم از این تابع استفاده کنیم ولی خود کاتلین این اجازه رو میده که نیازی به صدا کردن تابع برای خوندن مقدارش نداشته باشیم. این ویژگی مسلما برای set هم هست و هر موقع بخوایم مقدار جدیدی رو بدیم کافیه همین روش رو به کار ببریم.
30 |
31 | درمورد ارث بری هم روند کارمون سادست. بیایی یک کلاس به نام PersonJava در کد جاوامون ایجاد کنیم:
32 |
33 |
34 |
35 | ```java
36 | public class PersonJava {
37 | private int id;
38 |
39 | public int getId() {
40 | return id;
41 | }
42 |
43 | public void setId(int id) {
44 | this.id = id;
45 | }
46 | }
47 | ```
48 |
49 |
50 |
51 | و حالا بیاین از این ارثبری کنیم:
52 |
53 |
91 |
92 | چیزی که در جاوا زیاد داریم در واقع "َAbstract متد های تنها" هستند که در واقع متد هایی هستند که در داخل کلاس اینترفیس ساخته میشن و یک نمونه ساده میتونه اینترفیس Runnable باشه.
93 |
94 | میتونیم به مانند بقیه اینترفیس ها اونو در یک کلاس کاتلین استفاده کنیم، مثلا کد زیر:
95 |
96 |
108 |
109 | ولی خب این یک راه حل خیلی ضایع برای این کاره، چرا که درواقع داریم یک کلاس رو که تنها یک تابع داره رو برای این موضوع به کار میبریم. میتونیم به مانند جاوا 1.8 به یک روش دیگه ازش استفاده کنیم:
110 |
111 |
11 |
12 |
13 |
14 | زمانی که کاتلین رو نصب میکنیم همونطور که دیدید دستور زیر رو در Command Line زدیم.
15 |
16 |
17 |
18 |
19 |
20 |
21 | محیطی رو برامون بالا میاره که بهش Kotlin REPL میگیم و مخفف Kotlin, Read Eval Print Loop هه که میتونیم بگیم یک محیط ساده تعاملی با کامپایلره و میشه با اون یک سری چیز هارو امتحان کنیم.همینطور که شما می بینین من یک سری کد اینجا مینویسم واین محیط از کامپایلر میخواد که این دستورات رو انجام بده و نتیجش رو پرینت کنه.
22 |
23 | مثلا:
24 |
25 |
26 |
27 |
28 |
29 | ما حتی می تونیم تابع بنویسیم.بعدا در مورد جزئیات صحبت میکنیم ولی فعلا به عنوان مثال این تابع رو نگاه کنید:
30 |
31 |
32 |
33 |
34 |
35 | ما میتونیم حتی کدمون رو توی چند خط بنویسیم:
36 |
37 |
38 |
39 |
40 |
41 | خب، تا اینجا متوجه شدیم که اینREPL رو میتونیم با استفاده از دستور kotlinc در محیط کنسول اجرا کنیم و کنسول هم این محیط تعاملی رو بالا میاره. همینطور میتونیم این محیط رو از یک روش دیگه بالا بیاریم که مقداری فیدبک بیشتری از کدی که زدیم میگیریم و اون هم استفاده از REPL داخل IntelliJ IDEA است که مقداری تجربه کاربری رو افزایش میده. خب پس میریم IntelliJ رو بالا میاریم و یک پروژه جدید شروع میکنیم. و اگر بریم به سمت Tools>Kotlin>kotlin REPL متوجه میشیم که دقیقا همون محیط رو در اینجا داریم.
42 |
43 |
44 |
45 |
46 |
47 | ولی یکی از خوبی های این محیط اینه که در اینجا همگردانی و اطلاعت پارامتر ها و ... رو داریم، بدین صورت که میتونیم از کمکی که IntelliJ میکنه بهمون استفاده کنیم. حال اگر دوباره دستورات گذشته را وارد کنیم متوجه خواهیم شد که:
48 |
49 |
11 |
12 |
13 |
14 | خب همینطور که میدونین ما توی کاتلین توابع Top-Level داشتیم و چیزی که توی جاوا تعریف نشده این گونه توابعه. چجوری میتونیم از اینگونه توابع استفاده کنیم ؟
15 |
16 | یک کلاس به نام TopLevelFunctions میسازیم
17 |
18 |
25 |
26 | و این تابع رو داخلش مینویسیم. در واقع کامپایلر وقتی این فایل رو کامپایل میکنه یک فایلی به نام TopLevelFunctionsKt.class میسازه
27 |
28 |
29 |
30 |
31 |
32 | یعنی درواقع کلاس TopLevelFunctions از فایل ToplevelFunctions جدا میشه! ما اگه کلاسی به همین نام در این فایل ایجاد کنیم و کامپایلش کنیم متوجه میشیم که فایل .class مربوط به اون کلاس رو جدا از فایل اصلی ساخته!
33 |
34 |
35 |
36 |
37 |
38 | و داخل کد هم همین قضیه برقراره، اگه بخوایم به فایل دسترسی پیدا کنیم باید از TopLevelFunctionKt استفاده کنیم و اگر به کلاس از TopLevelFunction.
39 |
40 |
47 |
48 | به همین راحتی. این قضیه برای خصیصه های Top-Level نیز برقراره ولی با این تفاوت که از getter و setter ها استفاده میکنیم.ولی البته که اگر بخواین میتونین به صورت field دسترسی داشته باشین و راهش استفاده از const هه . به راحتی کد زیر
49 |
50 |
51 |
52 | ```kotlin
53 | const val year = 2017
54 | ```
55 |
56 |
57 |
58 | البته یادتون باشه که نمیتونین برای متغییر های var از const استفاده کنین!
59 |
60 |
11 |
12 |
13 |
14 | چندگانه ها زمانی استفاده میشن که شما به عنوان مثال خروجی یک تابع رو بخواین به صورت یک مجموعه دوگانه یا سه گانه برگردونید. باید در نظر داشته باشین که اگر تعداد خروجی هاتون بیشتر از 3 تا هست باید از کلاس ها استفاده کنید و چندگانه ها در کاتلین تا سه گانه ها بیشتر پشتیبانی نمی شوند.
15 |
16 | خب اول بیاین یک تابع درست کنیم که یک دوگانه از جمله هارو برگردونه. مثلا یک تابع داشته باشیم که قراره اسم کشور رو بگیره و اسم پایتخت و جمعیت رو برگردونه.
17 |
18 |
33 |
34 | خروجی تابعمون به صورت Pair هستش و وقتی میخوایم از تابع استفاده کنیم کافیه بگیم متغیر اول رو میخوایم یا دوم.
35 |
36 | حالا اگه بخوایم یک سه گانه رو برگدونیم به این روش انجامش میدیم.
37 |
38 |
11 |
12 |
13 |
14 |
15 | خب به قسمتی رسیدیم که دقیقا به بخش خاصی تعلق ندارن ولی یکی از ابزاری که میتونه خیلی کمکمون کنه.
16 | typealias ها به ما این امکان رو میدن که بتونیم یک اسم جایگزین برای کلاس هایی که میخوایم استفاده کنیم بزاریم.
17 |
18 |
19 | مثلا میتونیم اسم یکی از کلاس هامون رو کوتاه کنیم و از این به بعد از اون اسم جایگزین استفاده کنیم
20 | مثلا فرض کنید که کلاسی به این اسم داریم:
21 |
31 |
32 | و خیلی قراره از این کلاس جاهای مختلفی استفاده کنیم که یقینا برای اینکه هربار این کلاس رو فراخونی کنیم و ازش نمونه بسازیم یه مقدار کلافه کننده ست،
33 | خوب اینجاست که این ابزار در کاتلین به کمکمون میاد و به ما این امکان رو میده که یک اسم جایگزین برای همچین کلاسی بنویسیم و از این به بعد از این نام کوتاه جای این نام طولانی کلاس استفاده کنیم.
34 |
11 |
12 |
13 | اگه دقت کرده باشین در تموم کد هایی که تا الان نوشیتم از هیچ گونه visibility-modifier ای استفاده نکردیم. و در واقع در کاتلین این قرارداد هست که visibility-modifier پیش فرض public است.
14 |
15 | توی کاتلین 4 نوع visibility-modifier داریم:
16 | - Public که پیشفرضمونه و از همه جا قابل دسترسیه
17 | برای Top-Level-Declaration ها ( منظور تموم تعریف هایی که به صورت Top-level انجام میشه، مثلا Top-level-function ها )
18 | - Private که تنها از داخل همون فایلی که تعریف شده قابل دسترسیه
19 | - Internal که در واقع این اجازه رو میده که از هرجای برنامه بتونیم به اون دسترسی داشته باشیم، تازمانی که داخل همون module که توش تعریف شده باشیم. درواقع module اینجا منظورمون gradle module ، maven module و غیره و امثال این هاست
20 | برای کلاس ها ما 3 نوع Visibility-modifier داریم
21 | - Private تنها دسترسی رو به عضو های یک class میده
22 | - Protected به مانند private میمونه ولی علاوه بر اون دسترسی رو به subclass ها هم میده
23 | - Internal در واقع اجازه میده که هر چیزی داخل module به اون دسترسی داشته باشه.
24 |
--------------------------------------------------------------------------------
/_tutorials/introduction/welcome-to-the-course.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: tutorial
3 | title: "به دوره خوش آمدید"
4 | category: introduction
5 | unit: 1
6 | chapter: 1
7 | ---
8 |
9 |
10 |
11 |
12 |
13 |
14 | امروز میخوایم در مورد کاتلین ( Kotlin ) صحبت کنیم که یک زبون برنامه نویسی است که در شرکت JetBrains توسعه داده شده.
15 | این دوره بیشتر شما که توسعه دهنده نرم افزار یا معماری است که ممکنه با JVM اشنا نباشید، ما بعضی قسمت هارو که نیاز به JVM داره رو پوشش میدیم پس نیاز به نگرانی نداره اگر چیزی قبلش ندیده باشین از این ها و همچنین ما کمی درمورد پایه Kotlin صحبت خواهیم کرد و همچنین این دوره به شما اطلاعات زیادی میده تا شما بتونین این زبون برنامه نویسی رو شروع کنین و البته در قسمت پیشرفته ( Advance ) یک سری اطلاعات بیشتری در مورد این زبون برنامه نویسی خواهید دید.خب پس شروع کنیم.
16 |
17 |
--------------------------------------------------------------------------------
/_tutorials/introduction/why-kotlin.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: tutorial
3 | title: "چرا کاتلین"
4 | category: introduction
5 | unit: 1
6 | chapter: 2
7 | ---
8 |
9 |
10 |
11 |
12 |
13 | ابتدا باید بگیم که پروژه کاتلین در سال 2010 توسط شرکت JetBrains شروع شد. در اون زمان نیاز به یک زبون احساس میشد که هم مختصر و هم پرمعنا باشه و هم ابزار های زیادی براش موجود باشه. و هم بتونه با زبون های دیگه ارتباط برقرار کنه و همکاری داشته باشه. خب همینطور که میدونید جاوا یک زبونیه که طرفدار زیادی داره و در عین حال مشکلاتی هم داره. مثلا کد ها مختصر نیستن و البته خیلی از ویژگی های زبان های برنامه نویسی مدرن رو شامل نشده چرا که ما به دنبال یک زبون برنامه نویسی مدرنی هستیم که بتونه مشکلات برنامه نویسی توسعه دهنده ها رو که هرروزه باهاش دست و پنجه نرم میکنن رو رفع کنه. پس شروع به توسعه کاتلین کردیم. همچنین کاتلین لایسنس Apache 2 رو داره. کاتلین یک statically typed language هست ( کلمه بهتری جایگزینش پیدا نکردم ) کاتلین از زبون های به مانند Java,Scala,C#,groovy الهام گرفته شده. کاتلین دو قسمت رو هدف قرار داده.یکی JVM و دیگری JS . کد کاتلینی که شما میزنین مستقیم توسط JVM قابل استفاده است و همچنین کدتون قابلیت تبدیل به JavaScript رو هم داره بدین معنی که شما میتونین هم قسمت سمت سرور و هم قسمت سمت مرورگر رو با کاتلین بنویسین.یکی از هدف های این زبون اینه که بتونیم توی سیستم عامل های مختلف اجراش کنیم والبته این شرکت بخش دیگه ای رو هم دارن روش کار میکنن به نام Kotlin/Native (خیلیا دوست دارن بهش بگن KotN ) که به ما این قابلیت رو میده تا کد کاتلینمون بتونه به طور Native برروی پلتفرم های مختلف کار کنه.به عنوان مثال iOS و یا macOS و حتی IoT و Embedded Systemها . همینطور که گفتیم این زبون این قابلیت رو داره که بتونه با جاوا همکاری کنه، این بدین معنیه که کد شما هم در کد جاوا قابل استفاده است و هم کد جاواتون داخل فایل کاتلین. به عبارت دیگه تموم لایبری هایی که برای زبون Java نوشته شده میتونه توی این زبون هم مورد استفاده قرار بگیره. این زبون از Build سیستم هایی مثل Gradle و Maven هم استفاده میکنه. همینطور که شاید خبر داشته باشین کاتلین رسما توسط شرکت گوگل برای برنامه نویسی اندروید قابل استفاده است و این خیلی خبر خوبی برای توسعه دهنده هاست چراکه میتونن با خیلی از ویژگی های Java 1.8 که نمیتونستن قبلا در اندروید استفاده کنند کار کنن. چون این زبون از زبون های دیگه ای به مانند Java و C# و … الهام گرفته شده، خیلی هم مثل همون زبون هاست. به این معنی که زمان یادگیری سینتکس رو کاهش میده و شما در طی چند روز متوجه میشین که زبون به شدت ساده ای هست. یکی از خوبیای این زبون اینه که نیازی نداریم که این همه کدی که دهه هاست در زبون جاوا زده شده رو دور بندازیم. البته که JNI هم در این زبون پشتیبانی میشه و پس ما میتونیم از توابع C و C++ استفاده کنیم.
14 |
--------------------------------------------------------------------------------
/_tutorials/introduction/working-with-abstract-classes-in-kotlin.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: tutorial
3 | title: "کارکردن با کلاس های abstract در کاتلین"
4 | category: introduction
5 | unit: 6
6 | chapter: 2
7 | ---
8 |
9 |
10 |
11 |
12 |
13 |
14 | اگر با مفهوم abstract اشنا باشید کلاسی مد نظرمون هست که نمیتونیم ازش نمونه ای رو بسازیم ولی میتونیم از اون ارثبری کنیم.
15 |
16 |
17 |
18 | ```kotlin
19 | abstract class StoredEntity
20 |
21 | class Employee: StoredEntity()
22 |
23 | fun main(args: Array) {
24 | val se = Employee()
25 | }
26 | ```
27 |
28 |
29 |
30 | خب حالا با خودتون میگین چه فایده ای داره که از کلاس های abstract استفاده کنیم؟ خب در واقع کلاس های abstract تفاوتی با کلاس های پایه ای دارند و اونم اینه که یک کلاس abstract میتونه هم مانند یک کلاس معمولی یک تابع/متغییر که مقدار دهی شده داشته باشه، و هم یک تابع abstract داشته باشه ک پیاده سازی نشده. مثلا فرض کنید که چندین کلاس داریم که یک سری کار انجام میدن ولی محتوای کارشون شبیه به هم با اندکی تفاوته، برای همین میایم یک کلاس abstract میسازیم و تابع abstract اون رو هم میسازیم ولی بدنه تابع رو توی هر کدوم از کلاس ها بسته به نوع کلاسمون میسازیم.مثال زیر رو نگاه کنین:
31 |
32 |
11 |
12 |
13 |
14 | در کاتلین در واقع همه چیز یک شی (object) است. خب به عنوان مثال اگر به یک Integer نگاه کنیم، مثلا کد زیر:
15 |
16 |
17 |
18 | ```kotlin
19 | var myInt : Int
20 | ```
21 |
22 |
23 |
24 | در واقع Int یک شی است. درواقع ما تایپ های متفاوتی برای یک مقدار های عددی داریم، Byte ، Long ، Float ، Double . همینطور که میبینید ما یک سری تایپ داخلی برای متغیر ها داریم.
25 |
26 | حالا اگه یادتون باشه گفتیم نیاز نیست توی کاتلین تایپ ها رو وقتی مقدار دهی کردیم بنویسیم
27 |
28 |
35 |
36 | یعنی مثلا توی بالا کاتلین باید متوجه بشه که منظورمون چیه، ولی این اتفاق نمیفته و اگر myLong رو نگاه کنیم متوجه خواهیم شد که این مقدار یک Int است! خب البته کاتلین راهی برای این قضیه داره، کافیه که ما عبارت بالا رو به صورت مقابل بنویسیم
37 |
38 |
45 |
46 | و حالا کاتلین متوجه میشه که شما Long میخواین.
47 |
48 | حالا اگه شما میخواین تایپ های دیگه رو معرفی کنید میتونید به این صورت بنویسین.
49 |
50 |
51 |
52 | ```kotlin
53 | val myLong = 10L
54 | val myFloat = 100F
55 | val myHex = 0x0F
56 | val myBinary = 0xb01
57 | ```
58 |
59 |
60 |
61 | توی کاتلین همونطور که گفتم نمیتونین همینجوری یک تایپ رو توی یک تایپ دیگه بریزین
62 |
63 |
64 |
65 | ```kotlin
66 | val myInt = 10
67 | val myLongAgain: Long = myInt
68 | ```
69 |
70 |
71 |
72 | شما نمیتونید اینجوری که بالا نوشتم بنویسین ولی راهی هست که بتونین مقدار یک Int رو توی Long بریزین. باید از توابع اون تایپ استفاده کنید یعنی خط بالا رو به این صورت بنویسین
73 |
74 |
75 |
76 | ```kotlin
77 | val myInt = 10
78 | val myLongAgain: Long = myInt.toLong()
79 | ```
80 |
81 |
82 | که درواقع اجازه میده یک مقدار رو تبدیل کنید به یک مقدار دیگه.
83 |
84 | حالا بیاین بریم سراغ رشته ها،قطعه کد زیر رو ببینیم
85 |
86 |
87 |
88 | ```kotlin
89 | val myChar = 'A'
90 | val myString = "My String"
91 | ```
92 |
93 |
94 |
95 | خب اگه دقت کنید کامپایلر با استفاده از " ‘ " متوجه میشه که این ایا کاراکتره یا ایا یک رشته است.
96 |
97 |
98 |
99 | ```kotlin
100 | val escapeCharacters = "A new Line \n"
101 | ```
102 |
103 |
104 |
105 | میتونید از کاراکتر های پایان دهنده استفاده کنید.
106 |
107 |
108 |
109 | ```kotlin
110 | val rawString = "Hello " +
111 | "This is second line" +
112 | "a third line"
113 |
114 | val multipleLine = """
115 | this is a string
116 | and this is another line
117 | """
118 | ```
119 |
120 |
121 |
122 | میتونید یک رشته رو در چند خط بنویسین.یک روش اینه که با استفاده از + در چند خط یک رشته رو بنویسید و یا این که با استفاده از 3 تا " " " بگین میخوایم یک رشته چند خطی بنویسیم. میتونید یک مقدار رو داخل یک رشته استفاده کنید.البته به دو روش که روش دوم خلاصه درس و کاتلینی تره.
123 |
124 |
125 |
126 | ```kotlin
127 | val years = 10
128 | val message = "A decade is " + years + " years"
129 | val anotherMessage = "A decade is $years years"
130 | ```
131 |
132 |
133 |
134 | اگر از همون روش دوم استفاده کردید و میخوایین از توابع داخلی اون متغییر استفاده کنید متونید این کار رو بکنید
135 |
136 |
137 |
138 | ```kotlin
139 | val name= "Mary"
140 | val anotherOne = "length of name is ${name.length}"
141 | ```
142 |
--------------------------------------------------------------------------------
/_tutorials/introduction/working-with-exceptions/result-1.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/working-with-exceptions/result-1.PNG
--------------------------------------------------------------------------------
/_tutorials/introduction/working-with-exceptions/result-2.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/working-with-exceptions/result-2.PNG
--------------------------------------------------------------------------------
/_tutorials/introduction/working-with-nulls-from-java.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: tutorial
3 | title: "کار کردن با null ها از جاوا"
4 | category: introduction
5 | unit: 10
6 | chapter: 3
7 | ---
8 |
9 |
10 |
11 |
12 |
13 |
14 | ```
15 | برای تمرین بهتر است از IntelliJ IDEA استفاده شود
16 | ```
17 |
18 | یکی از ویژگی های کاتلین Null-Safe بودن این زبونه و دیدیم که بصورت پیشفرض تایپ ها نمیتونن null باشن و اگر میخواین که یک متغیر رو null کنین باید بیان کنین که اون nullable هه ولی خب زمانی که نوبت به همکاری با Java میرسه قضیه فرق میکنه، چراکه همه چی میتونه توی جاوا null باشه. خب اینجا باید چیکار کنیم؟
19 |
20 | راستیتش قضیه خیلی سادست. به عبارتی برمیخوریم که ممکنه null باشه،خیلی ساده تنها از عملگر “?” استفاده میکنیم و تمام. یک مشکلی اینجا پیش میاد، مشکل که نه درواقع یک جور میشه گفت کدمون زشت میشه چرا که عبارتی خواهیم داشت که در اون به صورت تفریط از "?." استفاده شده، که این باعث میشه کدمون زشت بشه. برای حل این موضوع میتونیم از Annotation ها استفاده کنیم، بگیم که ما میدونیم که این عبارت ممکن نیست که null بشن و نیازی نداریم که از عملگری استفاده کنیم که این بازم مشکلات خودشو به وجود میاره. راه حل نهایی چیه ؟ درواقع زمانی که با جاوا کار میکنیم تصمیم نهایی با توسعه دهنده است که عبارت صدا زده شده این قابلیت رو داشته باشه که بتونه null باشه یا نه.
21 |
22 | بذارین با کد واضح تر براتون توضیح بدم. تا اینجا یادتون میاد که ما کلاسی به نام KotlinCustomRepo رو به صورت زیر ساختیم :
23 |
24 |
55 |
56 | و این درواقع دست توسعه دهنده است که به اون عبارت قابلیت داشتن null بده یا نه.
57 |
58 | بیاین بریم سراغ کلاس CustomerJava و دوتا متد به اون اضافه کنیم
59 |
60 |
73 |
74 | برای متد اول از یکی از Annotation های IntelliJ استفاده کردیم که مشخص میکنه این عبارت null برنمیگردونه. (میتونه از Annotation های دیگه هم استفاده بشه) ولی دقیقا تفاوت این توی کاتلین چیه؟ تفاوت اینجاست که وقتی در یک کلاس کاتلین میخوایم از این توابع استفاده کنیم، کاتلین متوجه میشه که متد اول نمیتونه null باشه و این درحالیه که متد دوم رو nullable تصور میکنه.
75 |
76 |
11 |
12 |
13 |
14 | یکی از ویژگیهای کاتلین همکاری مستقیم با فایل JavaScript هه.حالا ما چرا باید بخوایم که با جاوا اسکریپت همکاری کنیم؟ زمانی پیشخواهد اومد که ما بخوایم به صورت مستقیم با فایلهای جاوا اسکریپتیمون ارتباط برقرار کنیم، بخوایم مقدار متغیری رو بخونیم، بخوایم یک تابعی رو ازش صدا بزنیم یا این که اصلا بخوایم با یک کتابخونه که توی جاوااسکریپته استفاده کنیم. توی اینجاها خیلی مهمه که بتونیم مستقیم از فایلهای جاوااسکریپتیمون استفاده کنیم
15 |
16 | توی این قسمت میخواییم یکسری اشارههایی به بحث همکاری با جاوا اسکریپت بکنیم.
17 |
18 |
11 |
12 |
13 |
14 | این قسمت کوتاهه و مثل قسمت قبل طولانی نیست. توی این قسمت میخوایم همین کد قبلی رو بنویسیم منتهی به یک روش دیگه. کد زیر رو نگاه کنین:
15 |
16 |
42 |
43 |
44 | فکر نمیکنم نیاز زیادی به توضیح باشه، ولی اینجا همون کاری که دفعه قبل انجام دادیم رو به یک روش دیگه انجام میدیم. با استفاده مستقیم از خصیصه textContent مستقیما مقدار text رو بهش دادیم و بعدش هم با استفاده از تابع appendChild دوتا عنصر رو به div دادیم و در انتها هم اون div رو به root دادیم. همین.
45 |
46 | خب تا اینجا با دو روش آشنا شدیم که چجوری بتونیم از html داخل کدمون استفاده کنیم. توی قسمت بعد روش سومی رو میگم که از روش های قبلی باحالتر و استفاده ازش توی ide راحت تره.
47 |
48 |