Tasarım Prensipleri
Transkript
Tasarım Prensipleri
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 Prensipleri Bu bölümde; Tasarım Prensipleri ile ilgili konular anlatılacaktır. Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı 2 Tasarım Prensipleri 1. 2. 3. 4. 5. 6. 7. 8. Ayrıştırma (Decomposition) Kohezyon (Cohesion) Tek Sorumluluk Prensibi (Single Responsibility) Zayıf Bağlaşım Prensibi (Low Coupling) Yeniden Kullanılabilirlik prensibi (Reusability) Açık – Kapalı Prensibi (OCP) Liskov Yerine Geçme Prensibi (LSP) Bağımlılığı Ters Çevirme Prensibi (DIP) Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı 3 5. Yeniden Kullanılabilirlik (Reusability) • Yeniden kullanılabilirlik nesne yönelimli programlamanın en önemli özelliklerinden biridir ve çoğu zaman, yanlış bir yaklaşımla sadece kalıtımdan ibaret olduğu sanılır. • Oysa kalıtım yeniden kullanılabilirliği sağlama noktasında her zaman yeterli olmaz. • Salt kalıtım yerine, kalıtım ile birlikte nesneler arasında kompozisyon kurgulanmalıdır. Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı 4 5. Yeniden Kullanılabilirlik (Reusability) (devam...) • Yandaki gibi bir raporlama sınıfı yazıldığında, Rapor sınıfına gereğinden fazla sorumluluk yüklenmiştir. Bu sınıftan türetilen sınıflar yeniden kullanıma doğru bir örnek teşkil etmemektedirler. • Doğru olan yaklaşım Rapor sınıfının içinde bu işlemleri kodlamak yerine, veri tabanı ve yazıcı işlemlerinin ayrı sınıflarda yapılması ve bu sınıflarla bir composition sağlanmasıdır. Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı 5 5. Yeniden Kullanılabilirlik (Reusability) (devam...) • Doğru Tasarımı: Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı 6 Black Box ve White Box Kavramları • GoF doktrin’de yeniden kullanılabilirlik bu kavramlarla ikiye ayrılmıştır: – White Box sınıf türetmesine dayalıdır ve salt türetme bazı tasarımsal sakıncalar doğurabilmektedir. – Black Box ise nesne kompozisyonuna dayalıdır. • Yani önceki örnekte ele alınan Rapor sınıfı gibi sarmalayıcı bir sınıf, VeriTabanilslemleri ve YaziciIslemleri sınıflarına ait nesneleri kullanarak, yani composition yaparak, "black box reusability" sağlamaktadır. Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı 7 6. Açık/Kapalı Prensibi (OCP) Değişim gerektirmeyen yazılımın ömrü bitmiştir. • Yazılımlar, kullanıcı beklentileri değiştikçe değişime uğramaktadır. • Bu noktada yapılması gereken şey yazılım sisteminin herhangi bir yerindeki değişimin başka yerlerde de zincirleme değişim gerektirmeyecek şekilde tasarlanmasıdır. • Böylece ufak bir değişimde oluşabilecek kargaşa engellenmiş olur. Değişim kargaşasını önlemek için esnemez tasarımlardan uzak durulmalıdır. Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı 8 6. Açık/Kapalı Prensibi (OCP) (devam...) Sistemler gelişime açık, ancak değişime kapalı olmalıdır. Bertnard Meyer • Bu prensibe göre, sistemlerdeki değişimleri kodları değiştirerek gerçekleştirmek yerine yeni kod blokları eklenerek yapılması öngörülmektedir. Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı 9 6. Açık/Kapalı Prensibi (OCP) (devam...) • Yandaki UML ile gösterilen Dortgen ve Cember sınıfları Sekil sınıfından türetilmiştir. Bu sınıflar Ciz sınıfı ile composition yapmaktadır. • Ciz sınıfı verilen parametreye bağlı olarak şekli çizecek fonksiyonu çalıştıracaktır. • Böyle bir tasarım esnemezdir ve dolayısıyla kırılgandır. • Sekil sınıfından yeni bir şekil sınıfı türetildiğinde Ciz sınıfında da değişmesi gerekecektir. Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı 10 6. Açık/Kapalı Prensibi (OCP) (devam...) Sekil.java Dortgen.java Cember.java Celal Bayar Üniversitesi 11 Ciz.java 6. Açık/Kapalı Prensibi (OCP) (devam...) Celal Bayar Üniversitesi 12 6. Açık/Kapalı Prensibi (OCP) (devam...) • Doğru tasarım Sekil sınıfının soyut sınıf ya da ara yüz şeklinde tanımlanarak yapılabilir. Bu sınıftan türetilen sınıflar da kendi ihtiyaçlarına göre implemente edilmelidir. Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı 13 6. Açık/Kapalı Prensibi (OCP) (devam...) Sekil.java Dortgen.java Cember.java Celal Bayar Üniversitesi 14 6. Açık/Kapalı Prensibi (OCP) (devam...) Ciz.java Celal Bayar Üniversitesi 15 7. Liskov Yerine Geçme Prensibi (LSP) • Barbara Liskov tarafından formüle edilen ve Açık-Kapalı prensibi ile yakından ilgili olan bu prensip, türemiş sınıf nesnelerinin taban sınıf nesnesi yerine geçmesini öngörür. • Daha açık bir ifadeyle, taban sınıf türündeki nesne üzerinde operasyon yapacak şekilde geliştirilmiş bir fonksiyon, bu sınıftan türeyen farklı sınıflara ait nesneler üzerinde de aynı operasyonu yapabilmelidir. Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı 16 7. Liskov Yerine Geçme Prensibi (LSP) (devam...) • Bu prensip türemiş sınıf türündeki nesnelerin taban sınıfa ait nesnelere atanması halinde gerçekleşen otomatik tür dönüşümünden (upcast) faydalanır. Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı 17 7. Liskov Yerine Geçme Prensibi (LSP) (devam...) Örnek: • Veritabanından bağımsız bir veri katmanı yazılmak istenmiştir. • Bu yapı yeni veri tabanları için yeni sınıf eklenebilirliği gerekmemesiyle hem Açık-Kapalı prensibine, hem de DBHelper türünden aldığı parametreden dolay Liskov prensibiyle uygundur. Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı 18 7. Liskov Yerine Geçme Prensibi (LSP) (devam...) Örnek: DBHelper tasarımı Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı 19 7. Liskov Yerine Geçme Prensibi (LSP) (devam...) Örnek: DBHelper.java Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı 20 7. Liskov Yerine Geçme Prensibi (LSP) (devam...) Örnek: SQLHelper.java Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı 21 7. Liskov Yerine Geçme Prensibi (LSP) (devam...) Örnek: OracleHelper.java Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı 22 7. Liskov Yerine Geçme Prensibi (LSP) (devam...) Örnek: Program.java Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı 23 7. Liskov Yerine Geçme Prensibi (LSP) (devam...) Örnek: Program çıktısı Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı 24 8. Bağımlılığı Ters Çevirme Prensibi (DIP) • Bağımlılığı Ters Çevirme prensibi (Dependency Inversion Principle) yüksek seviyeli sınıfların, aşağı seviyeli sınıflarla doğrudan bir bağımlılığının olmamasını öngörmektedir. • Bağımlılığın artmaması için – yüksek seviyeli sınıflar ile – düşük seviyeli sınıfların arasına bir ara yüz ya da soyut sınıf gerekmektedir. Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı sokulması 25 Bağımlılığı Ters Çevirme Prensibi (DIP) (devam...) • Düşük seviyeli sınıflar, uygulamadaki temel işlevleri yerine getirirler. – Örn.: Stok takip uygulamasında kota bilgilerini alan Finder sınıfı ya da sayfada bu bilgileri göstermeye yarayan Renderer sınıfı gibi sınıflardır. • Öte yandan bu sınıfları kullanarak çalışan Stock sınıfı ise yüksek seviyeli bir sınıftır. Yüksek seviyeli sınıflar aşağı seviyeli sınıfları anlamlı kılarlar. Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı 26 Bağımlılığı Ters Çevirme Prensibi (DIP) (devam...) • Stock sınıfının KÖTÜ tasarımı: Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı 27 Bağımlılığı Ters Çevirme Prensibi (DIP) (devam...) • Stock sınıfının KÖTÜ tasarımı: Finder.java Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı 28 Bağımlılığı Ters Çevirme Prensibi (DIP) (devam...) • Stock sınıfının KÖTÜ tasarımı: Renderer.java Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı 29 Bağımlılığı Ters Çevirme Prensibi (DIP) (devam...) • Stock sınıfının KÖTÜ tasarımı: Stock.java Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı 30 Bağımlılığı Ters Çevirme Prensibi (DIP) (devam...) • Stock sınıfının KÖTÜ tasarımı: Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı 31 Bağımlılığı Ters Çevirme Prensibi (DIP) (devam...) • Stock sınıfının İYİ tasarımı: Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı 32 Bağımlılığı Ters Çevirme Prensibi (DIP) (devam...) • Stock sınıfının İYİ tasarımı: Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı 33 Bağımlılığı Ters Çevirme Prensibi (DIP) (devam...) • Stock sınıfının İYİ tasarımı: IFinder.java Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı 34 Bağımlılığı Ters Çevirme Prensibi (DIP) (devam...) • Stock sınıfının İYİ tasarımı: Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı 35 Bağımlılığı Ters Çevirme Prensibi (DIP) (devam...) • Stock sınıfının İYİ tasarımı: wsFinder.java Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı 36 Bağımlılığı Ters Çevirme Prensibi (DIP) (devam...) • Stock sınıfının İYİ tasarımı: DBFinder.java Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı 37 Bağımlılığı Ters Çevirme Prensibi (DIP) (devam...) • Stock sınıfının İYİ tasarımı: Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı 38 Bağımlılığı Ters Çevirme Prensibi (DIP) (devam...) • Stock sınıfının İYİ tasarımı: IRenderer.java Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı 39 Bağımlılığı Ters Çevirme Prensibi (DIP) (devam...) • Stock sınıfının İYİ tasarımı: Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı 40 Bağımlılığı Ters Çevirme Prensibi (DIP) (devam...) • Stock sınıfının İYİ tasarımı: WebRender.java Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı 41 Bağımlılığı Ters Çevirme Prensibi (DIP) (devam...) • Stock sınıfının İYİ tasarımı: ConsoleRender.java Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı 42 Bağımlılığı Ters Çevirme Prensibi (DIP) (devam...) • Stock sınıfının İYİ tasarımı: Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı 43 Bağımlılığı Ters Çevirme Prensibi (DIP) (devam...) • Stock sınıfının İYİ tasarımı: Stock.java Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı 44 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 Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı 45 İYİ ÇALIŞMALAR… Yrd. Doç. Dr. Deniz KILINÇ [email protected] Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı 46
Benzer belgeler
Anti-Pattern - Algoritma ve Programlama Bilgi Kaynağı
sınıfları (Kare, Cember, Dikdortgen) yaratınız.
Sonrasında factory sınıfı olan SekilFactory sınıfını
yaratınız.