22 Ağustos 2011 Pazartesi

The Strategy Pattern (Strateji Şablonu)

C++ veya Java gibi diller öğretilirken genellikle "is-a" ilişkisinin "has-a" ilişkisinden daha iyi olduğu söylenir. Yani, bir sınıfın içinde başka bir sınıftan nesne tutmak yerine aynı sorunu türeterek çözmemizin daha iyi olduğu söylenir. Hatta cümle olarak "Favor inheritance over composition", yani "türetmeyi kompozisyona (sahibi olma ilişkisi) tercih et". Fakat aslında bu genellikle tam tersidir. Genellikle diyorum çünkü gerçek hayatta amaca yönelik olarak her şey değiştirilebilir. Mesela çok hızlı çalışmasını düşündüğümüz bir robotik projesinde chip üzerinde (Eşref Adalı görse çok kızardı) Java veya C# kodunun çalışmasını henüz beklemeyiz. Dolayısıyla tasarım şablonları bir amaç değil araçtır.

"Kompozisyonu türetmeye tercih et!"

Bu bölümde tam da bu sözü doğrulayan bir tasarım şablonu olan strateji şablonunu anlatacağım. Strateji şablonu aralarında değiştirilebilir algoritma aileleri tanımlar. Ayrıca strateji algoritmanın kullanıcısından bağımsız olarak değişmesini sağlar.


Strateji şablonunu kullanarak her davranış değişikliği için bu davranışı kullanan sınıfı türetmek yerine bu davranışı temsil eden bir arayüz nesnesi
tutup ondan davranışlar türetilirse kullanıcı olan sınıf artık yeni davranışları takip etmek zorunda kalmaz.

Bunu anlatmak için örnek verelim. Örnekleri Java dilinde vereceğim çünkü bahsettiğim gibi tasarım şablonları ile en iyi uyumlu olan dil Javadır. 

Örneğin bize kendini tanıtan, bir yere giden ve bize veda edip geldiği yere geri dönen bir Person sınıfımız olsun. Bu kişi farklı dillerde selam verebilir, selamlaşabilir ve bir yere farklı şekillerde gidebilir. Bütün bu çeşitler için bir sınıf türetmeye kalksak tüm davranışların sayısının çarpımı kadar alt sınıf yazmamız gerekirken, bazı sınıflar ise belki çok anlamsız ve gereksiz olacaktır. Ayrıca alt sınıfımızı dinamik olarak değiştirmek de güvenli olmayabilir.
//package info

public class Person {
    //constructors
 
 public void introduce()
 {
     helloBehavior.sayHello(this); 
 }
 
 public void moveTo(int x, int y)
 {
     moveBehavior.move(this, x, y);
 }
 
 public void leaveAndGoTo(int x, int y)
 {
     goodbyeBehavior.sayGoodbye();
     moveBehavior.move(this, x, y);
 }

 // Getters and setters

 // Behaviors
 HelloBehavior helloBehavior;
 GoodbyeBehavior goodbyeBehavior;
 MoveBehavior moveBehavior;
 
 // Properties
 protected int x, y;
 protected String name;
}
Burada anlattığım gibi üç tane davranışı temsil eden HelloBehavior, GoodbyeBehavior,
MoveBehavior arayüzleri var. Burada ayrıca bir prensibi daha görüyoruz:

"Uygulamayı değil, arayüzü tasarla!"

Blogger'a Syntax Highlighting eklemek

Bu akşam kısmetse ilk pattern hakkındaki kaydımı yayınlayacağım. Bu kayıtta konuyu açıklamak için kullandığım kod örneklerini sanki IDE'de yazarmış gibi okunaklı olması için hazır Syntax Highlighting kodu kullandım. İlgilenen varsa buradan nasıl yapılacağını öğrenebilir.

Ayrıca bu konuda yeni bir yayın daha yazdım. Buradan ulaşabilirsiniz.

20 Ağustos 2011 Cumartesi

Design Patterns (Tasarım Şablonları)

Bilindiği gibi bir çok programlama tekniği mevcut. Hatta, ne kadar programcı varsa, aslında o kadar programlama tekniği vardır. Programlama tekniği adeta insanın hayat görüşünün bile bir yansıması olarak düşünülebilir. Çünkü insan kadar hayat görüşü ve programlama tekniği varsa bunlar bir birlerine gizli bir şekilde bağlı demektir. Fakat tabiki bu görüşleri üst kategorilerde toplamak da mümkündür. Bu tekniklerin en ünlülerinden biri şüphesi "nesneye dayalı programlamadır" (NDP, ingilizce OOP).

NDP, içerdiği programlama prensipleri ile oldukça düzenli bir yöntem olduğunu kanıtlamıştır. Zaten de istatistiklere göre (google trends ve bir kaç programlama şirketinin) dünyada en çok tercih edilen programlama dili Java'dır. Java nesneye dayalı bir dildir. Fakat Java'yı bu kadar popüler yapan şey sadece NDP olması değil ayrıca tam olarak tasarım şablonlarını (design patterns) destekleyecek şekilde bina edilmesidir.

Nedir peki tasarım şablonları? Tanımlanırsa bir tasarım şablonu, bir durumdaki probleme getirilen çözümden ibarettir. Bu tanımı gereğiyle algoritmaya benzetilebilir fakat tasarım şablonları oldukça yüksek seviyeli bir tasarım metodudur.

Tasarım şablonları bu kadar popüler yapan şeylerden biri ise programcıların yıllarca çalışmasıyla elde ettiği deneyimleri düzenleyip adeta matematik teorileri gibi düzenlemesidir. İyi bir programcı, kesinlikle tasarım şablonlarının çözüm getirdiği problemlerle kendisi karşılaşmış ve hatta belki de farkına varmadan bu çözümü aynı tasarım şablonlarında anlatıldığı gibi getirmiştir.

Fakat genellikle programcılar tasarım aşamasında fazla düşünmeden kod yazdığında genellikle içinde çıkılmaz durumlara düşerler. Mesela programda yapılan ufak bir değişiklik bile aynı anda bir sürü kodun değiştirilmesine neden olur ki bu hem zaman alıcı hem de sonra oluşacak hatalara da zemin oluşturucu bir durumdur.

Yani kısaca bir programdan beklenilen şeyler şu şekilde sıralanabilir:
  • Tamir edilebilme (maintainability)
  • Ölçeklenebilme (scalability)
  • Tekrar kullanılabilme (re-usability)
  • Taşınabilme (mobility)
  • Okunaklılık (readability)

Bu özelliklerin hepsini sağlamak çok zordur. Fakat tasarım şablonları bu beklentileri büyük derecede karşılar. Önümüzdeki yazılarımda programcılar tarafından en çok kullanılan patternları anlatacağım.

19 Ağustos 2011 Cuma

XNA ile bir hafta

Bugün itibariyle bir haftadır XNA ile uğraşıyorum. Ancak bugün yavaş yavaş animasyonları kontol eden sınıflar yazmaya başlayabildim. Ufak bir yarış simulasyonunun da en önemli kısmı bitti. Tam anlamıyla oynanabilir olduktan sonra burada yayınlayacağım. Eğer ilgilenen olursa indirip eleştirilerini yorum olarak bırakırsa sevinirim.
Ayrıca başarabilirsem bir ayın sonunda XNA hakkında tamamen uygulamaya yönelik çok genel amaçlı olmayan bir tutorial dizisi de yayınlamayı düşünüyorum (İngilizce ve Türkçe olarak). Sizce yararlı olur mu?

16 Ağustos 2011 Salı

4000 Senelik Türk Oyunu: MANGALA

Bugün facebook'ta bir arkadaşımın paylaşmasıyla tanıdığım bu oyunu çok sevdim. Kurallarından bahsedecek değilim, buradan okuyabilir ve izleyebilirsiniz, ama tavlayı andırırken şansa bağlılık olmayışı gerçekten ilgi çekici. Ayrıca kuralları okudukça gerçeklenmesi oldukça kolay bir oyun olduğunun farkına vardım. Belki bir kaç platform için (web, Windows, iOS, Android, Linux vb.) projeler yapılabilir. İlgilenenler varsa aşağıya yorum bırakabilirler.

edit: Bu sitede güzel bir çalışma yapmışlar fakat yine de genişletilmeli ve yaygınlaştırılmalı. 

edit: Bir arkadaşında dediği gibi -ki gerçekten de ben de hatırlar gibiydim de çıkartamadım- bu oyun resmen eski Nokia'lardaki Bantumi oyununa çok benziyor.