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
2
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ı
1. Ayrıştırma (Decomposition)
2. Kohezyon (Cohesion)
3. Tek Sorumluluk Prensibi (Single Responsibility)
4. Zayıf Bağlaşım Prensibi (Low Coupling)
5. Yeniden Kullanılabilirlik prensibi (Reusability)
6. Açık – Kapalı Prensibi (OCP)
7. Liskov Yerine Geçme Prensibi (LSP)
8. Bağımlılığı Ters Çevirme Prensibi (DIP)
3
Tasarım Prensipleri
Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı
4
5. Yeniden Kullanılabilirlik (Reusability)
Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı
• 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.
5
5. Yeniden Kullanılabilirlik (Reusability) (devam...)
Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı
• 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.
6
5. Yeniden Kullanılabilirlik (Reusability) (devam...)
Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı
• Doğru Tasarımı:
7
Black Box ve White Box Kavramları
Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı
• 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.
8
6. Açık/Kapalı Prensibi (OCP)
Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı
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.
9
6. Açık/Kapalı Prensibi (OCP) (devam...)
Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı
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.
10
6. Açık/Kapalı Prensibi (OCP) (devam...)
Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı
• 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 11
6. Açık/Kapalı Prensibi (OCP) (devam...)
Sekil.java Dortgen.java
Cember.java
13
6. Açık/Kapalı Prensibi (OCP) (devam...)
Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı
• 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 14
6. Açık/Kapalı Prensibi (OCP) (devam...)
Sekil.java Dortgen.java
Cember.java
16
7. Liskov Yerine Geçme Prensibi (LSP)
Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı
• 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.
17
7. Liskov Yerine Geçme Prensibi (LSP) (devam...)
Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı
• 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.
18
7. Liskov Yerine Geçme Prensibi (LSP) (devam...)
Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı
Ö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.
19
7. Liskov Yerine Geçme Prensibi (LSP) (devam...)
Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı
Örnek: DBHelper tasarımı
20
7. Liskov Yerine Geçme Prensibi (LSP) (devam...)
Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı
Örnek: DBHelper.java
21
7. Liskov Yerine Geçme Prensibi (LSP) (devam...)
Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı
Örnek: SQLHelper.java
22
7. Liskov Yerine Geçme Prensibi (LSP) (devam...)
Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı
Örnek: OracleHelper.java
23
7. Liskov Yerine Geçme Prensibi (LSP) (devam...)
Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı
Örnek: Program.java
24
7. Liskov Yerine Geçme Prensibi (LSP) (devam...)
Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı
Örnek: Program çıktısı
25
8. Bağımlılığı Ters Çevirme Prensibi (DIP)
Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı
• 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 sokulması
gerekmektedir.
26
Bağımlılığı Ters Çevirme Prensibi (DIP) (devam...)
Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı
• 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.
27
Bağımlılığı Ters Çevirme Prensibi (DIP) (devam...)
Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı
• Stock sınıfının KÖTÜ tasarımı:
28
Bağımlılığı Ters Çevirme Prensibi (DIP) (devam...)
Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı
• Stock sınıfının KÖTÜ tasarımı:
Finder.java
29
Bağımlılığı Ters Çevirme Prensibi (DIP) (devam...)
Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı
• Stock sınıfının KÖTÜ tasarımı:
Renderer.java
30
Bağımlılığı Ters Çevirme Prensibi (DIP) (devam...)
Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı
• Stock sınıfının KÖTÜ tasarımı:
Stock.java
31
Bağımlılığı Ters Çevirme Prensibi (DIP) (devam...)
Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı
• Stock sınıfının KÖTÜ tasarımı:
32
Bağımlılığı Ters Çevirme Prensibi (DIP) (devam...)
Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı
• Stock sınıfının İYİ tasarımı:
33
Bağımlılığı Ters Çevirme Prensibi (DIP) (devam...)
Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı
• Stock sınıfının İYİ tasarımı:
34
Bağımlılığı Ters Çevirme Prensibi (DIP) (devam...)
Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı
• Stock sınıfının İYİ tasarımı:
IFinder.java
35
Bağımlılığı Ters Çevirme Prensibi (DIP) (devam...)
Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı
• Stock sınıfının İYİ tasarımı:
36
Bağımlılığı Ters Çevirme Prensibi (DIP) (devam...)
Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı
• Stock sınıfının İYİ tasarımı:
wsFinder.java
37
Bağımlılığı Ters Çevirme Prensibi (DIP) (devam...)
Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı
• Stock sınıfının İYİ tasarımı:
DBFinder.java
38
Bağımlılığı Ters Çevirme Prensibi (DIP) (devam...)
Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı
• Stock sınıfının İYİ tasarımı:
39
Bağımlılığı Ters Çevirme Prensibi (DIP) (devam...)
Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı
• Stock sınıfının İYİ tasarımı:
IRenderer.java
40
Bağımlılığı Ters Çevirme Prensibi (DIP) (devam...)
Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı
• Stock sınıfının İYİ tasarımı:
41
Bağımlılığı Ters Çevirme Prensibi (DIP) (devam...)
Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı
• Stock sınıfının İYİ tasarımı:
WebRender.java
42
Bağımlılığı Ters Çevirme Prensibi (DIP) (devam...)
Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı
• Stock sınıfının İYİ tasarımı:
ConsoleRender.java
43
Bağımlılığı Ters Çevirme Prensibi (DIP) (devam...)
Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı
• Stock sınıfının İYİ tasarımı:
44
Bağımlılığı Ters Çevirme Prensibi (DIP) (devam...)
Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı
• Stock sınıfının İYİ tasarımı:
Stock.java
Yararlanılan Kaynaklar
45
• 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ı
46
İYİ ÇALIŞMALAR…
Yrd. Doç. Dr. Deniz KILINÇ
Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı