Groovy ile Kodlama

Groovy kurulumunun nasıl yapılacağına, örnek güzel özelliklerine ve maven proje yapısına göz attık. Åžimdi büyük bir projeye geliÅŸtirecek olursak kodlamanın nasıl yapılacağına bir bakalım. Öncelikle ÅŸunu belirtmek istiyorum Java’da olduÄŸu gibi Groovy’de kodlama standartları açıklanmış deÄŸil. Bu sebepten herkes alışık olduÄŸu ÅŸekilde kodlamaya devam ediyor. Yani Java tabanından gelenler Java kodlama standartlarını izlerken Ruby tabanından gelenler genelde Ruby kodlama standartlarını kabul ediyor. Java tabanlı olduÄŸum için  bu yazıda Java standartlarının haricindeki kısmı, bulunmayan ya da farklı yanları baz alarak Groovy ile nasıl kodlaması gerektiÄŸini, nasıl kodlanırsa daha Groovy bazlı geliÅŸtirme yapılacağını anlatacağım.. Burada asıl amaç bir standart oluÅŸturmak deÄŸil sizi alışık olduÄŸunuz “Yazılım Aksanı“dan kurtarıp Groovy’ye aÅŸinalığınızı arttırmaktır.

Öncelikle temel Java kodlama standartlarını kullanacağımızı belirteyim. YaniGroovy

  • Tüm metod, özellik ve deÄŸiÅŸken isimleri loweCamelCase
  • Tüm class, interface, enum isimleri UperCamelCase
  • Tüm sabitler (public static final), Enum özellikleri UPPER_UNDERSCORE

şekilde olacaktır. Ayrıntıları için lütfen Java kodlama standartlarına bakınız. Şimdi burada bulunmayan ya da kullanmanın Groovy için de hoş olmayacağı durumlara bakalım.

Parantezler ve Noktalı Virgüller

Süslü parantez kullanımı yine Groovy içerisinde devam etmektedir. Groovy tasarlanırken Pyhton örnek alınmış olmasına rağmen bu kısımda bir örnek alınmamıştır. Fakat metod çağırımlarında parantez zorunluluğu kalkmıştır. Aynı şekilde her satırda bir tane cümlecik bulunduracaksanız satır sonunda noktalı virgülde kullanmanıza gerek yoktur.

println "Hello"

method a, b

Def ve Type

Groovy içerisinde örneklerden de göreceÄŸiniz gibi ağırlıklı olarak def kullanılmaktadır. def sözcüğünü Java’daki Object sınıfı olarak düşünebilirsiniz. Fakat ben def sözcüğünün çok kullanılmasının kava karıştırıcı buluyorum. Bu sebepten bazı durumlarda def kullanılmalı bazı durumlarda doÄŸruda Type verilmeli diyorum.

  • Sınıfların özellikleri kullanılırken mutlaka Type verilmeli.

class FirstClass{
String title
String value
}

  • Fakat bir kod bloÄŸu içerisinde geçiçi bir deÄŸiÅŸken kullanılıyorsa def kullanılmalı.
  • Metod parametreleri için, eÄŸer parametre gerçekten Object sınıfı olması gerekmiyorsa, Type kullanılmalı.

class SecondClass{

int add(int first, int second) {
def result =  first + second
return result
}
}

Bu ÅŸekilde tanımlamalar kullanılarsa IDE’nizin kod tamamlama özelliÄŸinden daha fazla da yararlanabileceksiniz.

Operator

Groovy’de operator overloading yapabiliyorsunuz. Bunun için bu siteden hangi operatörü overload etmek için hangi metodu yeniden yazmanız gerektiÄŸini bulabilirsiniz. Ayrıca groovy’de Java’da olmayan bir çok operatorde bulunmaktadır. ÖrneÄŸin regex iÅŸlemleri için ayrı operatörler bulunmaktadır. Bunları ileride regex konusunda ayrıntılı olarak göreceÄŸiz.

Equals

Java’ya yeni baÅŸlayan çoÄŸu kiÅŸinin yaptığı hata String ya da herhangi baÅŸka bir nesneyi “==” operatörü ile kontrol etmektir. Java tarafında bu hem referans objeyi hemde deÄŸerini kontrol etmektedir. Bu sebepten hemen hemen tüm karşılaÅŸtırma iÅŸlemleri beklenen sonucu vermemektedir. Fakat groovy’de bu ayırım kaldırılmıştır istediÄŸiniz gibi kontrollerinizi yapabilirsiniz. Java’da “==” operatörü beklenildiÄŸi gibi çalışmadığı için genellikle “equals” metodu kullanılmaktadır. Yani iki nesnenin eÅŸitliÄŸini kontrol etmek için hem null kontrolü hemde equals kontrolünün yapılması gerekmektedir. Bu durumda groovy’de kaldırılmıştır.

Java’da


boolean result = (str != null && str.equals("Hello, World!"));

Groovy’de


def result = str == "Hellow, World"

Kod fazlalığını nasıl ortadan kaldırdığını ve okunuşu nasıl baistleştirdiğini görüyorsunuz.

Elvis

Java’da sık sık yapılan diÄŸer bir iÅŸlem ise atama sırasında yapılan null kontrolüdür.

Örneğin:


String newStr = (str != null) ? str : "Empty";

Bunun yerine Groovy’de Elvis operatörü bulunmaktadır.


def newStr = str ?: "Empty"

Alt Nesneler

Burada neyi kastettiÄŸimi daha iyi anlamak için şöyle bir örnek vereyim. Varsayalım ki bir tanem kullanıcı sınıfım var (User.java). Bu sınıfın bir özelliÄŸi adress bilgisi (Address.java) bu adres içerisinde ise cadde bilgisi bulunmakta (Address#getStreet). Buna eriÅŸmek için Java’da yapmanız gereken


User user = ....;

user.getAddress().getStreet();

Burada tabiki de user nesnemiz null olduÄŸunda ya da address nesnemiz null olduÄŸundan NullPointerException almamız çok normal. Üstüne üstlük bir de street nesnesini kullanmadan önce null kontrolü yapmamız gerekiyor. NullPointerException’dan kaçınmak için en basitinden yazmamız gereken kod aÅŸağıdaki gibi.


User user = ....;

if(user != null && user.getAddress() != null){

String street = user.getAddress().getStreet();

...

}

Bu durumda yine street nesnesinin null olma ihtimali var. Ama ÅŸimdilik onu es geçiyorum. Bunun groovy üzerindeki karşılığı “?.” operatörü. Yani;


def user = ...

def street = user?.address?.street

Burada yine street nesnemiz null olabilir. Fakat Elvis operatörü ile onuda kolaylıkla geçebileceğimizden dert etmiyorum.

String

Groovy’de java ile farklılık gösteren diÄŸer bir konu ise String’ler. String java’da bildiÄŸiniz alıştığınız String’ten biraz farklı. Zaten groovy ortamında String olarak deÄŸilde GString olarak adlandırılıyor. ÖrneÄŸin Groovy’de multiline string tanımlayabiliyorsunuz. Java’da olduÄŸu gibi “+” operatörüyle baÄŸlamanız gerekmiyor. Bu sebepten daha kullanışlı bir string yapısı oluyor.

Örneğin


def multiLineString = """ First line
second Line
third line"""

Ayrıca bulunduğunuz kod bloğu içerisinde tanımlı olan tüm değişkenleri, nesneleri ve nesne özelliklerini string içerisinde kullanmanız mümkün. Yine kullanıcı (User) örneğimizi kullanacak olursak


def user = ...

def str = "UserName: $user.name"

Regex

Daha önce operatörlerden bahsederken regex için ayrı operatörlerin olduğundan bahsetmiştik. Bu operatörler alt tarafta javanın regex sınıflarını (Pattern, Matcher) kullanmaktadır

  • ==~ Operatörü: String içerisinde verilen pattern’e uygun veri olup olmadığını kontrol eder.

def found = "test" ==~ "\\w+"
println found

  • =~ Operatörü: String içerisinde verilen pattern’e uygun verileri liste ÅŸeklinde döner. Matcher olarak kullanılabilir.

def matcher = "test" =~ "\\w+"
println matcher[0]

Son

Umarım az da olsa Groovy’ye olan aÅŸinalığınızı arttırabilmiÅŸ ve kullandığınız Yazılım Aksanınızdan sizi biraz uzaklaÅŸtırabilmiÅŸimdir.

End Of Line