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ğı

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.

Detaylı