mazdadoost
سه شنبه 11 تیر 1387, 14:31 عصر
سلام به جاوا به زبان Groovy:آشنایی با زبان برنامه نویسی Groovy
مقدمه:
از مدت ها پیش که برای جاوا به زبان جاوا کد می نوشتم , همیشه دوست داشتم کار ها کمی از اون چه که هست ساده تر بشه.مثلا کار با Generics ها!یا اینکه امکاناتی که در C و یا ++C مثل
تحریف عملکرد ها رو برای کلاس هام داشته باشم.
اما خوب از طرفی هم خوب که فکر میکردم متوجه میشدم پا گذاشتن چیز هایی که جاوا (برای عملی کردن فلسفش که مهمترینش سادگیشه ) در زبان هایی مثل ++C هست زبان رو پیچیده میکنه.و البته این فکر از مدت ها قبل در ذهن سازندگان جاوا بود!
پس باید چه کار کرد؟با اومدن زبان های اسکریپتی مثل PHP و Python و بعد ها زبان های اسکریپتی پویا یا دینامیک(دینامیک معنی گسترده ای داره به شکل خلاصه میشه گفت توانایی گسترش Syntax و یا پشتیبانی یه فناوری در سطح زبان نه API و یا Typing خودکار!)مثل Ruby نیاز به افزوده شدن امکانات جدید به دستور زبان جاوا هر روز بیشتر و بیشتر احساس می شد.مخصوصا اینکه رقیب Enterprise جاوا یعنی دات نت با پشتیبانی از یه دو جین زبان برنامه نویسی زنده و مرده برای برنامه نویسی پلت فرمش در برنامه نویس ها ایجاد کشش میکنه!
همونطور که گفتم اضافه کردن موارد جدید به جاوا مثل چیز هایی که در C یا ++C و یا Ruby ووو هست با فلسفه وجودی جاوا سازگار نیست.از طرفی هر چیزی در جاوا اول باید از صافی JCP -سان و در نهایت پیاده کننده گان تجاری و غیر تجاری SE-EE و ME بگذره و این بسیار زمانبره و البته نگرانی از عدم سازگاری هم در کد ها رو نباید فراموش کرد!
جواب جاوا به این تناقصات (ارایه امکانات جدید جالب و جذاب و ایجاد زبانی به غیر از جاوا برای برنامه نویسی پلت فرم جاوا در مقابل فلسفه و مدل پیشرفت و مقاومت هایی که در مقابل امکانات جدید هست) در (JCP (JSR 241 و به شکل استاندارد و مورد تائید سان Groovy بود!
در این پست سعی دارم دوستان علاقه مند به جاوا رو (که همشون رو با مهری پاک دوست دارم)
مقدمه ای بر این زبان جذاب و شروع کار با این زبان رو توضیح بدم.
امید وارم بتونم تجربیات دو ماهه خودم رو که البته به علت مشغله زیاد پر بار نیست رو در اختیار دوستان بذارم و فتح بابی برای ادامه این مسیر توسط دوستان دوستان کرده باشم.
Groovy چیست:
طبق شعار سایت رسمی (یعنی سازندگانش!):
An agile dynamic language for the Java Platformزبانی چابک(:لبخندساده:) و پویا برای برنامه نویسی پلت فرم جاوا!
خوب در عین اینکه این تعریف خلاصه ای هست اما نکات کلی رو برای تعریف Groovy داره!نکات کلیدی Aglie و Dynamic.
اول ببنیم Aglie در این تعریف چه منظوری داره:به نظرتون برای کار کردن با فناوری هایی مثل Database-XML-COM-Web Development وو در جاوا باید کد بیشتری نوشته بشه یا در زبان هایی مثل PHP-Ruby ؟ بله در جاوا باید کد بیشتری نوشته بشه .تست و توسعه برنامه های در سطح وب با جاوا نسبت تکنولوژی هایی مثل PHP و Ryby هم زمان توسعه بیشتری میطلبه و هم اینکه دیپلوی کردن زمانبر تری داره (و این زیاد با استاندار های متد Aglie برای توسعه برنامه ها هم خوان نیست!)چرا ؟چون :
1-در جاوا به علت دنبال کردن شی گرایی در نهایت حد خودش استفاده از فناوری ها در سطح API مقدوره و نه در زبان!مثلا برای کار با XML و یا Database شما باید با تعداد نسبتا زیادی از اشیاء بشه بین 4 تا 15 شی آشنا باشید و کار کنید!این یعنی تعداد خطوط بیشتر , احتمال خطای بیشتر توسط برنامه نویس و در نهایت تست و دیباگ زمانبر تر!در عوض در زبان های اسکریپتی مثل Ruby و یا PHP الا رغم داشتن امکانات شی گرایی میتونید با چند تا تابع و دستور(منظور Syntax خود زبانه) و در چند خط به شکلی سریع یه برنامه Database و یا XML و وب سرویس داشته باشید.متد های Aglie که الان خیلی در بین برنامه نویسانی با تیم های کوچکتر و بودجه کمتر فعالیت میکنند(مثلا پروزه های اپن سورس!) تمایل به روشی دارند که این زبان های اسکریپتی فراهم می کنند!
2-تایپینگ غیر خودکار در جاوا!شما باید هر شی رو خودتون بشناسید و به کامپایلر راهنمایی لازم رو بدین.همین موضوع رو با Generics ها تصور کنید که چقدر کد رو برای خوندن و درک و نوشتن سخت میکنه!زبان های اسکریپتی به شکل خودکار کار Typing رو به عهده میگیرند!(هر چند ممکنه ویژگی Type Safe بودن رو از دست بدند ولی خوب اصولا چنین ادعایی هم ندارند!).
خیلی خوب .حالا ببینیم Dynamic به چه چیز اشاره داره:
زبان های دینامیک توانایی توسعه برنامه رو در حین اجرا از طریق تغیر ساختار در اشیاء .Type ها و حتی منطق کاری برنامه دارند.در زبان های دینامیک شما این کار ها رو در حین کامپایل انجام میدین(البته همین الان هم امکاناتی مثل Reflection و Proxisدر API جاوا برای این کارها هست!اما جای بحث داره.).با این ویژه گی میتونید در حین اجرا حتی Contorl Folow هاتون رو هم در حین اجرا تغیر بدین و Control Folow خای جدید تری بسازید.
یه ویژه گی دیگه و بسیار مهم اینه که میتونید زبان رو طبق ادبیات مورد نیازتون گسترش بدین!مثلا فرض کنید می خواید کدی بنویسد که تاریخ تولدتون رو بده!میتوند دستوری مثل زیر رو بسازید:
Day.Of.My.BD
و کاری کنید که این دستورات حین اجرا هم ساخته شند!
خوب این یه نمونه کوچیکه!:لبخندساده:
در استفاده از زبان های دینامیک که به میزان زیادی از Runtime استفاده می کنند چند نکته قابل توجهه اما مهمترینشون سرعت اجرای برنامست!
همه ما میدونیم که زبان های کامپایلری از زبان های اینترپری سریعتریند.منتها دو مورد می تونه به ما توجیه مناسیی از سرعت مناسب زبان دینامیکی مثل Groovy بدند:
1-Groovy روی JVM اجرا میشه.این یعنی کد های شما در نهایت توسط کامپایلر Groovy به بایت کد های سازگار با JVM تبدیل میشه.و میتونن از Just In Time و سایر تکنیک های بهنیه سازی استفاده کنند.و میشه گفت مجموعه کامپایلر Groovy و JVM بهینه می تونند کد های شمار و در حد کد های سریع C اجرا کنند(در مقام مقایسه کد های C هم از اسمبلی و اسمبلی هم از باینری Op Code های CPU کند تر اجرا می شوند!:لبخندساده:).
2-اینکه سرعت پردازش CPU ها خیلی بالا رفته!این مسئله باعث شده تا زبان های اینترپرتری هم به خوبی یه زبان هیبرید مثل جاوا رشد کنند(PHP!)
حالا ببنیم Groovy چه امکانات اختصاصی داره و اینکه چرا Groovy؟
1-Groovy بر اساس JVM کار میکنه!این یعنی کل پلت فرم Java در دستان شماست!و البته استقلال از پلت فرم!
2-ویژه گی های جذاب زبان هایی مثل Python, RubyوSmalltalk!
3-فراهم کردن امکانات برنامه نویسی پیشرفته در زبان با منحنی آموزشی در حد صفر(این دیگه یه مقدار اغراق آمیزه!)
4-شی گرایی به زبانی تازه!اما آشنا!
5-ایجاد تسهیلات زیاد در زمینه پشتیبانی از کارهای متداول و مرسوم برنامه نویسی در زمینه XML-DataBase-GUI در سطح زبان!
6-امکان توسعه زبان بر اساس ادبیات زمینه برنامه نویسی!مثلا ایجاد زبانی برای هوش مصنوعی یا مهندسی ژنتیک که دقیقا از واژه های مرسوم در اون زمنه برای ساخت برنامه استفاده میکنه!
ووو
چند نمونه از کد های Groovy!که نشون میده چرا خوبه Groovy رو یاد بگیریم!:
الف)ساده تر و خوش فهم تر در نتیجه منحنی آموزشی کوتاهتر برای یه تازه کار .و کوتاهتر برای کسی که قبلا با جاوا کار کرده!
1-یه حلقه ساده در جاوا:
for(int i = 0; i < 10; i++)
{
//...
}
همون حلفه در Groovy:
10.times {
//...
}
میبیند چقدر به زبان ما شبیه!ده بار ...
ب)Groovi همون جاواست!
نگاه کنید :
2-کلاس های جاوا:
کد زیر نام کلاس ها رو چاپ میکنه(به کاربرد دستور println دقت کنید!خبری از زنجیره طولانی متد کال System.out.PrintLn نداره.یا Static Import های جاوا 5 و یاد گرفتنشون!)
println XmlParser.class
println XmlParser.class.superclass
نتیجه:
class groovy.util.XmlParser
class java.lang.Object
ج):دینامیک بودن و اینکه Typing درش اختیاریه!
مثلا برای توسعه کلاس String و اضافه کردن متدی برای معکوس کردن رشته ها:
String.metaClass.isPalindrome = {->
delegate == delegate.reverse()
}
word = 'tattarrattat'
println "$word is a palindrome? ${word.isPalindrome()}"
word = 'Groovy'
println "$word is a palindrome? ${word.isPalindrome()}"
نتیجه:
tattarrattat is a palindrome? true
Groovy is a palindrome? false
به کاربرد کلاس metaClass دقت کنید مثل Prototype های جاوا اسکریپت عمل کرده.یه -همون چیزی که با جاوا SE 7 شده-Closur هم برای ساخت بدنه متد استفاده شده و تمام!نیازی به نوشتنیه کلاس تازه و ارث بری از کلاس String نیست!ای وای کلاس String که Final تعریف شده!پس ما چطور ازش به ارث بردیم؟این همون دینامیک بودن Groovy رو نشون میده!گسترش زبان و شی گرایی و البته از بین بردن محدودیت های شی گرایی JDK استاندارد!
د)توسعه یافته JDK در دنیای Groovy اسمش میشه :GDK
مثلا استفاده از کلاس java.util.ArrayList در Groovy:
lst = ['Groovy' , 'is' , 'hip' ]
println lst.join(' ' )
println lst.getClass()
نتیجه:
Groovy is hip
class java.util.ArrayList
چند نمونه کد دیگه:فکر میکنم درکشون آسونهک
0.upto(2) { print "$it " }
نتیجه :
0 1 2
3.times { print "$it " }
نتیجه :
0 1 2
یه نمونه کد جاوا برای کار با کلاس java.lang.Process
//Java code
import java.io.*;
public class ExecuteProcess
{
public static void main(String[] args)
{
try
{
Process proc = Runtime.getRuntime().exec("svn help" );
BufferedReader result = new BufferedReader(
new InputStreamReader(proc.getInputStream()));
String line;
while((line = result.readLine()) != null)
{
System.out.println(line);
}
}
catch(IOException ex)
{
ex.printStackTrace();
}
}
}
همون کد با Groovy!
println "svn help".execute().text
نه import نه Exeption هندلینگ اجباری و از همه جالبتر استفاده اط یه رشته به عنوان شی!که با بستار ها ممکن شده!خلاصست نه!؟
Java beans در جاوا :
//Java code
public class Car
{
private int miles;
private int year;
public Car(int theYear) { year = theYear; }
public int getMiles() { return miles; }
public void setMiles(int theMiles) { miles = theMiles; }
public int getYear() { return year; }
public static void main(String[] args)
{
Car car = new Car(2008);
System.out.println("Year: " + car.getYear());
System.out.println("Miles: " + car.getMiles());
System.out.println("Setting miles" );
car.setMiles(25);
System.out.println("Miles: " + car.getMiles());
}
}
در Groovy:
class Car
{
def miles = 0
final year
Car(theYear)
{
year = theYear
}
}
Car car = new Car(2008)
println "Year: $car.year"
println "Miles: $car.miles"
println 'Setting miles'
car.miles = 25
println "Miles: $car.miles"
پارامتر های اختیاری در Groovy:
def log(x, base=10)
{
Math.log(x) / Math.log(base)
}
println log(1024)
println log(1024, 10)
println log(1024, 2)
پیاده سازی interface ها در جاوا:
button.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
JOptionPane.showMessageDialog(frame, "You clicked!" );
}
});
در Goovy:
button.addActionListener(
{ JOptionPane.showMessageDialog(frame, "You clicked!" ) } as ActionListener
)
تحریف عملگر ها:
class ComplexNumber
{
def real, imaginary
def plus(other)
{
new ComplexNumber(real: real + other.real,
imaginary: imaginary + other.imaginary)
}
String toString() { "$real ${imaginary > 0 ? '+' : ''} ${imaginary}i" }
}
c1 = new ComplexNumber(real: 1, imaginary: 2)
c2 = new ComplexNumber(real: 4, imaginary: 1)
println c1 + c2
نتیجه :
5 + 3i
کار با XML:
این کد XML رو در نظر بگیرید:
<languages>
<language name="C++">
<author>Stroustrup</author>
</language>
<language name="Java">
<author>Gosling</author>
</language>
<language name="Lisp">
<author>McCarthy</author>
</language>
<language name="Modula-2">
<author>Wirth</author>
</language>
<language name="Oberon-2">
<author>Wirth</author>
</language>
<language name="Pascal">
<author>Wirth</author>
</language>
</languages>
برای پردازش این XML در Groovy:
document = groovy.xml.DOMBuilder.parse(new FileReader('languages.xml' ))
rootElement = document.documentElement
use(groovy.xml.dom.DOMCategory)
{
println "Languages and authors"
languages = rootElement.language
languages.each { language ->
println "${language.'@name'} authored by ${language.author[0].text()}"
}
def languagesByAuthor = { authorName ->
languages.findAll { it.author[0].text() == authorName }.collect {
it.'@name' }.join(', ' )
}
println "Languages by Wirth:" + languagesByAuthor('Wirth' )
}
نتیجه:
Languages and authors
C++ authored by Stroustrup
Java authored by Gosling
Lisp authored by McCarthy
Modula-2 authored by Wirth
کار با دیتا بیس در Groovy:
def sql = groovy.sql.Sql.newInstance('jdbc:mysql://localhost:3306/weatherinfo' ,
userid, password, 'com.mysql.jdbc.Driver' )
println sql.connection.catalog
println "City Temperature"
sql.eachRow('SELECT * from weather' ) {
printf "%-20s%s\n" , it.city, it[1]
}
نتیجه:دیتا بیس در شش خط!با چاپ!
City Temperature
Austin 48
Baton Rouge 57
Jackson 50
Montgomery 53
Phoenix 67
Sacramento 66
Santa Fe 27
Tallahassee 59
فکر میکنم برای آشنایی با Groovy و بعضی ویژه گی های جالبش همین کافی باشه.
سعی می کنم در پست بعدی در همین تاپیک به عنوان قسمت دوم مباحث عملی و روش استفاده از ابزار های Groovy رو پوشش بدم.
امید وارم مفید بوده باشه و لذت برده باشید.
مشتاقانه منتظر انتقادات و نظراتتون هستم.
موفق باشید.
منابع :
سایت رسمی Groovy:
http://groovy.codehaus.org/
jcp:
http://www.jcp.org
(jsr 241
تالیف :مزدادوست.(پایان قسمت اول)
مقدمه:
از مدت ها پیش که برای جاوا به زبان جاوا کد می نوشتم , همیشه دوست داشتم کار ها کمی از اون چه که هست ساده تر بشه.مثلا کار با Generics ها!یا اینکه امکاناتی که در C و یا ++C مثل
تحریف عملکرد ها رو برای کلاس هام داشته باشم.
اما خوب از طرفی هم خوب که فکر میکردم متوجه میشدم پا گذاشتن چیز هایی که جاوا (برای عملی کردن فلسفش که مهمترینش سادگیشه ) در زبان هایی مثل ++C هست زبان رو پیچیده میکنه.و البته این فکر از مدت ها قبل در ذهن سازندگان جاوا بود!
پس باید چه کار کرد؟با اومدن زبان های اسکریپتی مثل PHP و Python و بعد ها زبان های اسکریپتی پویا یا دینامیک(دینامیک معنی گسترده ای داره به شکل خلاصه میشه گفت توانایی گسترش Syntax و یا پشتیبانی یه فناوری در سطح زبان نه API و یا Typing خودکار!)مثل Ruby نیاز به افزوده شدن امکانات جدید به دستور زبان جاوا هر روز بیشتر و بیشتر احساس می شد.مخصوصا اینکه رقیب Enterprise جاوا یعنی دات نت با پشتیبانی از یه دو جین زبان برنامه نویسی زنده و مرده برای برنامه نویسی پلت فرمش در برنامه نویس ها ایجاد کشش میکنه!
همونطور که گفتم اضافه کردن موارد جدید به جاوا مثل چیز هایی که در C یا ++C و یا Ruby ووو هست با فلسفه وجودی جاوا سازگار نیست.از طرفی هر چیزی در جاوا اول باید از صافی JCP -سان و در نهایت پیاده کننده گان تجاری و غیر تجاری SE-EE و ME بگذره و این بسیار زمانبره و البته نگرانی از عدم سازگاری هم در کد ها رو نباید فراموش کرد!
جواب جاوا به این تناقصات (ارایه امکانات جدید جالب و جذاب و ایجاد زبانی به غیر از جاوا برای برنامه نویسی پلت فرم جاوا در مقابل فلسفه و مدل پیشرفت و مقاومت هایی که در مقابل امکانات جدید هست) در (JCP (JSR 241 و به شکل استاندارد و مورد تائید سان Groovy بود!
در این پست سعی دارم دوستان علاقه مند به جاوا رو (که همشون رو با مهری پاک دوست دارم)
مقدمه ای بر این زبان جذاب و شروع کار با این زبان رو توضیح بدم.
امید وارم بتونم تجربیات دو ماهه خودم رو که البته به علت مشغله زیاد پر بار نیست رو در اختیار دوستان بذارم و فتح بابی برای ادامه این مسیر توسط دوستان دوستان کرده باشم.
Groovy چیست:
طبق شعار سایت رسمی (یعنی سازندگانش!):
An agile dynamic language for the Java Platformزبانی چابک(:لبخندساده:) و پویا برای برنامه نویسی پلت فرم جاوا!
خوب در عین اینکه این تعریف خلاصه ای هست اما نکات کلی رو برای تعریف Groovy داره!نکات کلیدی Aglie و Dynamic.
اول ببنیم Aglie در این تعریف چه منظوری داره:به نظرتون برای کار کردن با فناوری هایی مثل Database-XML-COM-Web Development وو در جاوا باید کد بیشتری نوشته بشه یا در زبان هایی مثل PHP-Ruby ؟ بله در جاوا باید کد بیشتری نوشته بشه .تست و توسعه برنامه های در سطح وب با جاوا نسبت تکنولوژی هایی مثل PHP و Ryby هم زمان توسعه بیشتری میطلبه و هم اینکه دیپلوی کردن زمانبر تری داره (و این زیاد با استاندار های متد Aglie برای توسعه برنامه ها هم خوان نیست!)چرا ؟چون :
1-در جاوا به علت دنبال کردن شی گرایی در نهایت حد خودش استفاده از فناوری ها در سطح API مقدوره و نه در زبان!مثلا برای کار با XML و یا Database شما باید با تعداد نسبتا زیادی از اشیاء بشه بین 4 تا 15 شی آشنا باشید و کار کنید!این یعنی تعداد خطوط بیشتر , احتمال خطای بیشتر توسط برنامه نویس و در نهایت تست و دیباگ زمانبر تر!در عوض در زبان های اسکریپتی مثل Ruby و یا PHP الا رغم داشتن امکانات شی گرایی میتونید با چند تا تابع و دستور(منظور Syntax خود زبانه) و در چند خط به شکلی سریع یه برنامه Database و یا XML و وب سرویس داشته باشید.متد های Aglie که الان خیلی در بین برنامه نویسانی با تیم های کوچکتر و بودجه کمتر فعالیت میکنند(مثلا پروزه های اپن سورس!) تمایل به روشی دارند که این زبان های اسکریپتی فراهم می کنند!
2-تایپینگ غیر خودکار در جاوا!شما باید هر شی رو خودتون بشناسید و به کامپایلر راهنمایی لازم رو بدین.همین موضوع رو با Generics ها تصور کنید که چقدر کد رو برای خوندن و درک و نوشتن سخت میکنه!زبان های اسکریپتی به شکل خودکار کار Typing رو به عهده میگیرند!(هر چند ممکنه ویژگی Type Safe بودن رو از دست بدند ولی خوب اصولا چنین ادعایی هم ندارند!).
خیلی خوب .حالا ببینیم Dynamic به چه چیز اشاره داره:
زبان های دینامیک توانایی توسعه برنامه رو در حین اجرا از طریق تغیر ساختار در اشیاء .Type ها و حتی منطق کاری برنامه دارند.در زبان های دینامیک شما این کار ها رو در حین کامپایل انجام میدین(البته همین الان هم امکاناتی مثل Reflection و Proxisدر API جاوا برای این کارها هست!اما جای بحث داره.).با این ویژه گی میتونید در حین اجرا حتی Contorl Folow هاتون رو هم در حین اجرا تغیر بدین و Control Folow خای جدید تری بسازید.
یه ویژه گی دیگه و بسیار مهم اینه که میتونید زبان رو طبق ادبیات مورد نیازتون گسترش بدین!مثلا فرض کنید می خواید کدی بنویسد که تاریخ تولدتون رو بده!میتوند دستوری مثل زیر رو بسازید:
Day.Of.My.BD
و کاری کنید که این دستورات حین اجرا هم ساخته شند!
خوب این یه نمونه کوچیکه!:لبخندساده:
در استفاده از زبان های دینامیک که به میزان زیادی از Runtime استفاده می کنند چند نکته قابل توجهه اما مهمترینشون سرعت اجرای برنامست!
همه ما میدونیم که زبان های کامپایلری از زبان های اینترپری سریعتریند.منتها دو مورد می تونه به ما توجیه مناسیی از سرعت مناسب زبان دینامیکی مثل Groovy بدند:
1-Groovy روی JVM اجرا میشه.این یعنی کد های شما در نهایت توسط کامپایلر Groovy به بایت کد های سازگار با JVM تبدیل میشه.و میتونن از Just In Time و سایر تکنیک های بهنیه سازی استفاده کنند.و میشه گفت مجموعه کامپایلر Groovy و JVM بهینه می تونند کد های شمار و در حد کد های سریع C اجرا کنند(در مقام مقایسه کد های C هم از اسمبلی و اسمبلی هم از باینری Op Code های CPU کند تر اجرا می شوند!:لبخندساده:).
2-اینکه سرعت پردازش CPU ها خیلی بالا رفته!این مسئله باعث شده تا زبان های اینترپرتری هم به خوبی یه زبان هیبرید مثل جاوا رشد کنند(PHP!)
حالا ببنیم Groovy چه امکانات اختصاصی داره و اینکه چرا Groovy؟
1-Groovy بر اساس JVM کار میکنه!این یعنی کل پلت فرم Java در دستان شماست!و البته استقلال از پلت فرم!
2-ویژه گی های جذاب زبان هایی مثل Python, RubyوSmalltalk!
3-فراهم کردن امکانات برنامه نویسی پیشرفته در زبان با منحنی آموزشی در حد صفر(این دیگه یه مقدار اغراق آمیزه!)
4-شی گرایی به زبانی تازه!اما آشنا!
5-ایجاد تسهیلات زیاد در زمینه پشتیبانی از کارهای متداول و مرسوم برنامه نویسی در زمینه XML-DataBase-GUI در سطح زبان!
6-امکان توسعه زبان بر اساس ادبیات زمینه برنامه نویسی!مثلا ایجاد زبانی برای هوش مصنوعی یا مهندسی ژنتیک که دقیقا از واژه های مرسوم در اون زمنه برای ساخت برنامه استفاده میکنه!
ووو
چند نمونه از کد های Groovy!که نشون میده چرا خوبه Groovy رو یاد بگیریم!:
الف)ساده تر و خوش فهم تر در نتیجه منحنی آموزشی کوتاهتر برای یه تازه کار .و کوتاهتر برای کسی که قبلا با جاوا کار کرده!
1-یه حلقه ساده در جاوا:
for(int i = 0; i < 10; i++)
{
//...
}
همون حلفه در Groovy:
10.times {
//...
}
میبیند چقدر به زبان ما شبیه!ده بار ...
ب)Groovi همون جاواست!
نگاه کنید :
2-کلاس های جاوا:
کد زیر نام کلاس ها رو چاپ میکنه(به کاربرد دستور println دقت کنید!خبری از زنجیره طولانی متد کال System.out.PrintLn نداره.یا Static Import های جاوا 5 و یاد گرفتنشون!)
println XmlParser.class
println XmlParser.class.superclass
نتیجه:
class groovy.util.XmlParser
class java.lang.Object
ج):دینامیک بودن و اینکه Typing درش اختیاریه!
مثلا برای توسعه کلاس String و اضافه کردن متدی برای معکوس کردن رشته ها:
String.metaClass.isPalindrome = {->
delegate == delegate.reverse()
}
word = 'tattarrattat'
println "$word is a palindrome? ${word.isPalindrome()}"
word = 'Groovy'
println "$word is a palindrome? ${word.isPalindrome()}"
نتیجه:
tattarrattat is a palindrome? true
Groovy is a palindrome? false
به کاربرد کلاس metaClass دقت کنید مثل Prototype های جاوا اسکریپت عمل کرده.یه -همون چیزی که با جاوا SE 7 شده-Closur هم برای ساخت بدنه متد استفاده شده و تمام!نیازی به نوشتنیه کلاس تازه و ارث بری از کلاس String نیست!ای وای کلاس String که Final تعریف شده!پس ما چطور ازش به ارث بردیم؟این همون دینامیک بودن Groovy رو نشون میده!گسترش زبان و شی گرایی و البته از بین بردن محدودیت های شی گرایی JDK استاندارد!
د)توسعه یافته JDK در دنیای Groovy اسمش میشه :GDK
مثلا استفاده از کلاس java.util.ArrayList در Groovy:
lst = ['Groovy' , 'is' , 'hip' ]
println lst.join(' ' )
println lst.getClass()
نتیجه:
Groovy is hip
class java.util.ArrayList
چند نمونه کد دیگه:فکر میکنم درکشون آسونهک
0.upto(2) { print "$it " }
نتیجه :
0 1 2
3.times { print "$it " }
نتیجه :
0 1 2
یه نمونه کد جاوا برای کار با کلاس java.lang.Process
//Java code
import java.io.*;
public class ExecuteProcess
{
public static void main(String[] args)
{
try
{
Process proc = Runtime.getRuntime().exec("svn help" );
BufferedReader result = new BufferedReader(
new InputStreamReader(proc.getInputStream()));
String line;
while((line = result.readLine()) != null)
{
System.out.println(line);
}
}
catch(IOException ex)
{
ex.printStackTrace();
}
}
}
همون کد با Groovy!
println "svn help".execute().text
نه import نه Exeption هندلینگ اجباری و از همه جالبتر استفاده اط یه رشته به عنوان شی!که با بستار ها ممکن شده!خلاصست نه!؟
Java beans در جاوا :
//Java code
public class Car
{
private int miles;
private int year;
public Car(int theYear) { year = theYear; }
public int getMiles() { return miles; }
public void setMiles(int theMiles) { miles = theMiles; }
public int getYear() { return year; }
public static void main(String[] args)
{
Car car = new Car(2008);
System.out.println("Year: " + car.getYear());
System.out.println("Miles: " + car.getMiles());
System.out.println("Setting miles" );
car.setMiles(25);
System.out.println("Miles: " + car.getMiles());
}
}
در Groovy:
class Car
{
def miles = 0
final year
Car(theYear)
{
year = theYear
}
}
Car car = new Car(2008)
println "Year: $car.year"
println "Miles: $car.miles"
println 'Setting miles'
car.miles = 25
println "Miles: $car.miles"
پارامتر های اختیاری در Groovy:
def log(x, base=10)
{
Math.log(x) / Math.log(base)
}
println log(1024)
println log(1024, 10)
println log(1024, 2)
پیاده سازی interface ها در جاوا:
button.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
JOptionPane.showMessageDialog(frame, "You clicked!" );
}
});
در Goovy:
button.addActionListener(
{ JOptionPane.showMessageDialog(frame, "You clicked!" ) } as ActionListener
)
تحریف عملگر ها:
class ComplexNumber
{
def real, imaginary
def plus(other)
{
new ComplexNumber(real: real + other.real,
imaginary: imaginary + other.imaginary)
}
String toString() { "$real ${imaginary > 0 ? '+' : ''} ${imaginary}i" }
}
c1 = new ComplexNumber(real: 1, imaginary: 2)
c2 = new ComplexNumber(real: 4, imaginary: 1)
println c1 + c2
نتیجه :
5 + 3i
کار با XML:
این کد XML رو در نظر بگیرید:
<languages>
<language name="C++">
<author>Stroustrup</author>
</language>
<language name="Java">
<author>Gosling</author>
</language>
<language name="Lisp">
<author>McCarthy</author>
</language>
<language name="Modula-2">
<author>Wirth</author>
</language>
<language name="Oberon-2">
<author>Wirth</author>
</language>
<language name="Pascal">
<author>Wirth</author>
</language>
</languages>
برای پردازش این XML در Groovy:
document = groovy.xml.DOMBuilder.parse(new FileReader('languages.xml' ))
rootElement = document.documentElement
use(groovy.xml.dom.DOMCategory)
{
println "Languages and authors"
languages = rootElement.language
languages.each { language ->
println "${language.'@name'} authored by ${language.author[0].text()}"
}
def languagesByAuthor = { authorName ->
languages.findAll { it.author[0].text() == authorName }.collect {
it.'@name' }.join(', ' )
}
println "Languages by Wirth:" + languagesByAuthor('Wirth' )
}
نتیجه:
Languages and authors
C++ authored by Stroustrup
Java authored by Gosling
Lisp authored by McCarthy
Modula-2 authored by Wirth
کار با دیتا بیس در Groovy:
def sql = groovy.sql.Sql.newInstance('jdbc:mysql://localhost:3306/weatherinfo' ,
userid, password, 'com.mysql.jdbc.Driver' )
println sql.connection.catalog
println "City Temperature"
sql.eachRow('SELECT * from weather' ) {
printf "%-20s%s\n" , it.city, it[1]
}
نتیجه:دیتا بیس در شش خط!با چاپ!
City Temperature
Austin 48
Baton Rouge 57
Jackson 50
Montgomery 53
Phoenix 67
Sacramento 66
Santa Fe 27
Tallahassee 59
فکر میکنم برای آشنایی با Groovy و بعضی ویژه گی های جالبش همین کافی باشه.
سعی می کنم در پست بعدی در همین تاپیک به عنوان قسمت دوم مباحث عملی و روش استفاده از ابزار های Groovy رو پوشش بدم.
امید وارم مفید بوده باشه و لذت برده باشید.
مشتاقانه منتظر انتقادات و نظراتتون هستم.
موفق باشید.
منابع :
سایت رسمی Groovy:
http://groovy.codehaus.org/
jcp:
http://www.jcp.org
(jsr 241
تالیف :مزدادوست.(پایان قسمت اول)