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)

About the Author