C# Facade Pattern Kullanımı - OOP Design Pattern

Bu tasarım desenini bir örnek ile açıklamaya başlayalım. Örneğin çok karmaşık bir sınıf kütüphaneniz veya çok karmaşık bir modülünüz var. İşlemleri bu sınıflarla yapıyorsunuz. Çoğu zaman belirli bir işlemi yapmak için çok fazla sayıda nesne üretmeniz ve onlar arasında çeşitli ilişkiler kurmanız gerekir. Bunu sıkça yaptığınız için çoğu zaman copy-paste (kopyala-yapıştır) yapmanız olasıdır. Facade tasarım desenine göre ise belirli bir işi büyük bir kütüphane içerisinde sık sık yapıyorsak, bu iş için özelleştirilmiş yüksek seviyeli bir arayüz tanımlamak kısa vadede fayda getirecektir.




Yani alt sınıflarla yapılan komplex işleri bir üst katmanda yaptırılarak hem copy-paste'ten kurtulup hemde client tarafına sade kod sağlamış olmaktayız.

Burada önemli noktalardan biri Facade sınıf ile alt sınıflar birbirine sıkı sıkıya bağlı olmaması gerekir. Yani Facede sınıfı ortadan kaldırıldığında program yine çalışır halde olması gerekir.

Örnek bir uygulama olarak bankacılık uygulaması düşünebiliriz. Örneğin EFT yapan , kredi kullanandıran ve bu işlemleri yaparken çeşitli bankacılık kontrolleri yapan Kontrol sınıfımız var. Bunlar alt sınıflar.

Facade kullanmazsak client tarafı bir EFT işlemi yaptırmak için EFT işlemi yapan sınıfı tanımlaması gerekir. Sonra Kredi kullandırmak için kredi sınıfı daha sonra başka bir işlem için o işlem sınıfını. Ama bu işlemi Facade sınıfına bırakırsak EFT göndermek için sadece Facade sınıfı üzerindeki SendEFT metodunu çağırırsak hem clientin işi kolaylaşır hem daha sadece tekrarı az kod yazmış oluruz.

Yukarda bahsettiğimiz örnek uygulamanın Class Diagramı:

Görüldüğü gibi Facade sınıfımız nesne yaratımlarını Construtor'ında yapıyor ve altsınıflara ait clientin kullanacağı metodları kendi bunyesine alarak client ile alt sınıflar arasında köprü oluşturuyor.


Örnek Kod:


    public class Customer
    {
        public int CustomerNumber { get; set; }
        public string Fullname { get; set; }
        public string IDNo { get; set; }
        public decimal CashAmount { get; set; }
    }


    public static class ControlManager
    {
        public static bool CheckHasEnoughCashInBankAccount(Customer customer, decimal amount)
        {
            if (customer.CashAmount >= amount)
                return true;
            else
                return false;
        }

        public static bool CheckCanUseCredit(string IDNo)
        {
            //test için her zaman return true
            return true;
        }
    }
    public class EFTManager
    {
        public void SendEFT(Customer fromCustomer, Customer toCustomer, decimal eftAmount)
        {
            if (ControlManager.CheckHasEnoughCashInBankAccount(fromCustomer, eftAmount))
            {
                fromCustomer.CashAmount -= eftAmount;
                Console.WriteLine("EFT " + toCustomer.CustomerNumber + " nolu hesaba gönderildi..");
            }
            else
                Console.WriteLine("Hesabınızda yeterli miktar olmadığı için EFT işleminiz gerçekleştirilemedi.");
        }
    }

    public class CreditManager
    {
        public void UseCredit(Customer customer)
        {
            if (ControlManager.CheckCanUseCredit(customer.IDNo))
                Console.WriteLine("Kredi kullandırılmıştır.");
            else
                Console.WriteLine("Banka kredinizi onaylamamıştır.");
        }
    }
  
    public class Facade
    {
        private EFTManager _eftManager;
        private CreditManager _creditManager;

        public Facade()
        {
            _eftManager = new EFTManager();
            _creditManager = new CreditManager();
        }

        public void SendEFT(Customer fromCustomer, Customer toCustomer, decimal eftAmount)
        {
            _eftManager.SendEFT(fromCustomer, toCustomer, eftAmount);
        }

        public void UseCredit(Customer customer)
        {
            _creditManager.UseCredit(customer);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Facade facade = new Facade();

            Customer customer1 = new Customer() { IDNo = "1245203836", Fullname = "Ahmet", CustomerNumber = 11243, CashAmount = 3456090.25M };
            Customer customer2 = new Customer() { IDNo = "2342342342", Fullname = "Mehmet", CustomerNumber = 123123, CashAmount = 34929272.36M };

            //send eft customer1 to customer2
            facade.SendEFT(customer1, customer2, 12345);

            //use credit to customer 2
            facade.UseCredit(customer2);

            Console.ReadLine();
        }

    }


Kaynak: http://www.csharpnedir.com/

0 yorum :

Yorum Gönder