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 🙂
Hadi kolay gelsin 🙂
haha 😀 eğlenceli yazı olmuş. yorum yapma gereği duydum(nadiren).
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..
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.