15.04.2023 Bilgiyi Paylaşım Günleri – YZM 2108 2
Yazılım Ürünü Nedir?
•Müşterinin gereksinim ve isteklerini karşılayan, bir ya da daha fazla Programdan,Veriden,Destekleyici materyalden ve Hizmetlerden oluşan bir varlıktır.
15.04.2023 Bilgiyi Paylaşım Günleri – YZM 2108 3
Yazılım Tasarımı Nedir?
Yazılım tasarımı, müşterinin gereksinim ve isteklerini karşılayan yazılım
ürününün doğasını ve bileşimini belirleme etkinliğidir.
• Yazılım tasarımında soyutlama önemli bir yere sahiptir. • Soyutlama kısaca nesnelerin veya
durumların bazı özelliklerinin görmezden gelinmesidir. • Soyutlama karmaşık problemlerin
çözümünü kolaylaştırır.
15.04.2023 Bilgiyi Paylaşım Günleri – YZM 2108 4
Yazılım Tasarımı Nedir?
Bir sistemin tasarımının yapılabilmesi için problemler ve çözümleri modellenir.
• Modelleme temel tasarım aracıdır.
15.04.2023 Bilgiyi Paylaşım Günleri – YZM 2108 5
Tasarım Kalıpları Nedir?
Tasarım kalıpları sıklıkla karşılaşılan sorunlar için sunulan standartlaştırılmış
genel çözümlerdir.
Tarihçe - I• Christopher Alexander
isminde bir mimar, inşaat çalışmalarında sıklıkla karşılaşılan sorunların çözümü için tasarım kalıpları terimini kullandı.
15.04.2023 Bilgiyi Paylaşım Günleri – YZM 2108 6
Tasarım Kalıpları Nedir? (devam...)
Tarihçe - II
• Sonrasında bu yöntemi Alexander’in arkadaşları olan Ward Cunningham ve Kent Beck yazılım sorunları için uyarladılar.
• Bu yöntem popüler hale geldi, sonrasında Erich Gamma, Richard Helm, Ralph Johnson ve John Vlissides tasarım kalıpları için kapsamlı bir kitap çıkardılar. Bu dörtlü ayrıca Gang of Four (GoF) olarak da biliniyorlar.
• Çıkardıkları kitap yanda gösterilen Design Patterns: Elements of Reusable Object – Oriented Software’dir.
15.04.2023 Bilgiyi Paylaşım Günleri – YZM 2108 7
Tasarım Kalıpları Nedir? (devam...)
Gang of Four Tasarım Kalıpları
Önceki slaytta bahsedilen bu dörtlü, kitaplarında 23 ayrı tasarım kalıbını 3 farklı kategoride incelediler:
1. Creational (5 Adet) : Nesneleri nasıl yaratalım ?
2. Stuctural (7 Adet) : Nesneleri birbiri ile nasıl ilişkilendirelim ?
3. Behavioral (11 Adet) : Nesneler çalışma zamanında nasıl davransınlar ?
15.04.2023 Bilgiyi Paylaşım Günleri – YZM 2108 8
Tasarım Kalıpları Nedir? (devam...)
Tasarım Kalıpları Nasıl Kullanılır1. Problemler ufak parçalara bölünür, önceden karşılaşılmış olanlar belirlenir.2. «Önceki problem nasıl çözüldü?» şeklinde düşünülüp, kullanılan çözüm genellenir. 3. Genellenen çözüm yöntemi o anki probleme adapte edilir.
15.04.2023 Bilgiyi Paylaşım Günleri – YZM 2108 9
Tasarım Kalıpları Nedir? (devam...)
Tasarım Kalıplarının Kullanılmasının Faydaları:
1. Kullanılan kalıpların katalogları yapılabilinir.
2. Standartlaştırılabilirler, böylece diğer kullanıcıların daha kolay karar vermelerini sağlarlar.
3. Ortak bir kelime haznesi (jargon) sağlarlar.
4. Birbirleriyle ilişkilendirilebilirler.
5. Tecrübelerin aktarılmasını sağlarlar. Tekerleği tekrardan icat edilmesine gerek kalmaz.
15.04.2023 Bilgiyi Paylaşım Günleri – YZM 2108 10
Kötü Tasarım Belirtileri
• Yazılımın çalışıyor olması ve beklenileni vermesi, arka tarafta iyi ya da kötü bir tasarım olduğunu anlamamıza yardımcı olmaz. • Kalite: Tanımı kişiden kişiye değişir, genel
olarak beklenileni karşılaması kaliteyi gösterir. Örneğin bir yazılım ürününü düşünün;• Patron: «5 lira yatırayım bu ürüne 7,5 lira verirse
kalitelidir.»• Veznedar: «Hızlı ve takılmadan çalışıyorsa
kalitelidir.»• Geliştirici: «Kodlama standartlarına uyulmuş, iyi
belgelendirilmiş ve düzgün tasarlanmışsa kalitelidir.»
15.04.2023 Bilgiyi Paylaşım Günleri – YZM 2108 11
Kötü Tasarım Belirtileri (devam...)
• Yazılım Kalitesi: Açıkca tanımlanmış işlev ve gereksinimlere
uyan (Geliştirici)Kullanıcının isteklerine yanıt veren,
(Veznedar)Yazılım geliştirme standartlarına sadık,
(Geliştirici)Yüksek güvenilirlikli, (Veznedar, Patron)Teslim sonrası destek verebilen (Geliştirici,
Veznedar)
15.04.2023 Bilgiyi Paylaşım Günleri – YZM 2108 12
Kötü Tasarım Belirtileri (devam...)
Peki bu yazılım kalitesi iyi hoş, fakat nasıl sağlanır? 1. Hataları Ayıklayarak
1. Doğrulama ve Geçerleme (Verification&Validation)- Doğru işi mi yapıyorum?- İşi doğru yaptım mı ?
2. Hataları Önleyerek1. Kalite Güvence(Q&A)2. Test Güdümlü Geliştirme(TDD)
Hata önleme, hata ayıklamadan daha önemli niye?
15.04.2023 Bilgiyi Paylaşım Günleri – YZM 2108 13
Kötü Tasarım Belirtileri (devam...)
Yazılım Kalitesini 3 şey belirler:1. Çalışma Özellikleri
- Bu yazılım çalışırken sahip olması gereken özellikler
2. Gelişme Özellikleri- Bu yazılım geliştirilirken sahip olması gereken özellikler
3. Uyumluluk Özellikleri- Yazılım geliştirildikten sonra sahip olması gereken özellikler
15.04.2023 Bilgiyi Paylaşım Günleri – YZM 2108 14
Kötü Tasarım Belirtileri (devam...)
1.Çalışma Özellikleri1. Doğruluk: İstekler doğru ve hassas
karşılanmalı2. Güvenilirlik: İşlevsel kesinti olmamalı3. Verimlilik: Donanımı iyi kullanmalı4. Korunaklılık: Yetkilendirme ile yetkisiz
kişilerin yanlış işlemler yapması önlenmeli5. Kullanılabilirlik: Kullanıcı kolayca alışıp
kullanabilmeli
15.04.2023 Bilgiyi Paylaşım Günleri – YZM 2108 15
Kötü Tasarım Belirtileri (devam...)
2. Gelişme Özellikleri1. Bakım yapılabilirlik: Bakım yapan kişiye
tertipli bir kod ve iyi belgelendirilmiş sistem bırakılmalı
2. Esneklik: Sistem öyle tasarlansın ki sonra yapılacak değişiklikler sisteme zarar vermesin
3. Test Edilebilirlik: Test edilebilen kodlar yazılmalı
15.04.2023 Bilgiyi Paylaşım Günleri – YZM 2108 16
Kötü Tasarım Belirtileri (devam...)
3. Uyumluluk Özellikleri1. Taşınabilirlik: Donanım ya da yazılım
ortamına bağlı olmasın2. Tekrar Kullanılabilirlik: Copy-paste’e ihtiyaç
duyulmasın, en ufak birime kadar ayrışıp bu biirmler tekrardan kullanılsın
3. Uyumluluk: Geliştirdiğiniz sistem önceki sistemin bulunduğu ortamdaki sistemlerle uyumlu olmalı
15.04.2023 Bilgiyi Paylaşım Günleri – YZM 2108 17
Kötü Tasarım Belirtileri (devam...)
• Yazılım kalitesi, geri bildirimler ve kod kalitesinin incelenmesi ile ölçülür. • Kötü Tasarımlar 3 önemli özelliğe sahiptir:
1. Esnemezler: Sistem, bir yerindeki herhangi bir değişikliğe çok direnç gösterir.
2. Kırılgandır: Değişiklik sonrası sistem zarar görür. Hatta çöker(Katastrofi).
3. İmmobilite: Taşınabilir değildirler. Tekrardan kullanılamazlar.
Yazılım Tasarım Prensipleri
15.04.2023 Bilgiyi Paylaşım Günleri – YZM 2108 19
Ayrıştırma (Decomposition) Kohezyon(Cohesion) Zayıf Bağlaşım Prensibi (Low Coupling Principle) SOLID nedir?
1. Single Responsibilty Principle
2. Open – Closed Principle
3. Liskov Substitution Principle
4. Interface Segregation Principle
5. Dependency Inversion Principle
Ayrıştırma (Decomposition)
15.04.2023 Bilgiyi Paylaşım Günleri – YZM 2108 20
• Karmaşık yazılım sistemlerinde karışıklığın azalması için alt birimlere bölünmesi olayıdır. İlgili varlıklar (alt birimler) tespit edilir ve nesne olarak ifade edilirler. • Sistemi alt birimlere bölme işlemine ayıca
Böl ve Fethet (Divide and Conquer) da denmektedir. • «Bu sistem nasıl çalışacak?» sorusu
yerine «Bu sistemde hangi nesneler olmalı?» sorusunun cevabı düşünülür.
Ayrıştırma (Decomposition) (devam...)
15.04.2023 Bilgiyi Paylaşım Günleri – YZM 2108 21
Fonksiyonel Ayrıştırma - I• Karmaşık bir süreç ele alınır, daha sade
ve küçük birimlere bölünür. • Bir ATM’den işlem yapmayı düşünelim.
Atm kullanarak işlem yapmak istediğinizde izleyeceğiniz adımlar
1. İlgili bankanın ATM’sini bul ve önüne git,2. Kartını slota yerleştir,3. PIN’i gir, sonrasında istediğin işleme(para
yatırma & çekme) devam et.
Ayrıştırma (Decomposition) (devam...)
15.04.2023 Bilgiyi Paylaşım Günleri – YZM 2108 22
Fonksiyonel Ayrıştırma - II• Bu süreci programlama esnasında da
aynı şekilde parçalara ayırabilirsiniz. ATM’deki yazılım o anda;
1. Kartın bilgilerini okur,2. PIN doğrulmasını gerçekleştirir,3. Seçilen işleme aktarır.
Bu adımlar daha da detaylandırılabilir.
Ayrıştırma (Decomposition) (devam...)
15.04.2023 Bilgiyi Paylaşım Günleri – YZM 2108 23
Fonksiyonel Ayrıştırma - III• Sistemin en ufak parçasına kadar
ayrıştırıldığında, bu parçaların nasıl kodlanacağı düşünülebilinir. • Sonrasında bu parçalar bir araya
getirilerek tüm sistem oluşturulur.
Kohezyon (Cohesion)
15.04.2023 Bilgiyi Paylaşım Günleri – YZM 2108 24
• Nesneler kendi verilerine ve davranışlarına sahiptir.
Örneğin: X kişisi kendi verileri olarak:• Boy,• Kilo,• Yaş, vs.
kendi davranışları ise: • Okuyabilme, • Yazabilme, • Kod Yazabilme olabilir.
Kohezyon (Cohesion) (devam...)
15.04.2023 Bilgiyi Paylaşım Günleri – YZM 2108 25
• Nesneler barındırdıkları üyeler ve metotlar arasında mantıksal kopukluk olmamalıdır.• Mantıksal uzaklık kohezyon olarak da
adlandırılmaktadır. • Örneğin bir Ressam nesnesi düşünelim.
Bu nesnenin yüksek seviyeli müzik bilgisine sahip olması beklenmez. Bu bilginin olmasını beklemek Ressam’ın niteliğini çarpıtacağı gibi, kendi alanına yoğunlaşmasını da engelleyebilir.
Kohezyon (Cohesion) (devam...)
15.04.2023 Bilgiyi Paylaşım Günleri – YZM 2108 26
• Ya da bir futbol oyuncusunu düşünelim. Bu oyuncu nesnesinin aynı zamanda Eskrim sporu ile ilgili bilgileri bilmesi beklenemez. Mantıksal kopukluk olur. • Bu örneklerdeki gibi, bir sınıfın
içerisindeki tüm fieldları ve metotları (verileri ve davranışları) arasında mantıksal yakınlık bulumalıdır. Bu mantıksal yakınlığa kohezyon denir.
Kohezyon (Cohesion) (devam...)
15.04.2023 Bilgiyi Paylaşım Günleri – YZM 2108 27
• Başka bir örnek daha vermek gerekirse bir futbolcu nesnesi düşünelim. • Sizce bir futbolcuyu kaliteli oyuncu yapan
şeyler nelerdir? • Bunların arasında topa vurma teknikleri, koşu
teknikleri gibi bilgileri bulundurması gereklidir. Yani futbolda kullanılan temel bilgilere sahip olmalıdır. • Bu durumda futbolcunun ilgisiz
teknikler yerine kendi tekniklerini ve bilgilerine sahip olması onun kohezyonunun yüksek olmasını sağlar.
Kohezyon (Cohesion) (devam...)
15.04.2023 Bilgiyi Paylaşım Günleri – YZM 2108 28
• Nesnelerin kohezyonları yüksek olursa nesneler tek amaca odaklı olurlar. • Bu durum sistemin esnekliğini ve bakım
yapılabilirliğini arttırır. • Yüksek kohezyon nesneyi yeniden
kullanılabilir kılar.
Zayıf Bağlaşım Prensibi
15.04.2023 Bilgiyi Paylaşım Günleri – YZM 2108 29
• Nesneler birbirleri ile ilgili bilgiyi tutmamalıdır. Nesneler arasındaki ilişki arayüz seviyesinde olmalıdır. • Nesnelerin birbirleri arasındaki bağlılığın
ölçütü coupling’dir.
Zayıf Bağlaşım Prensibi (devam...)
15.04.2023 Bilgiyi Paylaşım Günleri – YZM 2108 30
• Sınıflar kendi içerisinde tutarlı, diğer sınıflarla ilişiksiz olmalıdır.
Zayıf Bağlaşım Prensibi (devam...)
15.04.2023 Bilgiyi Paylaşım Günleri – YZM 2108 32
• Kaliteli futbolcu nedir? • Oyuncu kendi yapabileceklerini çok iyi bilmelidir.
Bir diğer deyişle kendini çok iyi tanımalıdır. Buna kohezyonu yüksek olmalı da diyebiliriz.
• Peki, oyundaki performansı takım arkadaşlarına bağlı ise bu futbolcu kaliteli midir? • Eğer birlikte iyi oynadığı takım arkadaşı oyun
dışında kaldığında bu oyuncu iyi oynayamıyorsa bu futbolcu kaliteli midir? • Bu futbolcunun performansı bir takım arkadaşına
bağımlı ise o oyundan çıktığında iyi performans gösteremez.
Zayıf Bağlaşım Prensibi (devam...)
15.04.2023 Bilgiyi Paylaşım Günleri – YZM 2108 33
• Kaliteli futbolcu kendi yapabileceklerini çok iyi bilmeli (yüksek kohezyon), bir takım arkadaşına bağımlı olmamalıdır (low coupling). • Takım arkadaşından bağımsız olması, o
oyuncunun farklı takımlarda da aynı performansı gösterebileceği (reusability) anlamına gelir.
Zayıf Bağlaşım Prensibi (devam...)
15.04.2023 Bilgiyi Paylaşım Günleri – YZM 2108 34
•Nesneler kendi verisini ve yapabileceklerini çok iyi bilmeli ve diğer nesnelerden bağımsız olmalıdır.
Coupling Türleri - I
1. Nil Coupling: Nesneler arasında hiç bağlılık yok.
2. Export Coupling: Nesneler birbirleriyle arayüzle bağlı. (İDEAL SEVİYEDE)
3. Overt Coupling: Bir sınıf izinler dahilinde idğer sınıfın üyelerini kullanabilmesi.
4. Covert Coupling: Bir sınıfın diğer sınıflarla friend anahtar kelimesi ile bağlı olması (C++)
Zayıf Bağlaşım Prensibi (devam...)
15.04.2023 Bilgiyi Paylaşım Günleri – YZM 2108 35
Coupling Türleri - II
5. Surreptitous Coupling: Bir sınıfın tüm içsel detaylarını başka sınıflar biliyor. Bu çok tehlikelidir. Bu seviyedeki coupling Nesneye Yönelik Programlama mantığına da aykırıdır. Sınıfların kullanımı geçersiz kalır. Bunun yerine yapısal programlama ile kodlamak daha iyi olabilir.
Örnek1: Yolcu Nesnesi
15.04.2023 Bilgiyi Paylaşım Günleri – YZM 2108 36
• Bir Yolcu sınıfı tasarlayalım. Sınıfın üye değişkenleri sonraki slayttaki UML’de belirtildi. Bu sınıfın void YolculugaBasla() metodundan aşağıdaki ifadeyi ekrana yazsın:
[YolcuAdi] [YolcuSoyadi] [aracTipi] ile [gidilecekYer] istikametinde yola çıktı.Örnek Çıktı
Örnek1: Yolcu Nesnesi
15.04.2023 Bilgiyi Paylaşım Günleri – YZM 2108 39
Otomobil.java
Motorsiklet.java
KÖ
TÜ
TAS
AR
IMI
Örnek1: Yolcu Nesnesi
15.04.2023 Bilgiyi Paylaşım Günleri – YZM 2108 40
Tasarımı düzeltmek için uygulanması gereken adımlar:1. Yolcu ile Otomobil ve Motorsiklet
sınıflarının nesnesel ve sınıfsal bağlarını kopart.
2. Yolcu içerisinde IArac interface ile bağ kur.
3. Otomobil ve Motorsiklet, IArac arayüzünü implemente etsin.
Örnek1: Yolcu Nesnesi
15.04.2023 Bilgiyi Paylaşım Günleri – YZM 2108 42
DOĞRU TASARIMIArac.java
Otomobil.java
Örnek1: Yolcu Nesnesi
15.04.2023 Bilgiyi Paylaşım Günleri – YZM 2108 44
Not: Her iki tasarım ile aynı sonucu gösterebildik. Tasarımının doğru olanın farkı sonradan eklenecek bir nesnenin sisteme zarar vermeyecek olmasıdır. Sistem esnektir.
Single Responsibility Principle
15.04.2023 Bilgiyi Paylaşım Günleri – YZM 2108 47
• Bu prensibe göre her sınıfın tek bir görevi olmalıdır. Kohezyon tanımı bu prensibin açıklandığı makalede ilk olarak yapılmıştır. • SRP’ye göre sınıflar tek bir amaç
doğrultusunda yazılmalı ve değiştirilmelidir. Birden fazla amaç var ise ayrıştırmaya daha da devam edilebileceği anlamına gelir.
Örnek2: Dikdortgen Sınıfı
15.04.2023 Bilgiyi Paylaşım Günleri – YZM 2108 48
• Aşağıda UML’i verilen Dikdortgen sınıfını oluşturalım ve kodlayalım.
Örnek2: Dikdortgen Sınıfı (devam...)
15.04.2023 Bilgiyi Paylaşım Günleri – YZM 2108 49
• Dikdortgen sınıfını tek sorumluluk prensibine göre tekrardan oluşturunuz. Coupling’i arayüz seviyesinde tutunuz.
Kaynakça
50
• Aykut Taşdelen, C++, Java ve C# ile UML ve Dizayn Paternleri, Pusula Yayıncılık, İstanbul, 2014
• Microsoft Patterns & Practices Team, Microsoft® Application Architecture Guide (Patterns & Practices), Microsoft Press - Second Edition, 2009
• http://www.tutorialspoint.com• http://www.javaturk.org• http://www.stackoverflow.com• http://www.minepla.net/Bu konular ile ilgili daha kapsamlı sunumlar için: http://algoritmaveprogramlama.com/algoritma-dersleri/yazilim-mimarisi-ve-tasarimi/
Bilgiyi Paylaşım Günleri – YZM 2108