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