Laravel: Facade olmayan Facadelar

Başlık biraz ilginç olabilir ama gerçekten durum bu 🙂 Bu yazımda, Facade Pattern, Laraveldeki Facadetan ve Laravel’deki Facadeların neden Facade olmadığını anlatacağım.

Facade Pattern

Facade (fasad) pattern bir yazılım tasarım desenidir (design pattern). Yazılım tasarım deseni nedir diye soracak olursanız, şöyle diyim; Yazılım tasarım deseni, sürekli tekrar eden bir problemin ortak bir çözümü anlamına geliyor. Facade’in türkçe anlamı binaların ön cephesi anlamına gelmekte ama ben yıllardır bu patternın neden bu ismi aldığını anlamadım 🙂 Neyse kısacası Türkçe anlamına kafa yormayın.

Amaç

  • Bir Facade birden fazla oluşan alt sistem üzerine tasarlanır ve bunların birleşimi ile daha basit kullanım sağlar.
  • Daha karmaşık alt sistemleri sarmalayarak daha basit kullanımlı arayüzler oluşturur.

Problem

Çeşitli küçük parçalardan oluşan bir sistem, birleştirilerek, tüm fonksiyonu aynı şekilde sağlayan, daha basit kullanımlı bir üst sisteme ihtiyaç duyar.

 Çözüm

Facade, karmaşık bir sistemi tek bir arayüzde sarmalar. Bu sistemin öğrenilmesini ve kullanılmasını kolaylaştırır. Ayrıca sistemi diğer sistemlerden ayırarak, bakımı kolaylaştırır.

Facade çok basit olmalıdır. Herşeyi kapsayan Allah gibi birşey olmamalıdır. Sadece gerekenleri yapmalıdır.

Örnek

Facade için internet üzerinde bir çok UML diagram zaten mevcut. Onun yerine direk olarak kod örneği vermek istiyorum.

class SubSystem1 {
    public function yaz() {
       echo "Sub Sistem 1";
    }
}
class SubSystem2 {
    public function ciz() {
        echo "Sub Sistem 2";
    }
}
class SubSystem3 {
    public function boz() {
        echo "Sub System 3";
    }
}
class Facade {
     protected $subSystem1, $subSystem2, $subSystem3;

     public function __construct(SubSystem1 $subSystem1, SubSystem2 $subSystem2, SubSystem3 $subSystem3) {
         $this->subSystem1 = $subSystem1;
         $this->subSystem2 = $subSystem2;
         $this->subSystem3 = $subSystem3;
    }

    public function ekranaYaz() {
        $this->subSystem1->yaz();
        $this->subSystem2->ciz();
        $this->subSystem3->boz();
    }
}

 Kullanım

// Facade sömürücü 1
class FacadeSomurucu1 {

    protected $facade;

    public function __construct(Facade $facade) {
        $this->facade = $facade;
    }

    public function somur() {
        $this->facade->ekranaYaz();
    }
}

// Facade sömürücü 2
class FacadeSomurucu2 {

    protected $facade;

    public function __construct(Facade $facade) {
        $this->facade = $facade;
    }

    public function sacmala() {
        $this->facade->ekranaYaz();
    }
}

Naptık ?

Gördüğünüz gibi 3 farklı alt sistem var bunları kullanacak 2 tane sömürücü var. Bu iki sömürücü için daha basit birşey hazırladık -ki bunun adı Facade ve bu şekilde daha basit şekilde sorunumuzu çözdük.

Ancak dikkat ederseniz bu 2 Sömürücü de alt sistemlerden tamamen habersiz. Yani varlıklarından dahi haberleri yok, olmaması da gerekiyor.

Şimdi gelelim Laravel Facadelarına. Yani aslında Facade olmayan Facadelara 🙂

Laravel Facadeları

Laravel’de Facade şeklinde görünen sınıfların yukarıda anlatılanlarla zırnık alakası yoktur. Peki nedir Laravel’dekiler ?

Laravel’de Facade isminde geçen sınıflar aslında, sahte sınıflardır ve gerçek sınıflara static methodlar ile erişim sağlarlar. Yani:

Gerçek sınıf <-> Laravel Facade'i <-> Bizim Controller

Yani Laravel’deki Facadelara, gerçek objelere static methodlarla ulaşmamızı sağlayan aracı (proxy) sınıflar diyebiliriz.

Siz aslında bir Facade kullanırken (mesela Input) aslında Facade sınıfından bir method çağırıyorsunuz, ve Facade sınıfı da gidiyor gerçek sınıftan (mesela Illuminate\Http\Input) aynı methodu çağırıyor.

 Ee o zaman neden bunların adı Facade?

Bilmiyorum, açıkçası kimse bilmiyor. Bu konu hakkında Taylor Otwell’i (Laravel’in yapımcısı) çok dövdüler ama Facade ismini değiştirmemekte direniyor, hatta bayağı sinirleniyor 🙂

laravel facade

Hadi kolay gelsin 🙂

3 thoughts on “Laravel: Facade olmayan Facadelar

  1. MURATSPLAT

    Laravel’deki Facedeleri bana çok gereksiz geliyor. Çoğu zamanda kullanmıyorum. IOC ile nesneleri sınıfıların içine çalışmak varken Facedelerle niye uğraşayım. Örneğin her defasında defalarca \Input::bilmemne yazma bana anlamsız geliyor..

    Reply
  2. engin

    merhaba, php de değişkenleri nesne belirterek çağırmak yeni bir özellik mi, phpnin hangi versiyonundan sonra desteklenmeye başladığını biliyor musunuz? örnek olarak
    __construct(SubSystem1 $subSystem1, SubSystem2 $subSystem2, SubSystem3 $subSystem3) bu şekilde kullanım.

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax