46
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

YZM 2108 Yazılım Mimarisi ve Tasarımı...16 7. Liskov Yerine Geçme Prensibi (LSP) Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı •Barbara Liskov tarafındanformüleedilen

  • Upload
    others

  • View
    16

  • Download
    0

Embed Size (px)

Citation preview

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

Celal Bayar Üniversitesi 12

6. Açık/Kapalı

Prensibi (OCP)(devam...)

Ciz.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

Celal Bayar Üniversitesi 15

6. Açık/Kapalı Prensibi (OCP) (devam...)

Ciz.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Ç

[email protected]

Celal Bayar Üniversitesi - YZM 2108 Yazılım Mimarisi ve Tasarımı