توی مقاله قبلی در مورد اینکه گریدل چه ابزار مفید و کار راه بندازی هست صحبت کردیم و اینکه اگه نخواییم از این ابزار اتوماسیون فرآیند Build استفاده کنیم باید چه مصیبتی بکشیم تا بتونیم یه Build ساده بگیریم از پروژه. اگه مقاله قبلی رو نخوندین یا با گریدل به اندازه کافی آشنایی ندارین لطفا اول مقاله قبلی رو بخونید:
در ادامه می خواییم در مورد اینکه گریدل چه جوری فرآیند Build اتوماتیک رو انجام بده صحبت کنیم و زبون برنامه نویسی به اسم Groovy رو معرفی کنیم که به گریدل تو این کار کمک می کنه.
زبان برنامه نویس Groovy منطبق با Java هست که ویژگی هایی مشابه پایتون هم داره. منطبق با جاوا یعنی اینکه از روی جاوا الگوبرداری شده و بعد از کامپایل به بایت کد های جاوا تبدیل میشه. البته گرووی هم کامپایلری هست و هم اینترپرتری اما تو اندروید استودیو کامپایل میشه. Groovy به عنوان یک زبان شی گرا شناخته میشه اما خواص فانکشنال هم داره.
توی اندروید استودیو از زبان گرووی برای نوشتن تسک های گریدل و فرآیندی که باید طی کنه تا از نرم افزار Build بگیره استفاده میشه.
خب ساده ترین کدی که واسه یادگیری هر زبون برنامه نویسی میشه نوشت کد نمایش Hello World! هست. پس یه تیکه کد اینجا بذاریم که Hello World! رو نمایش بده:
public class Demo { public static void main(String args[]) { System.out.println("Hello World"); } }
کد براتو آشنا نیست؟ بنظرتون اشتباهی کد رو تایپ کردم؟
نه همه چی درسته. این تیکه کد که از قضا کاملا شبیه کد جاوا هست تو زبون گرووی عبارت Hello World! رو نمایش میده. توی پست قبلی هم گفته بودم که زبون گرووی از جاوا اقتباس گرفته و شباهت بسیار زیادی بهش داره. اما نکته ای که هست اینه که زبون گرووی می تونه خیلی ساده تر هم نوشته بشه، بدون کلاس بدون حتی متد main.
مثلا کد بالا همون کاری رو می کنه که کد پایین می کنه:
println "Hello World!"
بدون سمیکولون و بدون پرانتز حتی. به شیوه مشابه DSL کاتلین.
تعریف متغیر:
توی جاوا به این صورت هست که دیتا تایپ رو مشخص می کنیم و بعد اسم متغیر رو و بعد در صورت لزوم مقدار دهی اولیه. مثلا:
int age = 50; String name = "Hamed"
و از طرفی جاوا به دیتا تایپ حساسه و نمی تونید مقدار استرینگ رو به متغیر با تایپ اینتیجر بدین در حالی که تو گرووی مشکلی پیش نمیاد. تعریف متغییر تو گرووی با استفاده از کلمه کلیدی def انجام میشه به شکل زیر:
def age = 12
توی نمونه کد بالا ما دیتا تایپ رو به صورت ضمنی مشخص نکردیم و مشکلی پیش نمیاد اگه یه مقدار با تایپ دیگه تو متغیر age بریزیم. مثلا:
def age =12 age = "something"
کد بالا بدون هیچ اروری اجرا میشه. اما حواستون باشه زمانی که به صورت ضمنی دیتا تایپ رو تعریف کرده باشید نمی تونید مقادیری از تایپ دیگه به متغیر بدید. مثلا کد پایین ارور تایپ کستینگ میده:
int age = 44 age = "something"
اینم متن ارورش:
104 Caught: org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'something' with class 'java.lang.String' to class 'int' org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'something' with class 'java.lang.String' to class 'int' at jdoodle.run(jdoodle.groovy:3) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) Command exited with non-zero status 1
می تونید استرینگ های چند خطی هم تعریف کنید با استفاده از سه تا دابل کوتیشن، مثل کد زیر:
def explain = """ It is a multiline text"""
تو گرووی مثل جاوا می تونید از اوپراتور های جمع و تفریق و بزرگتر کوچیکتر و تساوی و غیره استفاده کنید. دستور های حلقه و شرطی هم به همون صورت قابل استفاده هستن. امکان مضاعفی که دارید توی گرووی نسبت به جاوا تعریف حلقه ها به شیوه متفاوتی هست:
0.upto(4) {println "$it"} خروجی: 0 1 2 3 4
تو نمونه کد بالا ما یه حلقه تعریف کردیم با استفاده از متد upto که از 0 شروع می کنه و تا 4 رو چاپ می کنه. کار این متد اینه که از ایندکس مبدا شروع کنه و تا سقف یه بلاک کدی رو اجرا کنه، درست مثل حلقه for. یه روش دیگه استفاده از متد times هست که فقط تعداد دفعات رو می گیره و بلاک کد رو تکرار می کنه:
5.times{println "$it"}
تو کد بالا متد times به طور مشخص از ۰ شروع می کنه و به تعداد ۵ بار کد داخل بلاک رو اجرا می کنه.
متد های upto و times هر دو با استپ های یکی یکی جلو میرن. یعنی مثلا از ۰ تا ۱۰ رو یک واحد یک واحد افزایش میدن تا حلقه اجرا بشه. حالا اگه بخواییم قدم ها رو از یک واحد یک واحد تغییر بدیم باید از متد step استفاده کنیم. متد step سینتکس و عملکردی مشابه upto داره با این تفاوت که اندازه قدم هم به عنوان پارامتر سوم توش مشخص میشه:
0.step(7,2){println "$it"} خروجی: 0 2 4 6
توی کد بالا متد step شروع می کنه از ۰ تا ۷ رو با اندازه قدم ۲ پیمودن و براساس اون بلاک کد رو اجرا کردن.
خوب این قسمت از گرووی واسه ما دوولوپرای اندروید خیلی کاربردی میشه چون توی فایل های گریدل پروژتون نگاه کنید پر هست از کلاژر هایی که هر کدوم برای اجرای یه تسک تعریف شده. یادتون که هست توی مقاله قبلی گفتیم گریدل برای بیلد کردن نرم افزار میاد تسک تعریف می کنه و اون تسک ها رو براساس فرآیند بیلد کردنش اجرا می کنه.
Closure تیکه کدی هست که داخل بلاک نوشته میشه و به یه متغیر منتسب میشه تا با صدا زدن اون متغیر اجرا بشه. عملکردش مشابه متد ها هست اما کاری که می کنه در واقع همون کاری هست که لامبدا ها تو کاتلین می کنن. تیکه کد زیر رو ببینید:
def myClosure = { println "Hello World!" } myClosure()
یه بلاک کدی رو تعریف کردم و به یه متغیر منتسب کردم. حالا هر بار اون متغیر رو صدا بزنم اون بلاک کد هم اجرا میشه.
کلاژر ها می تونن پارامتر ورودی و مقدار بازگشتی هم داشته باشن. مثلا:
def adder = { a,b-> return (a+b) } println(adder(4,7)) خروجی: 11
تا اینجا یه معرفی خلاصه و کاربردی از گرووی کردیم که می خواییم تو مقاله بعدی با کمکش گریدل رو کمی بشکافیم و ببینیم چه جوری با این کد ها فرآیند بیلد کردن رو اتوماتیک می کنه.
امیدوارم این مطالب براتون کاربردی و مفید بوده باشه تا اینجا. لایک یادتون نره و اگه سوالی بود تو کامنتا برام بنویسین.