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
03 Haziran 2014

Scala’ya Başlamak

Akin Bilgisayar Bilimleri, Java

Malum, Java çok uzun süredir bir dil değil, yani sadece bir dil değil, aynı zamanda bir platform. JVM’in standartlar üzerine kurgulanmış, oturmuş ve yüksek performanslı yapısı, irili ufaklı pek çok dil için nefis bir run-time ortamı oluşturmakta. Bu yüzden yanlış bilmiyorsam 100’den fazla dil ya da dilcik var ki JVM üzerinde çalışabiliyor, yani JVM için bytecode üretiyor. Örneğin Groovy’i, statik tipli (statically-typed) bir dil olan Java’ya dinamizm kazandırmak için geliştirilmiş bir dil. Ben de onu dinamik tipli (dynamically-typed) bir dil olarak kullanmıştım, Java’nin statik yapısını dinamikleştirmekte faydalanmıştık Groovy’den. Benzer şekilde son zamanlarda fonksiyonel diller de sık kullanılır hale geldi. Scala da, yapı olarak Java’ya çok benzeyen bir dil olan Groovy’nin tersine, tamemen farklı bir söz dizimi ve gramerle, JVM eko sisteminde kendine güzel bir yer bulmuş durumda. Burada detaylarına fazla girmeyeceğim ama ileride bir vesileyle ele alacağım fonksiyonel programming paradigmasının yapılarını, nesne-merkezli yapılarla harmanlayarak topa giren Scala, açıkçası Java’nın hemen en başından bu yana arka tarafta, sessiz ama sağlam adımlarla gelişmiş bir tarihe sahip.

Bu yazıda bir dil olarak Scala’ya nasıl başlanırdan bahsedeceğim.

Kurulum ve İlk Program

Scala’yı makinanızda iki farklı türde çalışır hale getirebilirsiniz. İlki Scala’nın “interactive build tool”u olan sbt aracılıgıyla. Sbt, Scala’nın Maven vari bir aracı ve buradan temin edilebilir. Ben Mac’imde indirdiğim zip dosyasını, bir yere kopyalayıp, bin klasöründe içeriği aşağıdaki gibi olan bir “sbt.sh” dosyası oluşturdum ve bu klasörü path değişkenine ekledim. Artık “sbt.sh” diyerek bu etkileşimli Scala ortamına ulaşabiliyorum. Bu amaçla bu sayfadaki manual installation bilgilerine bakabilirsiniz.

SBT_OPTS="-Xms1024M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M"
java $SBT_OPTS -jar `dirname $0`/sbt-launch.jar "$@"

Etkileşimli Scala ortamında, derlemek ve çalıştırmak yanında, “console” diyerek ulaştığınız Scala shell’i de mevcut. Scala’yı öğrenmek için bu etkileşimli konsol ortamı son derece basit ve hızlı iş görerek faydalı olmaktadır, dolayısıyla sbt ortamını muhakkak kurun derim.

Bir diğer yol ise Eclipse ortamınızı bir Scala IDE’ye çevirmek. Bunun için buradan Scala güncelleme linkini kullanarak, Eclipse IDE’nizi Scala tanır hale getireceksiniz. Orneğin şu anda burada Scala IDE 4.0.0 Milestone 1’in Eclipse için güncelleme linkleri mevcut. Yapacağınız şey Eclipse’inizdeki Help menüsünün altındaki “Install New Software”i tıklayarak Scala IDE özelliklerini Eclipse’inize kazandırmak. Eclipse’inizi tekrar başlattığınızda, Scala özelikleriniz hazır demektir.

İster Eclipse’i kullanarak isterseniz herhangi bir editörü kullanarak örneğin aşağidaki gibi ilk Scala programınızı yazabilrisiniz:

package org.javaturk.scala.ch01.selam1

object SelamObject {
//  def main(args: Array[String]) = println("Selam :), naber?")

  def main(args: Array[String]) {
    println("Selam :), naber?")
  }
}

Yukarıdaki kod, isimsiz (anonymous) bir sınıfın SelamObject isimli nesnesini oluşturup üzerindeki standart main fonksiyonunu çağırıyor. Farkedeceğiniz gibi yukarıdaki kodda main fonksiyonun tanımı iki farklı şekilde yapılmış durumda.

Aslında yukarıdaki kod, sınıfını da tanımlayarak şöyle yazılabilirdi:

package org.javaturk.scala.ch01.selam1

/**
 *  This is a class with a function.
 */
class SelamClass1 {
  
  def selamSoyle(name: String) = println("Selam " + name + " :)")

}

Bu durumda aşağıdaki gibi bir test sınıfı ile yukarıdaki sınıfın nesnesini oluşturup ondan hizmet alabiliriz:

package org.javaturk.scala.ch01.selam1

/**
 * Test object of SelamClass1
 * @author akin
 */
object SelamClass1Test {
  def main(args: Array[String]) {
    var selamClassObject = new SelamClass1
    selamClassObject.selamSoyle("Ali")
    selamClassObject.selamSoyle("Yesim")
  }
}

Madem Scala, JVM’de çalışabiliyor ve Java ile etkileşim halinde, o zaman aşağidaki gibi bir Java test kodu da yazabilirim:

package org.javaturk.scala.ch01.selam1;

/**
 * SelamClass1's tester class.
 * @author akin
 *
 */
public class SelamClass1JavaTest {

	public static void main(String[] args) {
	     SelamClass1 selamClassObject = new SelamClass1();
	     selamClassObject.selamSoyle("Mihrimah");
	}
}

 

Nasıl Öğrenirim?

Scala’yı öğrenmek için belki de ilk yapacağınız şey, DZone’un referans kartlarından Scala için olanına ulaşmak. Bu adresten temin edebileceğiniz bu 6 sayfalık giriş dokümanını okumak, tecrübeli programcılar için hızlı bir başlama imkanı sağlayacaktır.

Scala ile ilgili en güzel öğretici bilgilere online olarak ulaşabilirsiniz.  Sanırım bunlardan en merkezi olan Scala’nin kendi sayfasındaki dokümantasyondur. Scala’nin specification dosyasına, APIsine ve pek çok diğer tutoriala buradan ulaşabilirsiniz. Ayrıca piyasadaki Scala kitaplarıyla ilgili bilgilere de buradan ulaşabilrisiniz.

Ayrıca aralarında Scala’nın yaratıcısı Martin Odersky’nin dersinin de bulunduğu pek çok online video eğitimine buradan ulaşabilirsiniz.

Scala’ya başlamak böyle kolay ve hızlı ama ilerlemek biraz farklı. Özellikle fonksiyonel özellikleri ilk etapta kafa karıştırıcı gelebilir.

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

11 Bunu beğendim 🙂
Tweet
Follow me
Tweet to @kaldiroglu
25 Mayıs 2014

Tasarım Kalıpları – I: Giriş

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

Tasarım Kalıpları (Design Patterns), uzun süredir en hararetli ve en saygın kavramlardan addediliyor, kaliteli programlamanın, gerçek nesne-merkezli yazılım geliştirmenin olmazsa olmazlarından görülüyor. Yersiz bir anlayış da değil tabi. Ben de uzun süredir bu konuda yazmak istiyordum. Hatta bu yazıya çok önce başladım ama yayınlanması bugüneymiş.

Tasarım Kalıpları, Design Patterns’in dilimizdeki bir kaç karşılığından birisi. “Design”in “Tasarım” olarak çevrilmesinde problem yok. Peki ya “pattern”i nasıl çevirmeli? Asıl derdim tabi olarak bu kelimenin nasıl çevrileceğinden çok anlamıdır. Şöyle anlatabilirim İngilizce’deki pattern kelimesinin anlamını: Ben ufakken devamlı annemin bana ördüğü kazakları ve süveterleri giyerdim. Annem hamarat bir kadındır ve dikiş, örgü vs. konularında da eğitimlidir. Çok sıklıkla, sokakta giderken kadınların beni durdurup, “örneğini” almak için kazağımı incelediklerini hatırlarım. Kadınların benim kazağımdan almaya çalıştıkları şey, bizim dilimizde “örnek”, İngilizce’de ise “pattern”dır. Zaten Mariam-Webster sözlüğündeki açıklamalardan birisi de “something designed or used as a model for making things <a dressmaker’s pattern>” şeklindedir. Bu yüzden model kelimesi belki daha iyi karşılardı “pattern”ı. Bu anlamda bence kalıp, desen ya da şablon anlamlı ve uygun çevirilerdir. Ama örüntü gibi kelimelere alışamadığımı belirteyim.

Yazılım dünyasına bu kelimenin girişi yazılımcılarla değil Christopher Alexander isimli bir mimar ile oldu. Kendisi yüzyıllar boyunca insanlığın bina ettiği yapılardaki mimari özellikler üzerine çalışırken “design pattern” kavramını geliştirdi. Alexander tasarım şablonları ile ilgili olarak şöyle demektedir: “Each pattern describes a problem which occurs over and over again in our environment, and then describes the core of the solution to that problem, in such a way that you can use this solution a million times over, without ever doing it the same way twice.“

Bu güzel tanımı dilimizde ifade edecek olursak: “Her bir kalıp (önce) ortamımızda tekrar tekrar olan bir problemi tanımlar ve sonra da bu problem için çekirdek bir çözümü tarif eder öyle ki siz bu çözümü bir milyon defa kullansanız bile, hiç birisini aynıyla iki defa kullanmazsınız.“

Bu anlamda tasarım kalıbi, bir bağlamda sıklıkla karşılaşılan tasarım problemine genel (generic), soyut (abstract) ve tekrar kullanılabilen (reusable) bir çözümdür. Tasarım kalıpları soyutturlar, diller seviyesinde değil tasarım seviyesinde ifade edilirler. Bundan dolayı tasarım kalıpları anlatılırken sıklıkla class ve sequence diyagramlarını kullanırız. Tasarım kalıpları soyut olduklarından, her uygulanmalarında, bağlama ve ihtiyaca göre şekillendirilirler. Bu yüzden aynı tasarım kalıbını defalarca uygulasanız bile hiç bir iki uygulamanız birbirisinin aynısı olmayabilir.

Tasarım kalıpları, temel nesne-merkezli prensipleri kullanarak doğru sorumlulukları bulmamıza (finding responsibilities), değişimi göz önüne alarak bu sorumlulukları nesnelere dağıtmamıza (highly-cohesive objects) ve nesneleri, aralarında az bağımlılık olacak şekilde (lowly-coupled objects) kurgulamamıza yardımcı olur. Bir başka deyişle tasarım kalıpları, yüksek birliktelikli ve düşük bağımlılıklı yapıları nasıl kurgulayacağımızı, sıklıkla karşılaşılan problemler bağlamında, model olarak ortaya koyar. Bu anlamda tasarım kalıplarını kullanmadan doğru düzgün bir tasarım yapamayız desek sanırım abartmış olmayız. Çünkü tasarım kalıplarının çözdüğü ve bir kısmını hemen aşağıda sıraladığım problemler, her ortamda sıklıkla karşımıza çıkan problemlerdir.

Tasarım kalıplarının modelledikleri problemlerden bazıları şunlardır:

  • Nesneleri nasıl yaratırız?
    • Karmaşık nesneleri nasıl yaratırız?
    • Nesne ailelerini nasıl yaratırız?
  • Bir sınıftan sadece bir ya da belirli sayıda nesne nasıl yaratırız?
  • Nesnelere erişimi nasıl kontrol ederiz?
  • Nesneler arasındaki bütün-parça ilişkisini nasıl tasarlarız?
  • Bir işi yapmanın pek çok yolu varsa bunları nasıl ifade ederiz?
  • Emir-komuta ya da olay-bilgilendirme zincirini nasıl oluştururuz?
  • Bir sürü nesne arasındaki haberleşmeyi nasıl yönetiriz?
  • Bir nesneye çalışma zamanında yetkinlik nasıl kazandırırız?
  • Karmaşık duruma sahip olan nesneleri nasıl yönetiriz?
  • Nesnenin durumunu nasıl saklar ve sonra yine ulaşırız?
  • Birden fazla nesneyi nasıl yönetiriz?
  • Aynı işi birden fazla nesneye nasıl uygularız?

Bir tasarım kalıbının temelde dört bileşeni vardır:

  • İsmiki o şablonu, problemi ve çözümüyle birlikte ayırt etmemizi sağlar,
  • Problem ki hangi bağlamda nasıl ortaya çıktiğını ifade eder,
  • Çözüm ki parçaları ve aralarındaki ilişkileri ifade eder,
  • Sonuçlar ki kazanılan ve kaybedilenleri ifade eder.

Tasarım kalıpları çoğu defa bize, normalde nesne-merkezli programlama dili kullanmamıza rağmen prosedürel anlayışla yazılım geliştirmeye düşmekten kaçınmamızı sağlar. Bu yüzden normalde tek bir metot altında pek çok “if” ile yaptığımız “functional decomposition” tarzındaki yapıları, nesne seviyesinde nasıl ifade edeceğimizi bize öğretir.

Aslında “tasarım kalıpları” kavramı yayıldıktan sonra sadece tasarımın değil farklı konuların da kalıpları ortaya çıkmaya başladı. Bu sebeple “security patterns”, “performance patterns” gibi kavramlar oluştu. Bu anlamda ele aldığımız “tasarım kalıpları”, karmaşıklığı ve değişimi yönetmek amacıyla oluşturulmuş, iş alanından ve mimari katmanlardan bağımsız modellerdir. Programlama dillerine has tipik kullanımlar ya da kalıplar da mevcuttur. Örneğin Java’da bir Map nesnesinin üzerindeki değerlerin alınması için yaptığımız tipik işlemler vardır. Bu gibi dile özel yaklaşımlara, kalıplara “idiom” denir.

Tasarım kalıpları tipik olarak sınıf seviyesinde ifade edilirler. Mimari kalıplar ise daha çok modüller ve katmanlar (layer/tier) bazında ifade edilirler.  Örneğin Model-View-Controller (MVC) mimari bir kalıptır. Ayrıca mimari kalıpların, tasarım kalıplarından beslendiği de söylenebilir.

Tasarım kalıplarını şu amaçlarla öğreniriz:

  • Tekerleği yeniden keşfetmemek, var olan ispatlanmış çözümleri kullanmak. Tasarım kalıpları yukarıda saydığımız ve sayamadığımız problemleri çözerek, tekrar kullanılabilen, faydası ispatlanmış modeller ortaya koyar.
  • Formal ve yaygın bir dil oluşturmak. Tasarım kalıpları, formal bir kalıp dili (pattern language) oluşturmaktadır. Bu dilin yazılım geliştiriciler arasında yayılması, anlaşmayı kolaylaştıracak, ifade gücümüzü arttıracaktır.
  • Tasarıma uygun, yüksek soyutlama gücü kazandımak, detaylardan sıyrılıp, daha yüksek hedefler cinsinden düşünmek. Bu anlamda tasarım kalıpları daha iyi bir yazılım geliştirici hatta mühendisi olmanın en temel gerekliliklerindendir.

Tasarım kalıpları üzerine ilk çalışmalar, yukarıda da bahsettigim gibi Christopher Alexander tarafindan yapılmıştır. Sonrasinda Trygve Reenskaug, Smalltalk’la MVC (Model-View-Controller) üzerine çalışmışlardır. Benzer şekilde 80’li yıllarda Kent Beck ve Ward Cunningham, Smalltalk ile tasarım kalıpları uzerine calışmalar yapmışlardır. 1994 yılında ise Gang of Four (GoF) – Dörtlü Çete olarak adlandırılan Eric Gamma, Richard Helm, Ralph Johnson ve John Vlissides, ünlü “Design Patterns” kitabını yazmışlardır.    

Dörtlü çete kitaplarında 3 farklı kategoride toplam 23 tane kalıba yer vermişlerdir:

  • Creational – nesneleri yaratmakla ilgili olan 5 tane,
  • Structural – nesneler arasindaki yapısal iliskileri ifade eden 7 tane,
  • Behavioral – nesnelerin çalışma zamanı davranışlarını değiştirmek için 11 tanedir.

Sonrasında çıkan kitaplarda başka şablonlara da yer verilmiştir ama genelde tasarım kalıpları denince bu 23 tanesi anlaşılır.

Şimdilik burada bırakalım. Sonraki yazılarda bu konuya devam ederiz.

Bol tasarımlı ve dahi kalıplı günler dilerim 🙂

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

50 Bunu beğendim 🙂
Tweet
Follow me
Tweet to @kaldiroglu
13 Mayıs 2014

Java’nın Jar Aracını Kullanarak Jar Dosyası Oluşturma

Akin Java

Malum “jar”, Java’nın arşiv formatıdır. Jar formatında arşiv oluşturmak için gerekli araç “jar” ve diğer Java araçları her JDK kurulumunda vardır ve yerleri de yine malumunuz olduğu üzere JDK’nın bin klasörüdür. Projemize üçüncü el bir bileşen (third party component) eklemek istediğimizde o bileşenin jar dosyalarını classpath’e koymamız yeterlidir. (JDK’le birlikte gelen Java SE’nin bileşenleri de zaten jar dosyası olarak, örneğin rt.jar, makinamıza kopyalanırlar.) Bu en sık yaptığımız işlerdendir. Hatta o kadar ki Java projelerinde kod yazmak değil ama uygun jar sürümlerini bulup bir araya getirmek çoğu zaman daha zor olabilir 🙂

Zaman zaman “jar dosyası nasıl oluşturulur” şeklinde sorularla karşılaşıyorum. Bu yazıda hızlıca hem çalıştırılabilir (executable) hem de çalıştırılabilir olmayan jar arşiv dosyaları nasıl oluşturuluru anlatacağım.

Jar dosyası oluşturmak için gerekli adımları şöyle listeleyebiliriz.

  • Masaüstünüzde “Selam” isimli bir klasör açın. Benim makinamda bu “/Users/akin/Desktop/Selam” şekilde bir yola sahip olacaktır.
  • Bu klasörde Selam.java and SelamTest.java isimli iki Java kaynak kodu dosyası yaratın. Bu sınıfları buradan alabilirsiniz. Bu iki sınıfın da “org.javaturk.oop.ch01” şeklinde bir pakete sahip olduğuna dikkat edin.
  • Bulunduğunuz klasorde “bin” isimli bir başka klasör oluşturun. Derlenmiş class dosyalarımızı buraya koyacağız.
  • Sonra bir terminal ya da command line (CMD) açıp Selam klasörüne gidin.
  • Sonra bu iki kaynak kodu derlemek için ya şu iki satırı
javac -d ./bin SelamTest.java
javac -classpath ./bin -d ./bin SelamTest.java

ya da bu satırı yazıp çalıştırın:

javac -classpath ./bin -d ./bin *.java

Bu satırlar kaynak kodlarını derleyip, ilgili paket yapısını oluşturacak şekilde class dosyalarını karşı gelen klasörlere yerleştirecektir. Artık Selam’ın altında şöyle bir klasör yapımız var:

bin
|
|__org
    |
    |__javaturk
         |
         |__ oop
              |
              |__ch01
              |
              |__Selam.class
              |__SelamTest.class

  • Sonra “/Users/akin/Desktop/Selam” klasöründe aşağıdaki satırı çalıştırın.
jar cvf Selam.jar -C bin/ .

Bu satır “Selam.jar” isminde bir jar dosyası yaratacaktır. Jar dosyasının içeriği ise “bin” dosyasının altındaki klasör ve dosyalardan oluşacaktır.Zaten terminalde “jar” dediğinizde size “c”nin yeni bir jar dosyası yaratmak için, “v”nin jar komutunun çalışması sırasında neler yaptığını çıktı olarak yazması için, f’nin de “Selam.jar” ismin kullanması içın verildiğini anlarsınız. Jar yaratırken en fazla yanlış yapılan nokta, jarın içine girecekleri belirttiğiniz yerdir. Unutmayın “-C”, jar aracından, kendinden sonra gelen “bin/” klasörüne gitmeyi istemektedir. En sondaki “.”yi kesinlikle unutmayın. Eğer o noktanin ilk etapta yanlış yazıldığını düşündüyseniz lütfen bu yazıyı okumayı bırakıp, en temel MS-DOS, Unix ya da Linux kitabı edinip, baştan 20-30 sayfa okuyun. Zira genel olarak “.” bulunduğunuz klasörü, “..” ise bulunduğunuz klasörün ebeveynini gösterir ki bu yazıyı okuyorsanız, bu bilgiyi şu ana kadar öğrenmiş olmanız gerekirdi. Artık elinizdeki Selam.jar dosyasını projelerinizde kullanabilirsiniz. Yapacağınız şey, Selam.jar’i projenizin classpath’ine koymak. Ant ya da Maven gibi yapılar kullanıyorsanız, yapmanız gereken, onların kendi ayarlarını kullanarak Selam.jar’ın olması gereken yere örneğin repositorye gitmesini sağlamaktır. Projenizde kod olarak artık “Selam selam;” gibi bir satır yazdığınızda “import” anahtar kelimesini kullanarak “org.javaturk.oop.ch01.Selam” sınıfı ulaşılır hale gelecektir.

Peki oluşturduğumuz Selam.jar dosyasını nasıl çalıştırılabilir (executable) yaparız? Bir jar dosyasının çalıştırılabilir olması, içinde main metoda sahip olan sınıfın main metodunun çağrılması demektir. Bunun için Selam.jar oluşturulurken içine, main metoda sahip sınıfı ki bizde SelamTest, gösteren bilgi geçilmelidir. Bu bilgi jar aracına “e” ile geçilebilir. Yani şöyle bir satır gereklidir:

jar cvfe Selam.jar org.javaturk.oop.ch01.SelamTest -C bin/ .
 

Bu durumda oluşan Selam.jar dosyasının içine bakarsanız, META_INF klasörünün altında MANIFEST.MF isimli bir dosya olduğunu ve icinde de şu satırların olduğunu görürsünüz:

Manifest-Version: 1.0
Created-By: 1.8.0 (Oracle Corporation)
Main-Class: org.javaturk.oop.ch01.SelamTest


Artik teminalde

java -jar Selam.jar
 

yazarak “Selam Ali :)” çıktısını görebilirsiniz.

Bu jar dosyasını, classpath’e koyup, diğer projelerde kullanılmasını da sağlayabilirsiniz. Ya da işletim sisteminizde bu dosyaya çift tıklayarak java tarafından çalıştırılmasını sağlayabilirsiniz.

Benzer işler için Eclipse, Netbeans vb.geliştirme ortamlarını kullanabileceğiniz gibi Ant gibi araçları da kullanabilirsiniz.

Ayrıca konu ile ilgili Java Tutorial‘da da güzel ve geniş açıklamalar var.

Bol jar’lı günler dilerim 🙂

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

11 Bunu beğendim 🙂
Tweet
Follow me
Tweet to @kaldiroglu
10 Mayıs 2014

Java Kodunuzun Nesne-Merkezli Olmadığının 10 İşareti – IV: Hiç Alan Nesnesinin Olmaması Ya da Olsa Bile Yetersiz ve İnce Olmaları

Akin Java

Geliştirdiğimiz Java kodunun nesne-merkezli olmadığının 10 işaretinin neler olduğunu bu yazıda listelemiş ve bu yazıda ve bu yazıda da ilk iki maddeyi ele almıştık. Şimdi de üçüncü maddeyi ele alalım:

Kodunuzda hiç alan nesnesinin olmaması ya da varsa bile yetersiz ve ince olmaları. (No or very thin domain objects in the code.)

Eğer kodunuzda iş alanınızı modelleyen Müşteri, Hesap, Ürün, Poliçe, Kredi, Olay, Belge, Araç, Başvuru Dosyası ve benzeri nesneleriniz yoksa, bir iş modeliniz de yok demektir. Daha doğrusu, gerçekte var olan işinizin nesnelerle ifade edilmiş bir modeli yok demektir. Nesne-merkezli programlamanın en temel üstünlüğü ya da nesnelerin en fazla görünür olduğu yer aslında dilimizde işin nesne modeli (domain model ya da business domain model) olarak da adlandırdığımız, işin kendi kavramlarının ve aralarındaki ilişkilerin nesne merkezli olarak ifade edildiği durumdur. Böyle bir model, en temel iş terimlerini, özelliklerini ve sorumluluklarını ifade ettiği için son derece değerlidir. Bu modelin öncelikle bir sözlük olarak ifade etmek analiz sürecinde olmazsa olmaz çalışmalardandır. Sonrasında bu sözlüğü, use caselerden yola çıkarak, dilden bağımsız olarak UML class diyagramları ve/veya XML scheması olarak ifade etmek, uygulama geliştiren bir kurumun en temel bilgi teknolojisi değerlerinden olacaktır. Böyle bir çalışma ile kurum, teknik dilindeki tüm kavramları, ozellikleri ve davranışları boyutunda yakalamış olacaktır. Hatta eğilim, farklı ülkelerde hatta tüm dünyada, bazı kuruluşlar öncülüğünde, iş kollarının jargonlarının bu şekilde, platform ya da dilden bağımsız olarak yakalanıp ifade edilmesidir. Bunun da amacı, hızlı ve rahat entegrasyondur tabi olarak. Kurum böyle bir çalışmayla böyle bir modele sahip olduğunda, örneğin bu kurumun yazılımları gerek veri tabanında gerek ise uygulama katmanında, her zaman aynı iş terimlerini aynı şekilde ifade edecektir.

İşin nesne modeli kurgulanmadığında uygulamalar, işin nesne modeli ile ilgili en iyi ihtimalle, aynı nesneleri farklı şekilde ifade ederek ilerleyecektir. Bu durumda da örneğin Müşteri nesnesi, her uygulamada farklı yapılarda olacak ve uygulamalar arası bir entegrasyon söz konusu olduğunda ciddi miktarda “dönüştürme” yükü ortaya çıkacaktır. Özellikle başarılı SOA projelerinin önündeki en temel engellerden birisi, iş kavramlarını farklı şekillerde ifade eden veri tabanı ve uygulamaların birbirleriyle konuşabilmeleri için gerekli “dönüştürme” ya da “yeknesaklaştırma” çalışmalarının, özellikle büyük kurumlar için devasa boyutlara ulaşmasıdır.

Bir kurumda üç aşağı – beş yukarı aynı anlama gelen iş kavramlarının farklı uygulmalarda içerik olarak farklı şekillerde ifade edilmesi, yani bir uygulamanın Müşteri ya da Poliçe dediği kavramı, başka bir uygulamanın çok farklı nesnelerle ve yapılarla ifade etmesi, kurumsal mimari (enterprise architecture) açısından sıkıntılı bir durumdur. Ama hiç olmazsa bu organizasyonel bir problemdir. Bu durumun daha kötüsü şu iki halden birisi olur muhtemelen: İlkinde nesne merkezli bir iş modeli vardır ama bu modeldeki nesneler, sadece veri taşıyıp, diğer nesnelerle get/set metotlarıyla haberleşen dolayısıyla bir önceki maddede açıkladığım gibi, yüksek bir içerik bağımlılığına sahip olan nesnelerdir. Bu durumla sıklıkla karşılaşıyorum ve sebep olarak da nesne merkezli bir iş ve ihtiyaç analizi yapılmaması yanında, nesne kavramını yeterince içselleştirememiş, nesne-merkezli programlama konusunda tecrübe sahibi olmayan programcıları gorüyorum. Bu tür programcılar için nesne, yine bu serideki bir önceki yazımda açıkladığım gibi, bir kaç private alanı bir araya getirip, set/get metotlarını hızlıca oluşturmaya, nesne diyen, ama aslında nesne yerine veriyi modelleyen bir anlayışa sahip programcı arkadaşlarımızdır.

Bu türden nesnelere Martin Fowler “anemic domain model” ya da “kansız iş modeli” diyor. Yani bir model var ama model, iş alanındaki verileri temsil ederken malesef o modelin bir parçası olan davranışları, sorumlulukları temsil etmiyor. Yani model nesne ile kurgulanmış ama ifade ettiği şey, veri, davranışlar değil. Halbuki nesneler veri taşıyandan çok bir davranışa ya da sorumluluğa sahip olan elemanlardır. Verinin davranışlarıyla birlikte bir yerde ifade edilmesi, nesnenin ya da daha temelde sarmalama/encapsulation kavramın tanımıdır. Aksi taktirde tam da bir önceki maddede örneğini verdiğim Date nesneleriniz olur ve tarih ile ilgili davranışlar bir ya da daha çok kereler, “copy-paste reuse” tekniğini iyi bilen ya da birbirinden tamamen habersiz, her şeyi sıfırdan kendisi yapmaya çalışan yazılımcılar tarafından çoğaltılır. Bu da karman-çorman olmuş, anlaşılması zor, değişmesi daha zor olan yazılımlar demektir.

Gerek eğitimlerde gerek ise danışmanlık verdiğim yerlerde çok sıklıkla karşılaşıyorum bu türden durumlara. Account nesnesi var ama withdraw(), deposit() ya da calculateInterest() gibi metotlar Account nesnesi üzerinde değil. Bu gibi metotlar service ya da controller tipinde nesnelerde birikmiş durumda. Bu durumlarda son derece yetersiz, ince ya da zayıf iş nesneleri olurken, devasa boyutlarda, onlarca metota sahip servis nesnelerimiz oluyor. Daha da kötüsü, bu durumda bu türden iş nesneleri ile servis nesneleri arasında içerik bağımlılığı oluşuyor ki karmaşıklık çok ciddi bir engel haline geliyor. Bir nesneye değişiklik yapmak servis nesneleri ve onlar üzerinden diğer nesnelere kadar değişiklik yapmaya sebep oluyor. (Yeri değil ama bu ayırımı, yani veriyi nesneler üzerinde, davranışı ise servisler üzerinde tutmayı, katmanlı mimarinin gereği olarak uyguladığını söyleyenlere kafalarındaki katmanlı mimari ve nesne kavramını gözden geçirmelerini tavsiye ederim. Bu konuda benim şu ve devamı olan şu yazılarıma bakabilirsiniz.)

/**
 * This class represents a banck account anemically. It carries data but no responsibility regarding that data.
 * @author akin
 *
 */
public class Account {

	private String iban;
	private double balance;

	public Account(String iban, double balance) {
		super();
		this.iban = iban;
		this.balance = balance;
	}

	public String getIban() {
		return iban;
	}

	public void setIban(String iban) {
		this.iban = iban;
	}

	public double getBalance() {
		return balance;
	}

	public void setBalance(double balance) {
		this.balance = balance;
	}

	@Override
	public String toString() {
		return "Account [iban=" + iban + ", balance=" + balance + "]";
	}
}

Yukarıdaki gibi bir kansız nesnemiz olduğunda bakın para çekme işlemini nasıl yapıyoruz:

/**
 * This class implements business logic on Account object.
 * @author akin
 *
 */
public class AccountManager {
...
	public void withdraw(Account account, double amount) throws InsufficentBalanceException{
		
		double balance = account.getBalance();
		if(balance >= amount)
			balance -= amount;
		else
			throw new InsufficientBalanceException(account);
	}
...
}

Yukarıdaki AccountManager nesnesi ile Account arasında sadece bilgi akışı olduğuna ve bu durumun aslında en istenmeyen türden bağımlılık yarattığına dikkatinizi çekmek istiyorum. Biz tasarım sırasında temelde iş nesneleri arasındaki ilişkileri nasıl halledelim diye kafa patlatırken bir de böyle bir ilişki yumağı, sistemi berbat etmektedir.

İkinci durum ise, benim eskiden daha sık karşılaştığım, hiç bir nesne modelinin olmadığı, dolayısıyla sadece Java’daki ilkel tipler ile String tipindeki alanların List ve benzeri torbalarla taşındığı yaklaşımdır.

Bu durumda uygulama, ilgili iş kavramının, çoğunlukla veri tabanındaki anahtar alana karşılık gelen bilgisine sahiptir ve diğer bilgileri, bu anahtar bilgi sayesinde ya veri tabanından sorguluyordur ya da uygulamanın diğer parçalarından alıyordur. Ama nihai olarak alınan ve verilen şey nesne değildir, gerçekte nesne olabilecek bilgilerin bölük börçük ifade edilmesidir. Bu durumda aslında nesnelerde ifade edilmesi gereken nesneler arası ilişkiler (associations) de, genel olarak sadece veri tabanında tablolar arasında ifade edilir. Yani kod, tek başına anlaşılabilir bir yapı olmaktan çıkar.  Dolayısıyla örneğin aşağıdaki gibi metotlar çok sık görülür:

...
public ArrayList getVehicle(int id, String [] properties, boolean b){

   List vehicle = new ArrayLIst();
   vehicle.add(id);
   vehilce.add(properties[0]);
   ...
   return vehicle;
}
...

Bu metodun arayüzü, gerçekte Vehicle nesnesinin parçası olan farklı bilgileri, array vb. bölük börçük bilgiler olarak almakta ve yine bölük börçük pek çok bilgiyi bir ArrayList’e koyup geri döndürmektedir. Dolayısıyla iş alanının nesnelerle modellenmesi söz konusu değildir. Bu kodun bir programcı tarafından, ciddi miktarda bilgi desteği olmadan anlaşılması imkansızdır. Örneğin, “vehicle” ismindeki List’in hangi odasında ne var, bunların özellikleri nelerdir vb. bilgiler muhtemelen başka dokümanlarda tutulmalıdır ki bu kod programcılara anlam ifede etsin.

Her uygulama bir iş için yapılır ve ister çok teknik olsun ister olmasın ister çok karmaşık olsun isterse de sadece bir kaç süreç ve kural içerecek kadar basit olsun muhakkak bir iş süreci ve mantığı barındırır. Dolayısıyla bu süreçler ve ilgili mantığın, nesneler ve aralarındaki ilişkilerle ifade edilmesi gereklidir. Aksi taktirde hangi dili kullandığınızın ya da kaç katmanlı yapı kurguladığınızın çok fazla önemi olmayacaktır. Çok sıklıkla EJB, Spring, JSF gibi teknolojileri kullanacak öngörüde bulunan yazılımcıların bu konularda çuvalladığını görüyorum. Aslolan iş süreçlerinizi doğru düzgün ve değişıme el verecek şekilde modelleyip kodlamak. Teknoloji, hangi frameworku ya da hangi dili kullandığınız ancak bu sorunu çözdükten sonra problem olarak ele alınmalıdır.

Bol ve eğlenceli nesneli projeler diliyorum…

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

7 Bunu beğendim 🙂
Tweet
Follow me
Tweet to @kaldiroglu
«< 42 43 44 45 46 >»

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...