Java Günlüğüm
Yazılım, Java, BT, azıcık felsefe, biraz mizah...
  • Udemy Eğitimleri
  • Temiz Kod
  • Tasarım Kalıpları
  • Hakkımda
  • Arşiv
RSS
07 Ekim 2014

“Java Kodunuzun Nesne-Merkezli Olmadığının 10 İşareti” Tamamlandı

Akin Java, Yazılım Mühendisliği

İlk yazısını 16 Mart’ta yayınladığım “Java Kodunuzun Nesne-Merkezli Olmadığının 10 İşareti” başlıklı yazı dizisi tamamlandı. Bu konu ile ilgili hazırladığım sunuma buradan ulaşabilirisiniz.

Java Kodunuzun  Nesne-Merkezli Olmadığının 10 İşareti

Daha üzerinde çalışılması gereken ama %80 oranda olgunlaşmış olduğunu düşündüğüm bir çalışma oldu. %20si hala aklımda bir yerde duruyor.

Konu “Java”ya özel görünse de aslında hemen tüm ana akım nesne-merkezli diller için geçerli tartışmaları içeriyor. Belki bazı diller sadedinde ufak-tefek özelleştirmeler yapılabilir. Bu da o dillerin meraklılarına kalıyor.

Bu konuyu seminer olarak da sunuyorum değişik yerlerde. Arzu ederseniz sizin kurumunuza da davet üzerine gelip sunabilirim. Hem bilgilendirici hem de eğlendirici bir  seminerle tanışabiliriz.

 

Toplam görüntülenme sayısı: 1106

11 Bunu beğendim 🙂
Tweet
Follow me
Tweet to @kaldiroglu
05 Ekim 2014

Java Kodunuzun Nesne-Merkezli Olmadığının 10 İşareti – XI: Sıra dışı durumları ifade etmek için Exception nesneleri oluşturmamak.

Akin Java, Yazılım Mühendisliği exception, java.lang.Exception, sira disi durum

Geliştirdiğimiz Java kodunun nesne-merkezli olmadığının 10 işaretinin neler olduğunu bu yazıda listelemiş ve ilk dokuz maddeyi daha önce ele almıştık. Şimdi de onuncu ve son maddeyi inceleyelim:

Sıra dışı durumları ifade etmek için Exception nesneleri oluşturmamak. (No Exception objects to represent exceptional situations.)

Nesne-merkezli programların en temel özelliği, her şeyi nesne olarak ifade etmektir. Eğer derdimiz her şeyi nesnelerle ifade etmek ise, sıra dışı durumları da nesneler ile  göstermeliyiz. Zaten sıra dışı durumlar iş mantığının bir parçasıdır, dolayısıyla iş modelimizi sıra dışı durumlara özgü nesnelerle zenginleştirmeliyiz. Sıra dışı durumları görmezden gelmek ya da int ya da String vb. tiplerle, return değeri olarak ifade etmek nesneden uzaklaşmaktır, hem anlam problemine yol açar hem de daha karmaşık koda sebebiyet verir. Nesne yerine int ya da String vb. tipler kullandığınızda bu değerlerin bir envanterini yapmanız ve herkesin bu envanteri sıklıkla kullanması gereklidir. Bu da enerji kaybıdır ve hataya da yakındır. Öte taraftan böyle bir durumda bu değerleri metotlarınızdan döndürmek ve kodunuzun içinde dolaştırmak yine sizin sorumluluğunuzda olacaktır.

Dil olarak Java kullandığımızda, sıra dışı durumları da java.lang.Exception sınıfının nesneleri olarak kurgulamalıyız. Yeterliyse kullandığımız APIlerdekiException sınıfının ya da alt sınıflarının nesneleriyle, değilse kendi yaratacağımız Exception nesneleriyle, iş mantığındaki sıra dışı durumları yakalayıp, sistemin çalışmasının devam etmesini sağlamalı ve kullanıcıya bilgi verme, loglama vb. ihtiyaçları gidermeliyiz.

Fırlattığınız sıra dışı durum nesneleri, metotların arayüzlerinin yani anlamlarının bir parçasıdır, dolayısıyla, sıra dışı durumları kodlamadan önce yani tasarım sırasında ortaya koymalıyız. Açıkçası analistler tarafından iş ve ihtiyaç analizi sırasında, süreçlerdeki normal akışlardan sapmalar olarak yakalanmayan alternatif ve sıra dışı durumların, tasarım sırasında gündeme gelmesi mümkünse de aslolan bu durumların analizde belirlenip, süreçlerin bir parçası olarak ifade edilmesidir. Aksi taktirde eksik ve kullanışsız yazılımlar üretmek kaçınılmazdır. Bu konuda daha önce yazdığım ve kendi tecrübeme dayanan duruma bakabilirsiniz.  

Modern dillerdeki sıra dışı durum mekanizmaları, bu durumların nesne olarak ifade edilmesi yanında, çalışma zamanında böyle bir durum oluştuğunda fırlatılan sıra dışı durum nesnesinin çalışma ortamında uygun bir kod parçası (handler) tarafından yakalanmasını da sağlarlar. Diller bu amaçla kendi içlerinde bir yükseltme (escalation) mekanizmasına sahiptirler. Bu noktada önemli olan yazılım projesinde bu durumların taa analizden itibaren ıskalanmamasıdır.

Bu amaçla aşağıdaki gibi kod yerine

public interface UserDao{

	public User getUser(String tckn) throw Exception;

	public User saveUser(User user) throw Exception;
	
}

böyle bir kodu tercih etmeliyiz:

public interface UserDao{

 public User getUser(String tckn) throw NoSuchUserException;
 public User saveUser(User user) throw DuplicatedUserException;
	
}

Sıra dışı durumları, analistiniz ıskalarsa siz tasarım sırasında, orada da ıskalanırsa, kodlarken bulun ve sorun olarak ortaya koyun.

Toplam görüntülenme sayısı: 1046

8 Bunu beğendim 🙂
Tweet
Follow me
Tweet to @kaldiroglu
05 Ekim 2014

Bayram Tebriği

Akin Diğer

Bu günlüğü devamlı okuyan ya da herhangi bir şekilde denk gelip de buraya bakan, bakmayan herkesin Kurban Bayramını kutlarım. Allah’tan neşeli, keyifli, sağlıklı daha nice bayramlara ulaşmanızı dilerim.

 

Toplam görüntülenme sayısı: 523

15 Bunu beğendim 🙂
Tweet
Follow me
Tweet to @kaldiroglu
05 Ekim 2014

Java Kodunuzun Nesne-Merkezli Olmadığının 10 İşareti – X: Aşırı miktarda karar ifadelerine sahip metotlar.

Akin Java, Yazılım Mühendisliği

Geliştirdiğimiz Java kodunun nesne-merkezli olmadığının 10 işaretinin neler olduğunu bu yazıda listelemiş ve ilk sekiz maddeyi daha önce ele almıştık. Şimdi de dokuzuncu maddeyi inceleyelim:

Aşırı miktarda karar ifadelerine sahip metotlar. (Methods that include excessive number of decision statements.)

Bu çalışma çerçevesinde daha önce bu yazıda metotların karmaşıklığından bahsetmiş ve metot karmaşıklığıyla ilgili, metot uzunluğu, geçilen parametre sayısı ve metota verilen kararların sayısını, metot karmaşıklığını belirleyen en temel üç etmen olarak ele almıştık. Bu yazıda bu etmenlerden üçüncüsünün detaylarını ele alacağız.

Yazılımlar, gerek iş süreçlerinde gerek ise bu süreçleri yönlendiren iş kurallarında var olan kararları yerine getirmek üzere farklı karar mekanizmaları kullanılır. En eski yüksek seviyeli dil olan Fortran’dan bu yana, if-else’in değişik türleri, switch-case hatta do-while, for  vb. yapılar, programlama dillerinin olmazsa olmaz yapılarındandır.

Cyclomatic complexity, bir metodun karar verme mekanizmalarına yönelik karmaşıklığı ölçmede kullanılan yaklaşımın ismidir. “Cyclo”, Latince’den Ingilizce’ye geçmiş ve çembersellik anlamı veren bir ön ektir. “Cyclomatic” kelimesi ise bir ağdaki, çemberlerin sayısını ifade eder. Bir ağdaki çemberlerin sayısı ise, o ağdaki kenarların sayısından  düğümlerin sayısının çıkarılıp, sonuca bir eklenmesiyle bulunur. Örneğin aşağıdaki grafın cyclomatic complexitysi 10 – 8 + 1 = 3 olarak hesaplanabilir.

Daha kısa olarak aslında, grafdaki kapalı alanların sayısı ile aynı değere ulaşabiliriz. Yukarıdaki şekilde de toplam 3 tane kapalı alan vardır.

Cylomatic complexity kavramını dilimize “karar karmaşıklığı” olarak çevirirsek, aşağıda farklı karar karmaşıklığına sahip üç farklı metodun akışı graf olarak gösterilmiştir.

CycComp

Soldaki ilk metodun karar karmaşıklığı 0, ortadakinin 1 ve sağdakinin ise 5’tir. Tabi olarak bu metotların anlaşılırlığı, kodlanması, test edilmesi vb. konulardaki zorlukları da soldan sağa doğru artmaktadır.

Kodlarımızda karar mekanizmalarını “if-else”, “switch-case”, “for”, “while, do-while” gibi yapılarla ifade ederiz. Yüksek karar karmaşıklığının sebebi, çoğu zaman düzgün soyutlamalar yaptığımızda farklı metot ve sınıflara koyulacak yapıları, bir arada halletmeye çalışmaktır. Strategy, Command, Proxy, State gibi tasarım kalıpları bu duruma çözümdür.

M. Fowler “Refactoring” kitabında bu durum için “Simplifying Conditional Expressions” ismiyle bir bölüm ayırmıştır. Bölümde pek çok öneri yanında karmaşık karar mekanizmalarını tekrar kullanıma izin verecek şekilde ufak-tefek ayrı metotlara koymak gibi teknikler de anlatılır.

Karar ifadelerini gittikçe karmaşıklaşması ve bir sınıftaki hemen her metotta kullanılır hale gelmesine sebep olan bir başka yaygın durum da bir tip hiyerarşisi kurgulamak yerine, tipi gösteren bir değişken ile polimorfik yapılardan kaçınarak kod yazmaktır. Bu durumda, aslında her farklı tipte ifade edilmesi gerek yapıları bol miktarda “if” ya da “switch” ile tek bir metotta halledilir.

public class JavaturkUser{

	private String username; 
	private String password;
        private String name;
	private String lastname;
	private int type;

	public void register(){
		if(type == 1){
			…
		}
		else if(type == 2){
			…
		}
		…
	}
}

Aslolan, JavaTurkUser‘ın miras yapısıyla farklı alt tiplerinin oluşturulması ve register() metodunun her bir tipte override edilerek o tipe uygun bir şekilde tekrar implement edilmesidir.

PMD, karar karmaşıklığı 10’un üzerinde olan yapıların riskli olduğunu söyler ve tekrar düzenlenmesini tavsiye eder.  Yüksek karara karmaşıklığı, uzun metot, muhtemelen de çok parametre demektir. Karar mekanizmalarını doğru yönetebilmek için tasarım şablonlarından ve tek sorumluluk prensibinden faydalanabilirsiniz.

Az kararlı, kısa ve anlaşılır metotlu temiz kodlu günler dilerim 🙂

Toplam görüntülenme sayısı: 978

10 Bunu beğendim 🙂
Tweet
Follow me
Tweet to @kaldiroglu
«< 31 32 33 34 35 >»

Günlüğüme Hoşgeldiniz

Bu günlükte, Yazılım Mühendisliği, Bilgi Teknolojileri, Java, kişisel gelişim ve zaman zaman da diğer konulardaki düşüncelerimi sizlerle paylaşacağım. Umarım beğenir ve hoşça vakit geçirirsiniz.

Her türlü düşüncenizi, yorum olsun, beğeni ya da eleştiri olsun, bana iletmenizi rica ediyorum sizden. Ayrıca bana akin@javaturk.org adresinden ya da Twitter'dan ulaşabilirsiniz. Videolarıma da buradan ulaşabilirsiniz.

Teşekkür ederim.

Akın Kaldıroğlu

Rahat Okumak İçin

A Decrease font size. A Reset font size. A Increase font size.

Sosyal Medya

  • Twitter
  • Facebook
  • LinkedIn
  • Youtube

Son Twitlerim

→ Takip Etmek İçin

Abone Olun

Emalinizi girerek yazılardan haberdar olun.
Loading

Son Yazılarım

  • Udemy Eğitimlerim Üzerine
  • (başlıksız)
  • Clean Code / Temiz Kod Eğitimi Udemy’de
  • Java ile Nesne-Merkezli Programlamaya Giriş Eğitimi Udemy’de
  • Selsoft Video Eğitimleri
  • Spring ile Kurumsal Yazılım Geliştirme
  • Corona Günlerinde Design Patterns
  • Corona Günlerinde Java
  • JDK 10 ve “var” Özelliği
  • Onur Özcan
  • Analist ve İş Bilgisi
  • Farklı Dillerin Bakış Açısıyla Nesne-Merkezli Programlama
  • Java Nedir?
  • Bilgi Teknolojilerinde Yetenek Yönetimi – II: Tanımlar ve Eleştiriler – I
  • Alelade Hikayeler – II: Bir Başka Performans Problemi

Yazı Kategorileri

Yazı Takvimi

Mart 2026
P S Ç P C C P
 1
2345678
9101112131415
16171819202122
23242526272829
3031  
« May    

Yazı Arşivi

Blogroll

  • Binnur Kurt'un Günlüğü
  • Ender'in Java Blogu
  • Erdem Seherler
  • Kızımın Günlüğü
  • Kurumsal Java
  • Levent Karagöl
  • Levent'in Java Blogu
  • Mert Can Akkan’s java tips,options, news…
  • Yaşar Safkan
  • Yasin Saygılı
  • Yazı Dünyası

Yazı Etiketleri

analiz Bilmek C Desen design pattern EJB Eğitim Fortran Hibernate Java Java'ya nasil baslarim Java dersleri Java EE Java Persistence API Java SE Java Sertifika Java Öğren Java öğreniyorum Java öğrenmek JPA Kalıp Kurumsal Java nesne nesne-merkezli No Silver Bullet object object-oriented Oracle Java Certifications pattern performans programlama programlama dilleri programlama nedir sertifika singleton tasarım tasarım deseni tasarım desenleri tasarım şablonu yazılım yazılım geliştirme Yazılım Mühendisliği yazılımın doğası yazılımın zorlukları Şablon

↑

© Java Günlüğüm 2026
Powered by WordPress • Themify WordPress Themes
 

Yorumlar Yükleniyor...