Fluent Interface ve Metod Zincirleme Yöntemi
5 Haziran,2011

Metod zincirleme yöntemi yazılım mühendisliğinde Fluent Interface kavramının bir parçası olarak bilinmektedir. Fluent interface ilk olarak Eric Evans ve Martin Fowler tarafından sunulmuştur ve tek amacı kodun okunabilirliğini arttırmaktır. İşte metodları zincirleme yöntemi de bunlardan sadece bir tanesidir. Dilersiniz küçük bir örnek kod ile akıcılığı nasıl yakaladığımıza gözatalım.Örnek senaryo olarak bir oyun yazdığımızı düşünelim ve robot sınıfımızdan iyi bir robot örnekleyelim ve sırasıyla bir silah seçtirelim, belirli bir koordinata yönledirelim, hedefe kilitleyelim ve ateş açtıralım. Öncelikle klasik olarak nasıl yapardık ona bakalım.

Robot goodrobot = new Robot(0, 0);
goodRobot.SelectGun("Rocket");
goodRobot.Move(400, 200);
goodRobot.Aim();
goodRobot.Fire();

Peki metod zincirleme yöntemi ile yaparsak nasıl olur sizce?

Robot goodRobot = new Robot(0, 0);
goodRobot.SelectGun("Rocket").Move(400, 200).Aim().Fire();

Metod isimlerini sırasıyla okuduğunuzda siz de ne kadar akıcı bir kod olduğunu farkedeceksiniz. Böyle bir yapıyı oluşturmanın temelinde aşağıdaki gibi  metodların kendi bulunduğu nesneyi döndürmesi yatıyor.

public class Robot:IRobot
    {
        #region Properties
        public int PositionX { get; set; }
        public int PositionY { get; set; }
        public string GunType { get; set; }
        #endregion        
 
        public Robot(int px,int py)
        {
            PositionX = px;
            PositionY = py;
            Console.WriteLine("Robot created");
            Thread.Sleep(1000);
        }
 
        #region Public Methods
        public IRobot Move(int x, int y)
        {
            PositionX += x;
            PositionY += y;
            Console.WriteLine("Robot has moved to "+x+","+y+" coordinates");
            Thread.Sleep(1000);
            return this;
        }
        public IRobot SelectGun(string gun)
        {
            GunType = gun;
            Console.WriteLine("Gun selected:"+GunType);
            Thread.Sleep(1000);
            return this;
        }
        public IRobot Fire()
        {
            Console.WriteLine("Started to fire");
            Thread.Sleep(4000);
            Console.WriteLine("Enemy down!");
            return this;
        }
        public IRobot Aim()
        {
            Console.WriteLine("Target Locked");
            Thread.Sleep(1000);
            return this;
        }
        #endregion        
    }
    public interface IRobot
    {
        IRobot Move(int x, int y);
        IRobot SelectGun(string gun);
        IRobot Fire();
        IRobot Aim();
    }

Aşağıdaki linkten örnek kodlara ulaşabilirsiniz.

ChainingMethodSourceCode.zip (26,43 kb)

Etiketler:

Singleton Tasarım Kalıbı
8 Ocak,2010

Bu yazımın öncekilere göre biraz farklı olduğunu biliyorum. Önceden proje geliştirirken işime yarayan ya da yeni teknolojileri tanıtan teknik yazılar yazıyordum. Bu yazımda ise Yazılım Mühendisliği’nin vazgeçilmezlerinden biri olan Design Pattern(Tasarım Kalıbı) ‘dan bahsedicem. Bugüne kadar hep teknik konulara değindim fakat bir yazılımcı için daha önemli şeyler vardır:) Özellikle yazılım mühendisleri için bir dilmekten ziyade bir algoritma, tasarım kalıbı ya da UML’i bilmek daha önemlidir. Bunları bildikten sonra geriye yeter ki dil öğrenmek kalsın:) Zaten algoritması yazılmış bir uygulamanın %50’si bitmiş demektir. Artık her dilde yazabilirsiniz. Daha fazla uzatmadan konuya gireyim artık. Bugün tasarım kalıplarından creational pattern olan Singleton Pattern konusuna değineceğim. Singleton tasarım kalıbı belki de tüm kalıplar içerisinde en basiti ve çok kullanılıdır. Bildiğiniz gibi tasarım kalıplarının hepsi yazılım yaparken karşılaştığımız birer sorundur. Uygulamamızda eğer bir sınıftan sadece tek bir nesne üretilmesini istiyorsanız çözüm Singleton kalıbıdır. Aşağıda sınıf diyagramını ve örnek uygulamayı bulabilirsiniz.

UML Class Diyagramı:

 

Örnek Kod: 

class Singleton {

    private static Singleton _instance = null;

    private Singleton() { }

    public static Singleton CreateInstance()      

       {

       if (_instance==null) {

          _instance = new Singleton();

            }

       return _instance; 

        }   

 }
Koddan da anlaşılacağı gibi ilk olarak static Singleton tipinde bir değişken tanımlıyoruz. Daha sonra yapıcı metodunu private olarak değiştiriyoruz ki  anahtar kelimesiyle nesne üretilmesin yani dışardan kimse yapıcıyı çağıramasın. Bunu da hallettikten sonra geriye Singleton tipinde bir değer döndüren static bir metod tanımlamak kalıyor. Bu metod ile de _instance değişkenimiz null’sa bir tane nesne üretiyoruz eğer null değilse yeni bir nesne üretmek yerine var olan nesneyi geri döndürüyor bize. Böylece bu sınıftan sadece tek bir nesne üretebiliriz. Aşağıdan örnek console uygulamasını indirebilirsiniz.

SingletonPattern.zip (7,19 kb)