18 Şubat 2020 Salı

GoF - Facade Örüntüsü

Not : GoF Tasarım Örüntüleri yazısına bakabilirsiniz.

Facade (Cephe) - Yapısal Örüntü
Açıklaması şöyle.
A facade is an object that provides a simplified interface to a larger body of code, such as a class library. A facade can:
  • make a software library easier to use, understand and test, since the facade has convenient methods for common tasks;
  • make the library more readable, for the same reason
  • reduce dependencies of outside code on the inner workings of a library, since most code uses the facade, thus allowing more flexibility in developing the system
  • wrap a poorly designed collection of APIs with a single well-designed API.
Facade kullanması karmaşık olan kodları basitleştirmek için kullanılabilir. Bu örüntünün bir de kuzeni olan Remote Facade vardır. Şeklen şöyle



1. Sınıfı Sayısını İndirgeyerek Basitleştirme
Head First kitabında Facade örüntüsü için verilen örnek çok güzel. Film izlemek için tam 6 sınıf ve 12 tane metod sıralanıyor. Tüm bu sınıf ve metodlar HomeTheaterFacade sınıfı ile sarmalanıyor. Sınıf sadece iki metod ile - watchMovie() ve endMovie() - kullanımı kolaylaştırıyor.

Static metodu bir arayüz ile sarmalamak bile facade sayılabilir.
interface ISystemUtils {
  boolean isOsWindows();
}

class SystemUtilsImpl implements ISystemUtils {
  @Override
  public boolean isOsWindows() {
    return SystemUtils.IS_OS_WINDOWS;
  }
}
2. Metod Sayısını İndirgeyerek Basitleştirme
Facade örüntüsünün bir başka kullanımına örnek olarak farklı imzalara sahip ama ayni işi yapan metodları overload yöntemini kullanarak daha kolay kullanılabilir hale getirebilir. Örneğin WriteA, WriteB, WriteC şeklinde metodlarımız olsun. Tek bir generic Write metodu ile daha kolay bir arayüz sunulabilir.

3. Parametre Sayısını İndirgeyerek Basitleştirme
Facade örüntüsünün bir başka kullanımına örnek olarak bir sürü setter metodu olan bir nesneyi direkt kullanmak yerine, içine bir kaç tane parametre alan tek bir facade nesnesi kullanmak gösterilebilir.

Yanlış Anlaşılma
Facade örüntüsü bizi sarmaladığı kodların değişiminden korumak için mevcut değildir.
Sarmaladığımız kod değişince Facade sınıfı da değişebilir. Eğer sarmaladığımız kod arayüzlerden oluşuyorsa belki değişiklik çok az olabilir ya da hiç olmaya da bilir. Ancak yine de esas amaç değişikliklerden korunmak değil, kullanımı daha kolay bir sınıf sunmaktır.

Bu sadece Coupling'de biraz daha azaltılabilir. Açıklaması şöyle.
The facade hides whatever you do behind it. It is similar to how an object encapsulates its state. The facade encapsulates a (sub)system. The consumer code only needs to talk to the facade and it is unaware of the details behind it.

Of course, it is still coupled. And yes, you have moved the problem to the Facade. However, thanks to the Facade, the consumer code does not have to change because of the changes of what is behind the facade.
Mediator ve Facade Arasındaki Fark
Fark çok basit. Facade yeni bir davranış eklemez. Mevcut davranışı daha kolay kullanmamızı sağlar. Mediator ise sisteme yeni davranış ekler.

Hiç yorum yok:

Yorum Gönder