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.

var 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?

var 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  
    {
        public int PositionX { get; set; }
        public int PositionY { get; set; }
        public string GunType { get; set; }

        public Robot(int px,int py)
        {
            PositionX = px;
            PositionY = py;
            Console.WriteLine("Robot created");
            Thread.Sleep(1000);
        }

        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;
        }
    }

    public interface IRobot
    {
        IRobot Move(int x, int y);
        IRobot SelectGun(string gun);
        IRobot Fire();
        IRobot Aim();
    }

About the Author