Java By Comparison — Karşılaştırmalı Java — 1

Nisan 2018'de ortaya çıkan ve içinde basitten zora doğru bolca pratik örnekleri barındıran Java By Comparison kitabından bahsetmeye çalışacağım size. Kitabın kodları Java ile verilmesine rağmen başka diller üzerinde çalışan arkadaşlar da çok rahatlıkla kitabı takip edebilirler.

Kitap şu şekilde ilerlemiş; önce okunurluğu ve anlaşılması yanlış veya daha az olan örnek sunulmuş, daha sonra bunu nasıl daha temiz ve anlaşılır yapabiliriz, ondan bahsedilmiş. Biz de aynı yöntemi takip edeceğiz.

Kitabın kopyasını almak isteyenler, şuralardan bulabilirler.

https://pragprog.com/book/javacomp/java-by-comparison

https://www.amazon.com/Java-Comparison-Become-Craftsman-Examples/dp/1680502875/ref=sr_1_1

1. Gereksiz Karşılaştırmalardan Sakın

Öncelikle ilk örneğimizin daha az okunur haline bakalım. Neler bulacaksınız?

Integer(tamsayı) değerlerin karşılaştırılmasından alışık olduğumuz yöntemi bazen Boolean değerler için de uygulayabiliriz ama bu karşılaştırmalar tamamen gereksizdir.

Boolean değerler (true veya false) karşılaştırmalarda açıkça kullanılmıştır, bu genelde başlangıç seviyesindekilerin yaptığı bir anti-paterndir. Bu kodun anlaşılmasını zorlaştırır.

Bu tür ifadelerden kurtulmak gerekir. Büyüklük olarak daha az olan ve daha anlaşılır kod ortaya çıkar.

Daha temiz haline bakacak olursak,

laboratory.isHumanoid(sample) ifadesi false olduğu için değil(!) eklemek zorunda kaldık, onun haricinde kodda değişiklik olmadı.

Herhangi bir derleyici zaten kendi içinde bu iyileştirmeleri yapar. Kodun çalıştırılma süresi bakımından da pek değişiklik olmayacaktır. Buradaki faydamız kodun okunabilirliğidir. Büyük bir kod tabanında çalışıyorsanız, bu ufak iyileştirmeler hayati olacaktır.

2. Olumsuzluktan Sakın

İkinci örneğimizde gözünüze neler çarpacak?

“Olumlu düşün” lafını duymuşsunuzdur. Pozitif ifadeler, negatif olanlara göre kod içinde hem daha az yer kaplar hem de daha anlaşılır olur.

Açıkça kodda bir hata yok, yapması gerekeni yapar ama olumsuzluktan kaynaklı gereksiz bir karmaşıklığı bulunuyor.

if koşullu ifadelerini düşünelim, iki ifadede de olumsuz şartlar bulunuyor. İlk ifade isInorganic() ile metod isminden kaynaklı bir olumsuzluk var, ikinci ifade de ise direk değil(!) işaretinden kaynaklı bir olumsuzluk var.

Olumlu ifadeleri anlamak kod içinde daha kolaydır. Olumsuz ifadeler ekstra bir katman daha ekler. Bunlar ufak değişiklikler gibi gözükebilir ama daha büyük bir kapsamda önemli sonuçlar doğururlar.

Kodumuzun daha pozitif haline bakalım.

Kodu biraz değiştirmiş olduk. İlk ifadede isInorganic() kontrolünü isOrganic() haline getirdik. Böylece ifadeyi olumlu mânaya çekmiş olduk. if ve else ifadelerinin gövdesini değiştirdik.

İkinci ifadede ise, değil(!) ifadesini kaldırmak için yine if ve else gövdelerini değiştirmemiz gerekti.

Yaptığımız değişiklikler ufak olmasına rağmen, kodun anlaşılmasında çok mesafe katettik.

Bazen üçüncü-parti kütüphane kullanıyorsak, çağırdığımız metodun ismini değiştirmemiz mümkün olmaz. Ama kod bizde ise, bunu çekinmeden yapmalıyız. Bu düzeltmeler uzun vadede işimizi oldukça kolaylaştırır. Bütün olumsuzluklardan tamamen kurtulmak her zaman en iyisidir.

3. Boolean İfadelerini Direk Dönün

Üçüncü örneğimize göz atalım şimdi de.

Bu kod örneğimizde validasyon sağlayan tipik bir metod görüyoruz. Metod bazı Integer ve String alanlarını kontrol ediyor.

Integer değişkeni, görev sayısını kontrol ediyor ve negatif olmayan bir değer.

String değişkeni ise null ve boş olmayan bir değer olması gerekiyor.

Fonksiyonel bir hata yok aslında bu kodda. Problem, kod gereğinden fazla karmaşık ve az okunur olmasıdır. Daha açık bir şekilde söylersek, if koşullu ifadesi tamamen gereksiz olmuş.

Bu metodu nasıl daha güzel hale getirebiliriz.

Bu değişiklik, bir seviye hizalama ve dallanmayı azaltmış oldu. Kodun okunması da daha kolay oldu.

Beş satırlık kodları bir satırlık hale getirdik. Burada, Boolean aritmetiğden faydalanmış olduk. De Morgan kanunundan yararlandık.

De Morgan Kanunu kısaca şöyle der:

Bazı zamanlarda, koşullar bu örnekten daha karmaşık olabilir. Bu durumlarda, kodunuzu ufak parçalara bölmek mantıklı olur. Ufak parçalara bölüp bunlara anlamlı isimler vermek, kodun anlaşılırlığı artırır.

Bu tür basitleştirmeleri, ikiden fazla kontrol olan durumlarda yapmak iyi bir alışkanlıktır. Ayrıca, else olan durumlar var ise, bunları ayrı metodlara bölmek gerekir.

4. Boolean İfadelerini Basitleştirin

Dördüncü örneğimize göz atalım.

Birçok şartı barındıran Boolean ifadeler, genelde anlaşılması zordur ve kolaylıkla yanlış yapılabilir. Bazı küçük numaralarla bunlar daha kolay hale getirilebilir.

Bir önceki örneğimizden daha karmaşık bir ifade. Bunu değiştirmek istesek bile anlamak biraz zaman alacak gibi.

Bu tür ifadeleri belirli bir mantıkla gruplamak gerekiyor. Metod içinde, belirli bir seviye soyutlama ile birleştirmemiz gerekiyor. İdeal olarak, yüksek seviye metod düşük seviye olanları çağırması gerekiyor.

Bunları şu şekilde gruplayabiliriz.

Kodumuzda çok değişiklik oldu. willCrewSurvive() metodu hala mevcut ama ekstradan yeni metodlar geldi.

Kontrollerimizi ayrı metodlara böldük ve bunlara anlamlı isimler verdik. Bunların dönüş değişkenine de hasEnoughResources gibi anlamlı bir isim verdik.

Şimdi daha fazla kod satırımız olmasına rağmen, daha anlaşılır bir yapı kurmuş olduk. Gruplama sayesinde, adım adım kodun anlaşılması daha kolay oldu. Değişkenlerin ve metodların isimleri niyetimizi artık daha açık şekilde ifade ediyor. Her metod, kendi kapsamı içinde daha basit hale geldi.


İlk dört başlığımızı bitirmiş olduk. Şimdilik basit kaçmış olabilir ama konular ilerledikçe karmaşıklık da artıyor. Zaman buldukça devamını getirmeye çalışacağım.

Arkamızdan kulaklarımızın çınlanmayacağı, temiz kodlar yazmamız dileğiyle. Sağlıcakla kalın.

Devamını okumak için…