İç İçe IF (nested if condition) Durumundan Kaçınmak
Halihazırda çalışan, sizden istenileni yapan bir kodunuz var, fakat içinize sinmeyen bir şeyler mi var? O vakit kodunuzu gözden geçirmenizde fayda var. Çünkü okunaksız ve hızlı yazılmış bir kodu gelecek nesillere bırakamazsınız :) Bu aşamada devreye kod düzenleme (refactoring) girer. Kod düzenleme, kodun çalışma amacını değiştirmeden (kod her ne yapıyorduysa değişiklikten sonra da onu yapmaya devam etmeli) iç yapısında iyileştirmeye gitmektir ve yazılımcının olmazsa olmazlarından birisidir.
Bildiğiniz üzere bir problemin birden fazla çözümü olabiliyor ve bu çözümlerin kimisi diğerlerine nazaran daha optimum sonuçlar verebiliyor. Kodunuzu gözden geçirirken de en optimum sonucu elde etmeye odaklanrsanız daha başarılı olursunuz.
Bu yazımda refactoring konusuna hafiften giriş yapmak ve okuması zor if yapılarını nasıl daha okunaklı hale çevirebileceğimizden bahsetmek istiyorum.
Daha önce üzerinde çalıştığım bir projeden esinlenerek örnek bir 'arrow code' paylaşmak istiyorum. Senaryoya göre şirketimiz müşterilerine toplu SMS gönderim imkanı sunmakta ve müşterilerine sms metnini kaydetme-düzenlemelerine olanak sağlamaktadır.
[java]<br />
public void updateTemplateText(Integer userId, String newText)<br />
{<br />
User user = getUserById(userId);//Verilen id&amp;amp;#39;ye karşılık kullanıcı nesnesini d&amp;amp;ouml;nd&amp;amp;uuml;relim.<br />
if(user != null)<br />
{<br />
Template template = user.getTemplate();//Kullanıcımıza ait SMS şablonunu d&amp;amp;ouml;nd&amp;amp;uuml;relim.<br />
if(template != null)<br />
{<br />
Boolean control = validateTemplateText(newText);//Yeni şablon metninin kriterlerimize uyup uymadığını kontrol edelim.<br />
if(control == true)<br />
{<br />
template.setTemplateText(newText)<br />
saveObject(template)<br />
}<br />
}<br />
}<br />
}<br />
[/java]
Örnek metodumuz id'si verilen müşterinin sms şablonunun düzenlemesini sağlıyor. Fakat gördüğünüz gibi iç içe yazılmış if kontrolleri kodumuzu okunaksız hale getiriyor. Ayrıca 'Exception Handling'den iz bile yok.Aslında birkaç else koşulu ekleyerek null durumlarını kontrol edebilirdik fakat daha büyük bir 'ok' yapmaya gönlüm razı olmadı :)
[java]<br />
User user = getUserById(userId);//Verilen id&amp;amp;#39;ye karşılık kullanıcı nesnesini d&amp;amp;ouml;nd&amp;amp;uuml;relim.<br />
if(user=!= null){<br />
//Hatamızı kaydedelim veya ekrana yazdıralım.<br />
return<br />
}<br />
[/java]
[java]<br />
Template template = user.getTemplate();//Kullanıcımıza ait SMS şablonunu d&amp;amp;ouml;nd&amp;amp;uuml;relim.<br />
if(template == null){<br />
//Hatamızı kaydedelim veya ekrana yazdıralım.<br />
return<br />
}<br />
[/java]
[java]<br />
Boolean control = validateTemplateText(newText);//Yeni şablon metninin kriterlerimize uyup uymadığını kontrol edelim.<br />
if(control == false){<br />
//Hatamızı kaydedelim veya ekrana yazdıralım.<br />
return<br />
}<br />
[/java]
[java]<br />
template.setTemplateText(newText)<br />
saveObject(template);<br />
[/java]
Yukarıdaki gibi bir 'Arrow Code' umuz varsa bunun için 'Guard Clause' denilen yöntemi uygulayarak hem exception'larımızı düzgün bir şekilde kontrol edebilir hem de okunaklı bir kod yazmış oluruz.
Şekilde de görüldüğü gibi her boş nesne kontrolünde istisna detayını kaydedebiliriz. Bu kayıtlar, kimi zaman patlayan kodumuzda hata tespit ederken çok faydalı olabilir.
İleri deki yazılarımda 'refactoring' ten daha detaylı bahsetmeye çalışacağım. Umarım bir nebze faydam olmuştur.
Kaynaklar
http://c2.com/cgi/wiki?GuardClause
http://www.codinghorror.com/blog/2006/01/flattening-arrow-code.html
http://www.refactoring.com/catalog/replaceNestedConditionalWithGuardClauses.html
http://sourcemaking.com/refactoring/replace-nested-conditional-with-guard-clauses
http://en.wikipedia.org/wiki/Code_refactoring
Bir cevap yazın