آشنایی و شروع با Kotlin – قسمت یک

خب همان طور که توی مطلبی (آشنایی با kotlin – مقدمه) گفتم، کم کم داریم به همه گیر شدن زبان Kotlin در بین android کار ها نزدیک می شیم، تو این پست میخوام امید به خدا وارد مباحث جدی کوتلین بشیم و یه اپلیکیشن نیز در انتها با Kotlin و Android studio بالا بیاریم (اکثر منابعی که استفاده کردم از سایت خوب Medium هست).

الان وقته برنامه نویسی تابعی (Functional Programming) شده و زمانش رسیده که برنامه نویسان اندروید نیز به سمتش برند.

چند وقتی از پشتیبانی گوگل از کوتلین گذشته و برنامه نویسان نیز به خوبی به سمت کوتلین کوچ کردند، اما، وقتی که به سمت و سوی برنامه نویسی مدرن داریم میریم این مسئله خیلی مهمه که چرا این تغییر موضع مهمه و به طور گسترده نیز پذیرفته شده است؟

برنامه نویسی تابعی (Functional Programming) کلید این تغییر می باشد

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

 روش برنامه نویسی است که توابع مبتنی بر ریاضیات به عنوان Building Block محسوب می شوند و تمرکز بیشتر روی اینه که به چه چیزی (What) میخوایم برسیم نه اینکه چطور (how) میخوایم بهش دست یابیم.

داره میگه که برنامه نویسی تابعی (Functional Programming) با داده غیر قابل تغییر (immutable date) سر و کار دارد ، برای مثال،این روش برنامه نویسی مقدار (value) یک متغیر (Variable) را تغییر نمی دهد. تمام  چیزی که انجام می دهد میشه  دریافت ->محاسبه -> بازگشت (Receive->Compute->Return) بدون اینکه مقادیری که دریافت کرده را تغییر دهد که منجر به تاثیر جانبی (side effect) روی باقی مقادیر در هر جای دیگر شود.

پرهیز از تاثیر جانبی (Side Effect) جنبه ی بسیار مهمی از برنامه نویسی تابعی می باشد که فرآیند دیباگ گیری (Debugging) را تریلیون (1,000,000,000,000 = یک تریلیون ) بار آسان تر کرده است، بنابراین شما لازم نیست کل برنامه را برای پیدا کردن یه باگ که توسط یه تغییر مقدار متغیر به وجود آمده جستجو کنید.

در ادامه مثالی برای افزودن 2 به یه آرایه از اعداد رو می بینید:

روش دستوری (Imperative):

int[] nums=new int[]{1,2,3,4,5};
for(int i=0;i<nums.length;i++){
nums[i]=nums[i]+2;
}
return nums;

و روش تابعی (Functional) :

def addTwo(x):x+2
result=map([1,2,3,4,5],addTwo)

مثال روش تابعی بالا نیز چیزیه که تابع مرتبه بالاتر (Higher-Order Function) نامیده میشه، که تابع map یک تابع دیگه رو  (addTwo) به عنوان آرگومان گرفته.

مثال زیر نمونه ای از تابع مرتبه بالاتر (Higher-Order Function) هست که تابع لامبدا را به عنوان آرگومان ورودی گرفته (آشنایی با توابع لامبدا) :

 

تابع لامبدا تابعی است که شناسانده نمیشه، اما به سرعت یه عبارت (Expression) پاس (pass) می شود.

تابع مرتبه بالاتر:

max(strings, { a, b -> a.length < b.length })

تابع لامبدا:

b -> a.length < b.length

حال می فهمیم که برنامه نویسی تابعی کلید پرهیز از تاثیر جانبی و داده تغییر پذیر که در روش برنامه نویسی دستوری رایح است (mutable data) می باشد و همچنین در نوشتن کد مختصر کمک کرده و منجر به افزایش خوانایی کد می شود، این دلیلیه که یک قدم به جلو هست و در بیشتر زبان های برنامه نویسی مدرن در نظر گرفته شده است.

 

برنامه نویسی تابعی: منطقی، ساده، کارآمد و زیبا است.

 

با وجود داشتن چنین پارادایم، سوالاتی مطرح میشه که چرا هنوز در اندروید ساخته و استفاده نشده است، و برای فهم این قضیه باید در رابطه جاوا و اندروید عمیق بشیم.

 

چرا اندروید در Java 6  باقی مانده در صورتی که Java 8 به صورت تابعی ارائه شده است!؟

منبع : https://academy.realm.io

زمانی که Java 6 عرضه شد، دو سال طول کشید تا اندورید از اون پشتیبانی بکنه و متولد بشه (سال 2008)، اما این روند بهتر نشد و با وجود Java 7 در سال 2011 و Java 8 در سال 2014 که عرضه شدند، اقتباس اندروید هنوز به صورت تقسیم شده بود و نه کامل و Java 7  تنها برای Api 19 و بالا پشتیبانی میشد.

دلیل این که اندروید هیچ وقت به طور کامل از جاوا Java پشتیبانی نکرد: 

برای هر ارائه جدید از Java  (جاوا)، دستگاه ها (تلفن های هوشمند) نیاز به آپدیت شدن برای پذیرش ویژگی های جدید جاوا را دارند و این Bytecode های جدیدی را معرفی می کند، در نتیجه دستگاهی که به آخرین ورژن بروزرسانی نشه، نمی تواند از Bytcode های جدید بهره ببرد.

این دقیقا چیزیه که چرا اندروید هنوز در جاوا 6 در حال در جا زدن است. اما فرض کنید که اندروید از الان  بتونه در تمام دستگاه هایش تا دو سال آینده صد در صد از جاوا 8 پشتیبانی کند، چرا نباید برای جاوا  8 (که از برنامه نویسی تابعی پشتیبانی می کند) منتظر بمانیم؟ 

جواب درست به این صورت هست که:

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

در ادامه به تعدادی از این مشکلات اشاره شده است:

Null references

Raw types

Covariant arrays

Wildcards in generics

(موارد بالا نیاز به توضیح دارند که ان شاالله در آینده تکمیل خواهند شد)

اما بیاید به این بپردازیم که چرا هر کسی کوتلین Kotlin را ترجیه می دهد در صورتی که زبان هایی مانند Scala و Groovy در حال حاضر در گود رقابت هستند.

چرا Kotlin و چرا  Kotlin + Android !؟ 

در قسمت دوم این مطلب به این موضوع خواهم پرداخت…

لینک قسمت دوم: