hamed seify
hamed seify
خواندن ۵ دقیقه·۳ سال پیش

گریدل چه جوری جادو می کنه (معرفی گرووی)



توی مقاله قبلی در مورد اینکه گریدل چه ابزار مفید و کار راه بندازی هست صحبت کردیم و اینکه اگه نخواییم از این ابزار اتوماسیون فرآیند Build استفاده کنیم باید چه مصیبتی بکشیم تا بتونیم یه Build ساده بگیریم از پروژه. اگه مقاله قبلی رو نخوندین یا با گریدل به اندازه کافی آشنایی ندارین لطفا اول مقاله قبلی رو بخونید:

https://vrgl.ir/pyKOW




در ادامه می خواییم در مورد اینکه گریدل چه جوری فرآیند Build اتوماتیک رو انجام بده صحبت کنیم و زبون برنامه نویسی به اسم Groovy رو معرفی کنیم که به گریدل تو این کار کمک می کنه.

زبان برنامه نویس Groovy

زبان برنامه نویس Groovy منطبق با Java هست که ویژگی هایی مشابه پایتون هم داره. منطبق با جاوا یعنی اینکه از روی جاوا الگوبرداری شده و بعد از کامپایل به بایت کد های جاوا تبدیل میشه. البته گرووی هم کامپایلری هست و هم اینترپرتری اما تو اندروید استودیو کامپایل میشه. Groovy به عنوان یک زبان شی گرا شناخته میشه اما خواص فانکشنال هم داره.

توی اندروید استودیو از زبان گرووی برای نوشتن تسک های گریدل و فرآیندی که باید طی کنه تا از نرم افزار Build بگیره استفاده میشه.

آموزش مختصر گرووی:

خب ساده ترین کدی که واسه یادگیری هر زبون برنامه نویسی میشه نوشت کد نمایش Hello World! هست. پس یه تیکه کد اینجا بذاریم که Hello World! رو نمایش بده:

public class Demo { public static void main(String args[]) { System.out.println(&quotHello World&quot); } }

کد براتو آشنا نیست؟ بنظرتون اشتباهی کد رو تایپ کردم؟

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

مثلا کد بالا همون کاری رو می کنه که کد پایین می کنه:

println &quotHello World!&quot

بدون سمیکولون و بدون پرانتز حتی. به شیوه مشابه DSL کاتلین.

تعریف متغیر:

توی جاوا به این صورت هست که دیتا تایپ رو مشخص می کنیم و بعد اسم متغیر رو و بعد در صورت لزوم مقدار دهی اولیه. مثلا:

int age = 50; String name = &quotHamed&quot

و از طرفی جاوا به دیتا تایپ حساسه و نمی تونید مقدار استرینگ رو به متغیر با تایپ اینتیجر بدین در حالی که تو گرووی مشکلی پیش نمیاد. تعریف متغییر تو گرووی با استفاده از کلمه کلیدی def انجام میشه به شکل زیر:

def age = 12

توی نمونه کد بالا ما دیتا تایپ رو به صورت ضمنی مشخص نکردیم و مشکلی پیش نمیاد اگه یه مقدار با تایپ دیگه تو متغیر age بریزیم. مثلا:

def age =12 age = &quotsomething&quot

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

int age = 44 age = &quotsomething&quot

اینم متن ارورش:

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 = &quot&quot&quot It is a multiline text&quot&quot&quot

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

0.upto(4) {println &quot$it&quot} خروجی: 0 1 2 3 4

تو نمونه کد بالا ما یه حلقه تعریف کردیم با استفاده از متد upto که از 0 شروع می کنه و تا 4 رو چاپ می کنه. کار این متد اینه که از ایندکس مبدا شروع کنه و تا سقف یه بلاک کدی رو اجرا کنه، درست مثل حلقه for. یه روش دیگه استفاده از متد times هست که فقط تعداد دفعات رو می گیره و بلاک کد رو تکرار می کنه:

5.times{println &quot$it&quot}

تو کد بالا متد times به طور مشخص از ۰ شروع می کنه و به تعداد ۵ بار کد داخل بلاک رو اجرا می کنه.

متد های upto و times هر دو با استپ های یکی یکی جلو میرن. یعنی مثلا از ۰ تا ۱۰ رو یک واحد یک واحد افزایش میدن تا حلقه اجرا بشه. حالا اگه بخواییم قدم ها رو از یک واحد یک واحد تغییر بدیم باید از متد step استفاده کنیم. متد step سینتکس و عملکردی مشابه upto داره با این تفاوت که اندازه قدم هم به عنوان پارامتر سوم توش مشخص میشه:

0.step(7,2){println &quot$it&quot} خروجی: 0 2 4 6

توی کد بالا متد step شروع می کنه از ۰ تا ۷ رو با اندازه قدم ۲ پیمودن و براساس اون بلاک کد رو اجرا کردن.

Closures

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

Closure تیکه کدی هست که داخل بلاک نوشته میشه و به یه متغیر منتسب میشه تا با صدا زدن اون متغیر اجرا بشه. عملکردش مشابه متد ها هست اما کاری که می کنه در واقع همون کاری هست که لامبدا ها تو کاتلین می کنن. تیکه کد زیر رو ببینید:

def myClosure = { println &quotHello World!&quot } myClosure()

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

کلاژر ها می تونن پارامتر ورودی و مقدار بازگشتی هم داشته باشن. مثلا:

def adder = { a,b-> return (a+b) } println(adder(4,7)) خروجی: 11

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

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

شاید از این پست‌ها خوشتان بیاید