11 Nisan 2018 Çarşamba

GoF Tasarım Örüntüleri

Giriş
Tasarım örüntüleri ile ilgili unutulmaması gereken ilk kural şu:
Design patterns are not building blocks!
GoF kitabındaki şu cümle önemli. Örüntüyü kullanmadan önce nasıl kullanılmaması gerektiğini öğrenmek gerekir.
"No discussion of how to use design patterns would be complete without a few words on how not to use them. Design patterns should not be applied indiscriminately. Often they achieve flexibility and variability by introducing additional levels of indirection, and that can complicate a design and/or cost you some performance. A design pattern should only be applied when the flexibility it affords is actually needed."
Tasarım örüntülerinin nasıl kullanılacağına dair yapılan bir söyleşide GoF ekibi de tüm tasarım örüntülerinin bilinçsizce kullanılmasının kötü bir şey olduğunu söylüyor.
"Trying to use all the patterns is a bad thing, because you will end up with synthetic designs—speculative designs that have flexibility that no one needs. These days software is too complex. We can't afford to speculate what else it should do. We need to really focus on what it needs. That's why I like refactoring to patterns. People should learn that when they have a particular kind of problem or code smell, as people call it these days, they can go to their patterns toolbox to find a solution."
Bir şeyin bilinçsize yapılması denince aklıma hep Cargo Cult Programming geliyor :)

Tasarım Örüntüsü Niçin Lazım
1. Ortak Dil
Tasarım örüntülerinin gerçek gücü, geliştiriciler arasında ortak bir dil kullanılmasını sağlayarak iletişimi artırmasında kaynaklanıyor. Örneğin FooBuilder isimli bir sınıf görünce bu sınıfı Foo nesnesi yarattığını hemen anlayabiliyoruz.

2. Bakım ve İdame
Tasarım örüntüleri yazılımın yaşam döngüsü boyunca daha kolay değiştirilebilmesini sağlar. Açıklaması şöyle
You can certainly optimize for product creation-- generate a ton of monolithic code as quickly as possible, without worrying about organizing it. As you have already noticed, this can be very, very fast. The alternative is to optimize for maintenance-- make creation a touch more difficult, but make modifications easier or less risky. That is the purpose of structured code.
Tasarım Örüntüleri Yok Olur mu?
Prosedürel dillerin kullanımın azalmasıyla birlikte bazı tasarım örüntülerinin de kayboldu. Örneğin 1950'lerdeki "subroutine call" örüntüsü artık bilinmiyor. GoF tasarım örüntüleri de Nesneye Yönelik Programlama ile çok iç içe. Nesneye Yönelik Programlamanın eksikliklerini (shortcoming) kapatmaya yarıyorlar. Nesneye Yönelik Programlama da yerini yavaş yavaş Functional Programming'e bıraktıkça bu örütünler de unutulabilirler.

Pattern ve Principle Arasında Ne Fark Var?
Pattern (örüntü) kelimesi genellikle programlama dünyasında kullanılıyor. Principle (prensip, kural) ise genel kavramlar, programlama ile ilgili olması şart değil. Örneğin SOLID, DRY gibi kurallar test dokümanı yazarken bile kullanılabilir.

Pattern ve Best Practice Arasında Ne Fark Var?
Yukarıdaki Pattern ve Principle arasındaki fark ile aynı.

GoF Kitabı
Kitabın yazılmasında Christopher Alexander'ın The Timeless Way of Building (1979) kitabının etkisi olduğu söyleniyor. Alexander'ın kitabından bir alıntı
Almost everybody feels at peace with nature: listening to the ocean waves against the shore, by a still lake, in a field of grass, on a windblown heath. One day, when we have learned the timeless way again, we shall feel the same about our towns, and we shall feel as much at peace in them, as we do today walking by the ocean, or stretched out in the long grass of a meadow.
-- Christopher Alexander, The Timeless Way of Building (1979)
Kitap 3 ana başlığa bölünmüş, toplam 22 tane örüntü var.
1. Creational Patterns
2. Structural Patterns
3. Behavioural Patterns
Tüm örüntüleri bilmek mümkün değil. Hatta bir aralar sürekli yeni örüntüleri bulmak modaydı. Örüntüler en çok aynı şeyi konuşup anlarken işe yarıyor.
Patterns are not lessons about how to code. They are a vocabulary we use to describe patterns we recognize in code.

Örüntüler
Örüntülerin en sık kullanılanlarının görsel hali şöyle.











Küçük Bir Eleştiri
Bu örüntüler arasında Filter Design Pattern yok. Niye yok bilmiyorum. Aslında sıkça kullanılan bir örüntü.

1. Yaratışsal Örüntüler
Açıklaması şöyle.
Creational patterns deal with the creation of objects.
2.1 Adapter - Yapısal Örüntü

1.1 Singleton - Yaratışsal Örüntü
Singleton yazısına taşıdım.

1.2. Factory - Yaratışsal Örüntü
Factory yazısına taşıdım.

1.3 Abstract Factory - Yaratışsal Örüntü
Abstract Factory yazısına taşıdım.

1.4 Builder - Yaratışsal Örüntü
Builder yazısına taşıdım.

1.4 Prototype - Yaratışsal Örüntü
Prototype yazısına taşıdım.

2. Yapısal Örüntüler
Açıklaması şöyle.
Structural patterns deal with the composition of objects.It deals with questions such as:

1.What does a class contain?
2. What are the relationships of a class with other classes? Is it inheritance or composition?
2.1 Adapter - Yapısal Örüntü
Adapter yazısına taşıdım.

2.2 Bridge - Yapısal Örüntü
Bridge yazısına taşıdım.

2.3 Composite - Yapısal Örüntü
Composite yazısına taşıdım.

2.4 Decorator - Yapısal Örüntü
Decorator yazısına taşıdım.

2.5 Proxy - Yapısal Örüntü
Proxy yazısına taşıdım.

2.6 Facade (Cephe) Yapısal Örüntü
Facade yazısına taşıdım.

2.7 Flyweight (Tüy Sıklet) Yapısal Örüntü
Flyweight yazısına taşıdım.

3. Davranışsal Örüntüler
Açıklaması şöyle.
Behavioral patterns focus more on the behavior of objects, or more precisely, interactions between objects.
Davranışsal örüntüler nesne grupları arasındaki iletişimi sağlayarak daha karmaşık akış kontrollerinin yapılabilmesini sağlar. GoF kitabındaki davranışsal örüntülerin sayısı, yapısal ve yaratışssal örüntülerden daha fazladır.

3.1 Chain of Responsibility - Davranışsal Örüntü
Chain of Responsibility yazısına taşıdım.

3.2 Command - Davranışsal Örüntü
Command yazısına taşıdım.

3.3 Mediator - Davranışsal Örüntü
Mediator yazısına taşıdım.

3.4 Memento - Davranışsal Örüntü
Memento yazısına taşıdım.

3.5 Iterator - Davranışsal Örüntü
Iterator yazısına taşıdım.

3.6 Observer - Davranışsal Örüntü
Observer yazısına taşıdım.

3.7 Template Method - Davranışsal Örüntü
Template Method yazısına taşıdım.

3.8 Visitor - Davranışsal Örüntü
Visitor yazısına taşıdım.

3.9 Strategy - Davranışsal Örüntü
Strategy yazısına taşıdım.

3.10 State - Davranışsal Örüntü
State yazısına taşıdım.

Hiç yorum yok:

Yorum Gönder