design patterns (tasarım kalıpları)

44
Design Patterns (Tasarım Kalıpları) Caner Öncü [email protected]

Upload: nedirtv

Post on 19-Jul-2015

266 views

Category:

Technology


7 download

TRANSCRIPT

Page 1: Design Patterns (Tasarım Kalıpları)

Design Patterns(Tasarım Kalıpları)

Caner Öncü[email protected]

Page 2: Design Patterns (Tasarım Kalıpları)

Design Patterns Nedir Tam Olarak?

Ortak dil, ortak problemler, ortakçözümler Problem... çözüm?

Page 3: Design Patterns (Tasarım Kalıpları)

Tekerleği yeniden keşfetme! «İlla bu çözümleri mi kullanmak zorundayım? Kendim daha

Kendim daha iyisini yaparım!»

«Hmm... Bu sefer çok güzel oldu!»

Design Patterns Nedir Tam Olarak?

Page 4: Design Patterns (Tasarım Kalıpları)

Peki Bu Bilgi Gerçek Hayatta Ne İşime Yarayacak?

Ortak dilde konuşan ekip = mutlu ekip

*: Head First Design Patterns*

*

Page 5: Design Patterns (Tasarım Kalıpları)

Peki Bu Bilgi Gerçek Hayatta Ne İşime Yarayacak?

Kod tabanı, daha rahat: Anlaşılabilir

Güncellenebilir

«Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live.»

- John F. Woods

Page 6: Design Patterns (Tasarım Kalıpları)

Kaç tane kalıp var?

«Gang of Four» da kim?

«Tasarım Kalıpları’nda 20 yıllık deneyim, güleryüzlü hizmet!»

Peki...

Page 7: Design Patterns (Tasarım Kalıpları)

Amaç değil, araç

Harika, Hemen Kullanmaya

Başlıyorum!

KISS (Keep It Simple Stupid)

Ne kazandık, ne kaybettik?

«Tek sayfalık uygulama için proje yöneticisi Symfony2’de diretince.»

*

*: devops-tr

Page 8: Design Patterns (Tasarım Kalıpları)

Creational

Yeni objelerin yaratılması

Structural

Farklı sınıfların bir araya gelerek oluşturdukları büyük yapılar

Behavioral

Objeler arası iletişim kurulması

Kaç Tip Tasarım Kalıbı var?

Page 9: Design Patterns (Tasarım Kalıpları)

Yalnızca 1 objeye ihtiyacımız var

Objeye her sınıftan erişebilmemiz lazım

Obje ihtiyacımız olana kadar yaratılmasın (lazy

initialization)

Singleton (Creational)

Page 10: Design Patterns (Tasarım Kalıpları)

Örneğin, çalıştığı platformdan bağımsız bir uygulama

geliştirmek istiyoruz

Benzer özelliklere sahip objelerimiz var

Benzer objelerin yaratılma mantığını, objelerin

yaratılacağı sınıfları (concrete class) tek tek

belirtmeden, kontrata (interface) bağlı gruplamak

istiyoruz

Sınıf belirtilm... kontrat... kurgu... ne?!?

Abstract Factory (Creational)

Page 11: Design Patterns (Tasarım Kalıpları)

Abstract Factory (Creational)

Page 12: Design Patterns (Tasarım Kalıpları)

Kompleks yapıda bir objemiz var (Motor vs. parçalara

sahip bir araba veya değişken içeriğe sahip bir fast-

food menüsü gibi)

Objeyi oluşturmak için belli bir sırayı bozmadan, adım

adım işlemlerden geçmemiz gerekli

Builder (Creational)

Page 13: Design Patterns (Tasarım Kalıpları)

Builder (Creational)

Page 14: Design Patterns (Tasarım Kalıpları)

Factory Method (Creational)

*

Oluşturacağımız objenin tipini önceden belirtmek istemiyoruz

Oluşturulacak obje factory metodu içerisinde runtime’da belirlenecek

Page 15: Design Patterns (Tasarım Kalıpları)

Prototype (Creational)

*

Bir objenin özelliklerine sahip olan aynı tipte bir obje daha yaratmak istiyoruz (milyonlarca insan hücresi gibi)

Yeni objede yapacağımız değişiklikler orijinal objeye etki etmeyecek (clone)

Page 16: Design Patterns (Tasarım Kalıpları)

Adapter (Structural) Birbiriyle uyumsuz/çalışamayan sınıfları

çalışabilir hale getirmek istiyoruz (Obje -> JSON, XML gibi)

Aslında mevcut sınıf için "Wrapper class" kullanmış oluyoruz

Page 17: Design Patterns (Tasarım Kalıpları)

Bridge (Structural)

Birbirinden farklı, birden fazla interface ile kombinasyon oluşturarak soyutlama yapmak zorunda kaldık!

Ne demek şimdi bu?!?

Yapılan bu soyutlama birbirleriyle olan kombinasyonlara göre interface sayısına bağlı olarak permütasyon şeklinde artıyor

“Soyutlanan yapıyı soyutla” ki interface çorbası oluşmasın

Page 18: Design Patterns (Tasarım Kalıpları)

Bridge (Structural)

Page 19: Design Patterns (Tasarım Kalıpları)

Composite (Structural)

Basit objelerden ve bu basit objeleri barındıran kompleks objelerden oluşan bir yapı istiyoruz.

«Her bir klasör içerisinde dosya olabilir ve bu dosyalar da, kendi içinde dosyalar barındıran bir klasör olabilir (rekürsif)»

Page 20: Design Patterns (Tasarım Kalıpları)

Composite (Structural)

*

Page 21: Design Patterns (Tasarım Kalıpları)

Decorator (Structural)

Objelere dinamik olarak yeni sorumluluklar yükle/becerilerini arttır

«James Bond ve bitmek bilmeyen özelliğe sahip silahları gibi»

Sadece metodlar değil, property’ler de eklenebilir/düzenlenebilir

«İliğimizi kuruttun 007...»

Page 22: Design Patterns (Tasarım Kalıpları)

Decorator (Structural)

Page 23: Design Patterns (Tasarım Kalıpları)

Facade (Structural)

Birçok sistemi bir üst sistemde toplayarak bu alt sistemlere erişim kolaylığı sağla

«Uğraşamam ben önce 1’e sonra 4’e sonra 7’ye basmakla, müşteri hizmetleriyle görüşmek istiyorum!»

Page 24: Design Patterns (Tasarım Kalıpları)

Facade (Structural)

Page 25: Design Patterns (Tasarım Kalıpları)

Flyweight (Structural)

Birbirine benzer çok sayıda obje oluşturmak istiyoruz

Bunu yaparken de memory’i tüketmek istemiyoruz

Page 26: Design Patterns (Tasarım Kalıpları)

Proxy (Structural)

Bol bol kaynak tüketen bir objeye sahibiz

Bu sebeple, objeyi kullanmadan önce initialize etmek istemiyoruz

Page 27: Design Patterns (Tasarım Kalıpları)

Chain of Responsibility (Behavioral)

Bir istek sonucu oluşacak etkiyi gerçekleştirecek yapıların birbirlerine bağlanmasıyla oluşur

Birçok yapıdan yalnızca biri yapılacak işi gerçekleştirir «ATM’lerde çekilen paraya

uygun banknot’un hazneden verilmesi gibi»

Page 28: Design Patterns (Tasarım Kalıpları)

Chain of Responsibility (Behavioral)

Page 29: Design Patterns (Tasarım Kalıpları)

Command (Behavioral)

Yapılacak bir çağrı için tüm bilgiyi bir objede tutmak istiyoruz

Alakalı komut istenen zamanda, sıralı işlemler içeren bir batch şeklinde çağrılabilir

Page 30: Design Patterns (Tasarım Kalıpları)

Interpreter (Behavioral)

Belirli kural kümelerini bir gramerle ifade etmek istiyoruz

Bu kural kümelerini anlamlı ifadeye çeviren bir tercüman ihtiyacı duyuyoruz

«Müziğin notayla ifade edilmesi»

«SQL ifadeleri»

Page 31: Design Patterns (Tasarım Kalıpları)

Iterator (Behavioral) Sırayla dolaşmak istediğimiz biraraya gelmiş

obje kümemiz var

Amacımız yalnızca sırayla dolaşmak (linked list, hash table gibi), nasıl dolaştığımızın detaylarını öğrenmek istemiyoruz

Page 32: Design Patterns (Tasarım Kalıpları)

Mediator (Behavioral)

Sınıfların birbirleriyle direkt konuşmasını istemiyoruz ki sınıflar arası dependency oluşturmak durumunda kalmayalım

Araya aracı koyarak sınıflar arası haberleşme detaylarını aracıya aktarıyoruz

«Hava trafik kontrol» gibi

Page 33: Design Patterns (Tasarım Kalıpları)

Memento (Behavioral)

Objenin bir iç durumuna ait değerler için «checkpoint» oluşturmak istiyoruz

Oyun karakterimiz öldüğünde eşyalarımızı yitirip sağlık, açlık, başlangıç noktası gibi değerlerin «varsayılan» değerlere dönmesi gibi

«Her gün aynı şey, canımdan bezdim...» - Guy Pierce, Memento

Page 34: Design Patterns (Tasarım Kalıpları)

Memento (Behavioral)

Page 35: Design Patterns (Tasarım Kalıpları)

Observer (Behavioral)

Bir objeyle alakalı değişim olduğu zaman, bu değişimden belirli objeleri haberdar etmeyi amaçlıyoruz

Dinamik biçimde bu değişikliğin takibini yapacak objeleri ekleyip/çıkartmak istiyoruz

Açık arttırma görevlisi (subject) ve açık arttırma katılımcıları (observer) gibi

Page 36: Design Patterns (Tasarım Kalıpları)

Observer (Behavioral)

Page 37: Design Patterns (Tasarım Kalıpları)

State (Behavioral) Objenin davranış biçimini kendine ait olan

belirli durumlara göre dinamik biçimde değiştirmesini istiyoruz

«State machine» gibi Play tuşuna bastıktan

sonra tekrar basınca Pause işlemi gerçekleşmesi (tersi biçimde devam etmesi) gibi

Page 38: Design Patterns (Tasarım Kalıpları)

Strategy (Behavioral)

Bir sınıfa ait davranışlar dinamik olarak değişebiliyorsa bu davranışlara ait algoritmaları ayrıştırarak saklamamız mantıklı olacaktır

Böylece runtime’da davranışları karışıklık yaşamadan değiştirebilir hale geleceğiz

Page 39: Design Patterns (Tasarım Kalıpları)

Strategy (Behavioral)

Page 40: Design Patterns (Tasarım Kalıpları)

Template Method (Behavioral)

Bir sınıfa ait birbirine benzer yapıya sahip algoritmalarda yalnızca bazı adımları değiştirmek istiyoruz

Page 41: Design Patterns (Tasarım Kalıpları)

Visitor (Behavioral)

Sınıflarımıza yeni bir metot eklemek istiyoruz

Eklenmesi gereken sınıflara tek tek manuel biçimde ekleyip kod bakımını zorlaştırmak istemiyoruz (güncelleme gerektiğinde her yeri güncellemek gerekecek)

Birden fazla sınıfın implement ettiği interface’e ekleyip tek tek sınıflarda implementasyonunu da gerçekleştirmek istemiyoruz

Page 42: Design Patterns (Tasarım Kalıpları)

Visitor (Behavioral)

Page 43: Design Patterns (Tasarım Kalıpları)

Dilerseniz bu sunumun ve incelediğimiz

kodların kopyasına

http://koddit.com

adresinden ulaşabilirsiniz!

Teşekkürler!

Page 44: Design Patterns (Tasarım Kalıpları)

Head First Design Patterns, O’Reilly Media

Gang of Four, Design Patterns

http://sourcemaking.com/design_patterns

http://www.codeproject.com/Articles/430590/Design-Patterns-of-Creational-Design-

Patterns

http://www.codeproject.com/Articles/438922/Design-Patterns-of-Structural-Design-

Patterns

http://www.codeproject.com/Articles/455228/Design-Patterns-of-Behavioral-Design-

Patterns

http://www.tutorialspoint.com/design_pattern/

http://www.dofactory.com/net/design-patterns

http://wwwswt.informatik.uni-

rostock.de/deutsch/Lehre/Uebung/Beispiele/PatternExamples/patexamples.htm

http://devops-tr.tumblr.com

Kaynakça