YZM 2108 Yazılım Mimarisi ve Tasarımı Yrd. Doç. Dr. Deniz KILINÇ Celal Bayar Üniversitesi Hasan Ferdi Turgutlu Teknoloji Fakültesi Yazılım Mühendisliği 1
BÖLÜM - 3 Tasarım Kalıpları Bu bölümde; Anti-Patternler (Anti Kalıplar) Factory Tasarım Kalıbı AbstractFactory Tasarım Kalıbı ile ilgili konular anlatılacaktır. 2
Anti-Pattern Yazılımsal bir problemi, bilinen ve doğru çözüm olarak kabul edilmiş bir kalıbı kullanmadan ve özgün bir yöntemle çözmek anlamında kullanılmaktadır. İlk bakışta mükemmel gibi görünen bu çözümler sonradan sıkıntılar doğurmaktadırlar. 3
Anti-Pattern (devam...) Anti-Pattern lerin en tehlikeli tarafı ürün geliştirme süreçlerinde ve vakalarda en uygun çözüm yolu olarak düşünülmeleridir. Anti-Pattern kavramlarını bilmek, yazılım geliştirme sürecinde karşılaşılabilecek ciddi problemleri önceden tahmin edebilmeyi sağlar ve tedbir almayı kolaylaştırır. 4
Anti-Pattern (devam...) Anti-patternlerin kullanılması yanlıştır. Kısa vadede hızlı bir çözüm olarak gözükseler de genelde yazılım mimarisinde sıkıntılara yol açmaktadırlar. Türkiye de maalesef anti-pattern ler fazlaca kullanılmaktadır. Örneğin; spagetti kod yazımı ya da kodları kopyala-yapıştır yöntemiyle yazmak, anti pattern olgusuna örnektir. 5
Anti-Pattern Örnekleri 1. Magic Pushbutton Herhangi bir soyutlama yapılmaksızın görsel nesnelerin arkasında kodlamanın yapılmasıdır. Buna ayrıca butonclick programcılığı denmektedir. Bu desen GUI(Graphical User Interface) tipindeki uygulamalarda daha fazla ortaya çıkar. Arayüz tarafı ile iş mantıkları genellikle buton gibi bir kontroller arkasına gömülür. 6
Anti-Pattern Örnekleri (devam...) 2. Spagetti Coding Bakım ve değişikliğin yapılamayacak kadar karışık yazılmış kodlama türüne bu ad verilmektedir. Nesne yönelimli olmayan dillerde daha sık rastlanır. Metotlar daha çok süreç odaklı yazılır hatta süreç adları olarak isimlendirilir. Nesneler arasında neredeyse hiç ilişki yoktur. 7
Anti-Pattern Örnekleri (devam...) 2. Spagetti Coding Çoğu metot parametre almaz ve global seviyedeki sınıf değişkenlerini oluşturmakta kullanılır. Kodun yeniden kullanılabilirliği zordur. OOP temel özellikleri(kalıtım, çok biçimlilik, soyutlama) kullanılmaz. 8
Anti-Pattern Örnekleri (devam...) 2. Spagetti Coding 9
Anti-Pattern Örnekleri (devam...) 3. Lasagna Coding Gereğinden fazla sayıda katmana sahip uygulama geliştirilmesine denmektedir (Aşırı çok katmanlı uygulama). Çok katman, çok sayıda irili ufaklı class, anlaşılması ve değiştirilmesi zor bir yazılım. 10
Anti-Pattern Örnekleri (devam...) 4. Kopyala -Yapıştır Programlama Daha generic bir çözüm üretmek yerine var olan kodları koplayarak geliştirme yolunu tercih etmektir. Çoğunlukla bir çözüm için yazılımın her hangi bir yerinde uygulanan bir kod parçasının, ihtiyaç olunan başka bir yerde aynen kopyalanarak kullanılmaya devam etmesi olarak tanımlanır. Bu anti-pattern kod tekrarlarına neden olmaktadır. 11
Anti-Pattern Örnekleri (devam...) 4. Kopyala -Yapıştır Programlama Doğal sonucu olarak bir değişiklik olması halinde kodun çoğaltıldığı yerlere gidilmesi de gerekecektir. Güncellemeler için fazla maliyetli eforlar sarf edilebilir. Hatalar gözden kaçabilir ve uygulamanın yanlış çalışma riski giderek artabilir. Söz konusu parçaları soyutlayıp, nesne yönelimli dil temellerine uygun olacak şekilde ayrıştırmak önemlidir. 12
Anti-Pattern Örnekleri (devam...) 4. Kopyala -Yapıştır Programlama 13
Anti-Pattern Örnekleri (devam...) 5. God Object (Tanrısal Nesne) Gereğinden çok şey bilen ve yapabilen sınıflara denmektedir. Bu sınıflar çok fazla veriye sahiptir ve uygulamanın ana sınıfı gibi algılanabilmektedir. Bu kötü bir tasarımdır. Bu durumda tüm iş yükünü üstlenen sınıfların bakımı, genişletilmesi, iş mantıklarının kolayca okunur olarak içerisinde yer alması oldukça zorlaşır. Karmaşıklığın yanında, belleğe yüklenmesi zaman alan nesneler ortaya çıkar. 14
Anti-Pattern Örnekleri (devam...) 6. Golden Hammer (Altın Çekiç) Bir tasarımın mükemmel bir çözüm olduğuna inanıp her sorunu aynı yöntemle çözmeye çalışmaktır. "Elinde çekiç olan birine tüm sorunlar çivi gibi görünür. Oysaki bazı problemler aynı yöntemler ve yaklaşımlar ile çözümlenemeyebilir. Bu durum çözümü arayan kişilerin daha önce başarılı şekilde uyguladıkları yaklaşımları sahiplenmesinden kaynaklanır. 15
Anti-Pattern Örnekleri (devam...) 6. Golden Hammer (Altın Çekiç) Örneğin tüm yazılımların SOA (Service Oriented Architecture) mimari bütünü içerisinde ele alınması gerektiğini düşünmek bu duruma örnek olarak verilebilir. En sık görülen Anti-Pattern ler arasında yer alır. Söz konusu durumun oluşmasının nedenlerinden birisi, teknolojik gelişmelerden ekiplerin haberdar olmamasıdır. 16
Anti-Pattern Örnekleri (devam...) 7. Reinventing the Square Wheel (Tekerleği yeniden keşfetmek) Var olan bir çözüm yerine ondan daha kötü olan özel bir çözüm üretme hatasına düşmektir. Bazı yazılım problemlerinin çözümünde kullanılacak olan yollar zaten standart ve bellidir. Üstelik bu çözümler için standart hale gelmiş mimari yaklaşımlar, ürünler ve alt yapılar (Frameworks) mevcuttur. Problemin bu tip yardımcılar ile çözülemeyeceğini düşünüp sıfırdan bir çözüm üretilmeye başlandığı hal tekerleğin yeniden keşfi olarak düşünülür. 17
GoF (Gang of Four) Sistematiği 18
GoF Sistematiği 1. Creational (Nesne yaratılışına ait) Kalıplar 1. Abstract factory 2. Builder 3. Factory method 4. Prototype 5. Singleton 2. Structural (Yapısal) Kalıplar 1. Adapter 2. Bridge 3. Decorator 4. Facade 5. Proxy 19
GoF Sistematiği (devam...) 3. Behavioral (Davranışsal) Kalıplar 1. Chain of responsibility 2. Command 3. Interpreter 4. Iterator 5. Mediator 6. Memento 7. Observer 8. State 9. Strategy 10. Visitor 20
Creational (Nesne Yaratılışına Ait) Kalıplar 21
Creational Kalıplar Bu kalıplar nesneye yönelik programlanın en yaygın görevlerinden biri olan yazılım sistemindeki nesnelerin yaratılması hakkında yol göstermektedir. 22
Factory Method (Fabrika Tasarım Kalıbı) 23
Factory Method Günlük hayatta bazı varlıklar ya da nesnelerin yaratılışları basittir ve bu tür nesneleri kendimiz bile yaratabiliriz. Örneğin basit bir zil veya pusulayı evde kendi kendinize yapabilirsiniz. Oysa bazı varlıklar veya nesneler ise oldukça karmaşık süreçlerden geçilerek yaratılmaktadır. Sözgelişi evde pusula yapar gibi bir televizyon yaratamazsınız. Ya da evde kendi kendinize para basamazsınız. Bu tür nesneleri özel fabrikalar -üretimin detaylarını tüketiciden gizleyerek- üretmekte ve tüketiciler de fabrikaların ürettiği bu nesneleri kullanmaktadırlar. 24
Factory Method (devam...) Nesne yönelimli programlama açısından da benzer bir durum söz konusudur. Bazı nesneler doğrudan kullanıcısı tarafından yaratılabilmektedir. Bunun anlamı; sınıfın başlangıç fonksiyonunu (new operatörü) kullanarak nesnenin yaratılmasıdır. Ancak bazı nesnelerin (Product) kullanıcı (Client) olarak erişebileceğimiz başlangıç fonksiyonları bulunmamaktadır. 25
Factory Method (devam...) Client olan nesne Factory nesnesini kullanarak ihtiyacı olan Product nesnesini elde eder. İstenen tipte yeni nesne oluşturma sürecinin Factory sınıfına aktarılması ile birlikte nesne üretme ve initialize etme süreci client tan soyutlanmış olur, Bu sayede client; uygulama içerisinde tamamen kendi rolüne odaklanmış olur, çünkü yeni nesnenin nasıl oluşturulacağına dair detaylardan soyutlanmış olur, bunları bilmek zorunda değildir. 26
Factory Method (devam...) Factory Pattern genel olarak: İstenen tipte nesne oluşturma sürecini Client ın bu konuda detay bilgi sahibi olmadan gerçekleştirilmesini sağlar. Yeni oluşturulan nesneye bir interface ile referans edilerek ulaşılmasını sağlar. 27
Factory Method (devam...) FactoryMethod sınıf diyagramı 28
Factory Method (devam...) Product Factory tarafından yaratılan nesnelerin arayüzü ConcreteProduct Creator Product arayüzünü implemente eden sınıf. Bu sınıfın nesneleri ConcreteCreator tarafından yaratılır. Factory metodunu/metotlarını (factorymethod) tanımlayan arayüz ConcreteCreator Creator sınıfını genişleten ve factorymethod için bir implementasyon sağlayan sınıf 29
Örnek: SekilFactory ISekil arayüzünü ve bu arayüzü implemente eden somut sınıfları (Kare, Cember, Dikdortgen) yaratınız. Sonrasında factory sınıfı olan SekilFactory sınıfını yaratınız. Program sınıfında SekilFactory sınıfından bir Sekil nesnesi elde edebilecek şekilde SekilFactory sınıfını tanımlayınız. Program sınıfında gereken nesnenin tipini (Cember, Kare, Dikdortgen) bilgi olarak geçebilecektir. 30
Örnek: SekilFactory (devam...) 31
Örnek: SekilFactory (devam...) 1. İlk olarak ISekil arayüzünü yaratırız. ISekil.java 32
Örnek: SekilFactory (devam...) 2. Sonrasında ISekil arayüzünü implemente eden somut sınıfları yaratırız. Kare.java 33
Örnek: SekilFactory (devam...) 2. Sonrasında ISekil arayüzünü implemente eden somut sınıfları yaratırız. Cember.java 34
Örnek: SekilFactory (devam...) 2. Sonrasında ISekil arayüzünü implemente eden somut sınıfları yaratırız. Dikdortgen.java 35
Örnek: SekilFactory (devam...) 3. Geçirilen bilgiye göre ISekil arayüzünü implemente eden sınıfların nesnelerini yaratan SekilFactory sınıfını vet getsekil(esekiltur sekiltur) metotunu oluşturunuz. 36
Örnek: SekilFactory (devam...) SekilFactory.java ESekilTur.java 37
Örnek: SekilFactory (devam...) 4. Şeklin tipi gibi bir bilgiyi geçirerek somut sınıflardan nesne elde etmek için SekilFactory sınıfını kullanırız. 38
Örnek: SekilFactory (devam...) Program.java 39
Factory Method (devam...) Factory tasarım kalıbında, istemciye normal oluşturma mantığına maruz bırakmadan nesne oluşturulmasına olanak sağlanır ve yeni yaratılan nesneye ortak bir arayüz kullanarak erişilebilir. 40
Örnek2: ProductFactory 41
Örnek2: ProductFactory (devam...) 1. IProduct ara yüzünü yaratınız. IProduct.java 42
Örnek2: ProductFactory (devam...) 2. ProductOne somut sınıfını yaratınız. ProductOne.java 43
Örnek2: ProductFactory (devam...) 2. ProductTwo somut sınıfını yaratınız. ProductTwo.java 44
Örnek2: ProductFactory (devam...) 3. ProductFactory sınıfını yaratınız. ProductFactory.java 45
Örnek2: ProductFactory (devam...) 4. Client sınıfını yaratınız. Client.java 46
Yararlanılan Kaynaklar Aykut Taşdelen, C++, Java ve C# ile UML ve Dizayn Paternleri, Pusula Yayıncılık, İstanbul, 2014 Eric Freeman, Head First Design Patterns, O'Reilly Media,2004 Stephen Stelting & Olav Maassen, Applied Java Patterns, Prentice Hall PTR,2001 http://www.algoritmaveprogramlama.com http://www.tutorialspoint.com/ http://www.buraksenyurt.com/post/antipatterns-ders- Notlarc4b1m.aspx 47
İYİ ÇALIŞMALAR Yrd. Doç. Dr. Deniz KILINÇ deniz.kilinc@cbu.edu.tr 48