Design Patterns: Facade

Not: Başlangıç olarak hazırladığımız design patterns hakkındaki makalemizi okumanızı tavsiye ederim.

Farz edelim ki, bir sıra içinde gerçekleşmesi gereken birkaç işleminiz var, ve bu işlemleri aynı sırayla uygulamanızın bir kaç bölümünde kullanmanız gerekiyor. Bu aşamada aynı kodu kopyalayıp, gerekli yerlere koyarak işleminizi çözebilirsiniz.

Fakat daha sonra küçük bir güncelleme yapmak istediğinizde büyük bir problemle karşı karşıya kalacağınız apaçık ortada, değil mi? Tüm gerekli yerlerdeki kodlarınızı, yeni versiyon ile değiştirmek gerekiyor. Sizce mantıklı mı? – Tabiki değil.

Bu problemi Facade kullanarak, doğru bir şekilde çözebiliriz. Facade bir structural patterndir. Bir client işlemi başlatır ve facade aldığı istediği değerlendirip, uygun ve gerekli işlemi çalıştırır. Facade kelime anlamı olarak “yanıltıcı görünüm” demektir. İçerik, aldığı parametrelere göre istenilen görünüme kavuşabilir. İşte bu mantıkla sistemimizi inşa ettiğimizde problemimiz çözülmüş olacaktır.

Aşağıdaki UML diyagramı Facade patterni temsil etmektedir.facade-uml

Yapmamız gereken ana bir controller oluşturup, bütün işlemi bu controller üzerinden sağlamak. Unutmadıysanız, amacımız yanıltıcı bir görünüm oluşturmaktı. Dolayısıyla, bu controllera verdiğimiz parametreler ile contollerın farklı görünüme bürünerek çalışmasını sağlayacağız.

Bu sayede ileri süreçte gereken bir güncellemeyi uygulayacağımız zaman sadece ana controllerı güncellememiz yeterli olacaktır. Design patternler genel olarak temel bir prensibi baz alarak oluşturulur: Open-Close. Bunun anlamı yazılacak kodun geliştirmeye açık, değiştirmeye kapalı olması demektir. Görebileceğiniz üzere, ana controllerımız hem sistemi değiştirmeye karşı korumuş olacak (Encapsulation), hem de tek bir noktadan tüm türemiş nesnelerin güncellenmesini sağlayacaktır.

Kod örneğine geçmeden, gerçek dünyadan bir örnek verip facade kavramını tam anlamaya çalışalım. Okul arkadaşınız, vaktinin olmadığını söylerek sizden kendisi için bir ev bulmanızı rica etti. Sizde paldır küldür sokak sokak dolaşmaya çıkarsanız, hem siz değerli vaktinizi boş yere harcayacak hem de eğer yeterli bilginiz yoksa arkadaşınızın umduğundan daha düşük bir eve mahkum edeceksiniz. Bunun yerine, bir emlakçı ile görüşüp, arkadaşınızın isteklerine uygun bir evi kolayca bulabilir ve kiralama sonrası gereken bir çok işlem ile uğraşmadan işin içinden çıkabilirsiniz. Bu örnekte siz client olarak işlemi başlattınız, emlak danışmanı ise facade olarak çalışır ve sizin isteğinize göre işlemleri tamamlar.

Facade kavramını artık anladığımıza göre, bir PHP kod örneği ile makalemizi tamamlayalım. Bu örnekte ise bir işletim sistemini kapatıp, açabilen bir yapı hazırlayalım.

namespace Vendor\Computer;

class Computer {
    protected $os;
    protected $bios;

    public function __construct(BiosInterface $bios, OsInterface $os) {
        $this->bios = $bios;
        $this->os = $os;
    }

    public function turnOn() {
        $this->bios->execute();
        $this->bios->doConfiguration();
        $this->bios->launch($this->os);
    }

    public function turnOff() {
        $this->os->memoryFree();
        $this->os->halt();
        $this->bios->powerOff();
    }

}

$os = new OS("MacOSX");
$bios = new Bios();

$computer = new Computer($bios, $os);
$computer->turnOn();
$computer->turnOff();

Özet olarak, bilgisayarımız için bir Computer facade’ı oluşturduk. Bilgisayarı çalıştırmak ve kapatmak için gerekli metodlarımız sadece bize gerekli komutları çalıştırmamızı sağlıyor. Eğer bilgisayarın açılması ile ilgili bir problem olursa, bizim sadece OS veya Bios içindeki hatayı düzeltmemiz tüm sistemin tekrar çalışmasını sağlayacaktır. Facade’ın kullanımında herhangi bir değişiklik yapmamıza gerek kalmayacak.

Ek olarak iyi bir facade sınıfı içinde hiç new keywordu barındırmaz, her objeye kendi interface’i üzerinden ulaşmak doğru olandır. Daha da iyi bir facade hazırlamak istiyorsanız, hiç bir new keywordu ve constructor kullanmayın. Bişeyler oluşturmak istiyorsanız Factory objesini parametre olarak gönderebilirsiniz.

Bir sonraki makalede Factory pattern ile devam edeceğimiz için şimdilik sadece iyi bir facede’ımız var 🙂

  
  • Yorumunuz için teşekkür ederim.