İÇİNDEKİLER
İçindekiler
Ön Söz 5
Teşekkür 7
Bu Kitap Kimin İçin Yazıldı? 15
Kitabın Amacı 17
2. Baskıda Yapılan Değişiklikler 19
Birinci Bölüm
KALİTELİ YAZILIMIN TEMELLERİ
1. NESNE YÖNELİMLİ PROGRAMLAMANIN 4 PRENSİBİ 22
Sosyal Bir Aktivite Olarak Yazılım Geliştirme 29
2. TASARIM ŞABLONLARI (DESIGN PATTERNS) 31
2.1. En Çok Kullanılan 9 Tasarım Kalıbı 32
2.1.1. Yapıcı (Creational) 32
2.1.1.1. Singleton (Tek Nesne) 32
2.1.1.2. Builder (İnşa Eden) 33
2.1.1.3. Factory (Fabrika) 34
2.1.2. Yapısal (Structural) 34
2.1.2.1. Adapter (Adaptör) 34
2.1.2.2. Decorator (Dekoratör) 35
2.1.2.3. Facade (Cephe) 35
2.1.3. Davranışsal (Behavioral) 36
2.1.3.1. Observer (Gözlemci) 36
2.1.3.2. Strategy (Strateji) 37
2.1.3.3. State (Durum) 38
Versiyon Kontrol Sistemleri Nasıl Kullanılmalı? 40
3. SOLID PRENSİPLERİ 43
Güzel Ortalamadır 46
4. YAZILIM MİMARİLERİ 48
4.1. En Çok Kullanılan 10 Yazılım Mimarisi Kalıbı 49
4.1.1. Katmanlı Mimari 49
4.1.2. MVC 50
4.1.3. SOA (Servis Tabanlı Mimari) 51
4.1.4. Mikroservis Mimarisi 52
4.1.5. Mikrokernel (Plug–In) 53
4.1.6. Pipeline (Boru Hattı Mimarisi) 54
4.1.7. CQRS (Command and Query Responsibility Segregation– Komut ve Sorgu Sorumluluklarının Ayrılması) 55
4.1.8. Event Sourcing (Olay Kaynaklı Mimari) 56
4.1.9. Broker Pattern (Aracı Mimari Kalıbı) 57
4.1.10. Event Driven Architecture (Olaya Dayalı Mimari) 59
Yazılımcının Sırt Çantasında Neler Olmalı? 61
5. YAZILIMIN 10 KALİTE ÖZELLİĞİ 64
Yazılım Geliştirmede Kırık Camlar Teorisi 67
6. YAZILIM TEST YÖNTEMLERİ 68
6.1. Fonksiyonel Testler 69
6.1.2. Birim Testler 69
6.1.3. Entegrasyon Testleri 69
6.1.4. Sistem Testi 69
6.1.5. Kabul Testi 69
6.2. Fonksiyonel Olmayan Testler 70
6.2.1. Performans Testi 70
6.2.2. Güvenlik Testi 70
6.2.3. Kullanılabilirlik Testi 70
6.2.4. Uyumluluk Testi 70
Yazılımda Ölçüm Yöntemleri 71
7. YAZILIM GELİŞTİRME SÜREÇLERİ 74
7.1. Waterfall (Şelale) Modeli 74
7.2. V Modeli 75
7.3. Çevik Yöntemler 76
Teknik Borç Nedir? 80
8. GÜVENLİ YAZILIM GELİŞTİRME 83
İkinci Bölüm
KOD DÜZENLEME TEKNİKLERİ
1. KOD DÜZENLEMEYE GİRİŞ 87
1.1. Refactoring Nedir? 91
1.2. Refactoring Ne Değildir? 94
1.3. Neden Refactor Etmeliyim? 95
1.4. Neden Refactor Etmemeliyim? 97
Bir Restorasyon Hikayesi 97
1.5. Refactoring Yazılım Geliştirme Süreçlerinin Neresinde? 98
1.6. Refactoring Nasıl ve Ne Zaman Uygulanır? 99
1.7. Refactoring Otomatik Olarak Yapılamıyor Mu? 101
1.8. Doğru Refactor Edebilmek İçin Sahip Olunması Gereken Temeller 102
1.9. Yöneticime Kod Düzenlemeyi Nasıl Anlatırım? 106
1.10. Refactoring Başarı Ölçütleri Nelerdir? 107
1.11. Hangi Araçları Kullanabilirim? 108
2. PROBLEMİN TESPİTİ 109
2.1. Kirli Kod Belirteçleri 110
2.1.1. Tekrarlayan Kod (Duplicated Code) 112
2.2.2. Uzun Metod (Long Method) 114
2.2.3. Büyük Sınıf (Large Class) 117
2.2.4. Uzun Parametre Listesi (Long Parameter List) 119
2.2.5. Alakasız Değişiklikler (Divergent Change) 121
2.2.6. Av Tüfeği Ameliyatı (Shotgun Surgery) 123
2.2.7. Özellik Kıskançlığı (Feature Envy) 125
2.2.8. Veri Grupları (Data Clumps) 127
2.2.9. İlkellik Takıntısı (Primitive Obsession) 128
2.2.10. Anahtar İfadeleri (Switch Statements) 129
2.2.11. Paralel Kalıtım Hiyerarşileri (Parallel Inheritance Hierarchies) 132
2.2.12. Tembel Sınıf (Lazy Class) 134
2.2.13. Spekülatif/Kurgusal Genellik (Speculative Generality) 135
2.2.14. Geçici Alanlar (Temporary Field) 137
2.2.15. Mesaj Zincirleri (Message Chains) 140
2.2.16. Ortadaki Adam (Middle Man) 142
2.2.17. Uygunsuz Samimiyet (Inappropriate Intimacy) 144
2.2.18. Farklı Arayüzlerden Alternatif Sınıflar (Alternative Classes with Different Interfaces) 146
2.2.19. Eksik Kütüphane Sınıfı (Incomplete Library Class) 148
2.2.20. Veri Sınıfı (Data Class) 150
2.2.21. Reddedilen Miras (Refused Bequest) 152
2.2.22. Yorumlar (Comments) 153
2.3. Bazen Kodu Okumak Yetmez 156
2.3.1. Kuş Bakışı Bakın – Code City Aracı 156
2.3.2. VKS Geçmişine Bir De Bu Gözle Bakın 157
2.3.3. Kod Karmaşıklığı 159
2.3.4. İsimlendirme 160
2.3.5. Dolaylı Bağımlı Kodları Tespit Etmek 160
2.3.6. Commit Mesajları Çok Şey Anlatabilir – Kelime Bulutları (Word Cloud) 161
3. KOD DÜZENLEME TEKNİKLERİ 161
3.1. Yazılımda Kon–Mari Tekniği 162
3.2. Refactoring Teknikleri Kataloğu 164
3.3. Şekilsel Değişiklikler 170
3.3.1. Ayırma 170
3.3.1.1. Metotları Bölme (Extract Method) 171
3.3.1.2. Sınıfları Bölme (Extract Class) 172
3.3.1.3. Üst Sınıf Oluşturma (Extract Superclass) 174
3.3.1.4. Alt Sınıf Oluşturma (Extract Subclass) 176
3.3.1.5. Arayüz Oluşturma (Extract Interface) 177
3.3.1.6. Geçici Değişkenleri Ayırma (Split Temporary Variable) 180
3.3.1.7. Koşul İfadelerini Metotlara Ayırma (Decompose Conditional) 182
3.3.1.8. Sorgu ve Kayıt İşlemlerini Ayırmak (Separate Query from Modifier) 183
3.3.1.9. Geçici Değişkenleri Metotlara Ayırma ( Temp With Query) 185
3.3.1.10. Parametreleri Metoda Çevirme ( Parameter with Explicit Methods) 187
3.3.2. Birleştirme 189
3.3.2.1. Sınıfları Birleştirme (Inline Class) 189
3.3.2.2. Metotları Parametre ile Birleştirme (Parameterize Method) 191
3.3.2.3. Alanları Üst Sınıfta Birleştirme (Pull Up Field) 192
3.3.2.4. Metotları Üst Sınıfta Birleştirme (Pull Up Method) 194
3.3.2.5. Yapıcı Metotları Üst Sınıfta Birleştirme (Pull Up Constructor Body) 196
3.3.2.6. Koşul İfadelerini Birleştirme (Consolidate Conditional Expression) 198
3.3.2.7. Tekrarlı Koşul Bloklarını Birleştirmek (Consolidate Duplicate Conditional Fragments) 200
3.3.2.8. Hiyerarşileri Birleştirme (Collapse Hierarchy) 201
3.3.2.9. Alt Sınıfları Üst Sınıfta Alan Halinde Birleştirme ( Subclass with Fields) 203
3.3.3. Taşıma 204
3.3.3.1. Alanı Taşıma (Move Field) 205
3.3.3.2. Metodu Taşıma (Move Method) 206
3.3.3.3. Alanı Alt Sınıfa Taşıma (Push Down Field) 207
3.3.3.4. Metodu Alt Sınıfa Taşıma (Push Down Method) 208
3.3.4. Ekleme 209
3.3.4.1. Parametre Ekleme (Add Parameter) 210
3.3.4.2. Parametrelere Yapılan Atamalar için Değişken Oluşturma (Remove Assignments to Parameters) 211
3.3.5. Temizleme 214
3.3.5.1. Metodu Kaldırma (Inline Method) 214
3.3.5.2. Değişkeni Kaldırma (Inline Temp) 216
3.3.5.3. Yorumları Silme (Remove Comments) 217
3.3.5.4. Parametreyi Kaldırma (Remove Parameter) 218
3.3.5.5. Kontrol Bayraklarını Kaldırma (Remove Control Flag) 219
3.3.6. İsimlendirme 220
3.3.6.1. Metotları İsimlendirme (Rename Method) 220
3.3.6.2. Sayıları Sabitlerle İsimlendirme ( Magic Number with Symbolic Constant) 222
3.3.6.3. Karmaşık İfadeleri için Değişken Oluşturma (Introduce Explaning Variable) 223
3.4. Mantıksal Değişiklikler 224
3.4.1. Algoritmayı Güncelleme (Substitute Algorithm) 224
3.4.2. Koşul İfadeleri 226
3.4.2.1. İç İçe Koşul Bloklarını Sıralı Bloklara Çevir ( Nested Conditional with Guard Clauses) 226
3.4.2.2. Koşulları Poymorphism ile Değiştir ( Conditional with Polymorphism) 227
3.4.3. Veri Yapıları 229
3.4.3.1. Alanları Kapsülleme (Encapsulate Field) 230
3.4.3.2. Kendi Alanlarını Kapsülleme (Self Encapsulate Field) 231
3.4.3.3. Koleksiyonları Kapsülleme (Encapsulate Collection) 232
3.4.3.4.Paylaşılan Veri Yapısını Çoklamak (Duplicate Observed Data) 234
3.4.3.5. Referansı Değere Çevirme (Change Reference to Value) 236
3.4.3.6. Değeri Referansa Çevirme (Change Value to Reference) 238
3.4.3.7. Tek Taraflı İlişkileri Çift Taraflıya Çevirme (Change Unidirectional Association to Bidirectional) 239
3.4.3.8. İki taraflı İlişkiyi Tek Taraflıya Çevirme (Change Bidirectional Association to Unidirectional) 240
3.4.4. Nesneleştirme 241
3.4.4.1. Diziyi Objeye Çevirme ( Array with Object) 242
3.4.4.2. Veri Alanlarını Objeye Çevirme ( Data Value with Object) 243
3.4.4.3. Veritabanı Kayıtlarını Veri Sınıflarına Çevirme ( Record with Data Class) 244
3.4.4.4. Parametreleri Objeye Çevirme (Introduce Parameter Object) 245
3.4.4.5. Tip Kodlarını Sınıfa Çevirme ( Type Code with Class) 247
3.4.4.6. Null Obje Oluşturma (Introduce Null Object) 248
3.4.4.7. Obje Alanlarını Bir Araya Toplama (Preserve Whole Object) 250
3.4.4.8. Metodu Metot Objesine Çevirme ( Method with Method Object) 251
3.4.4.9. Yapıcı Metotları Fabrika Metoda Çevir ( Constructor with Factory Method) 253
3.4.5. Hiyerarşiler 255
3.4.5.1. Metotları Form Taslağı Olarak Uygula (Form Template Method) 255
3.4.5.2. Kalıtım Yerine Delegasyon Kullan ( Inheritance with Delegation) 258
3.4.5.3. Delegasyon Yerine Kalıtım Kullan ( Delegation with Inheritance) 259
3.4.5.4. Tip Kodları Yerine Alt Sınıf Kullan ( Type Code with Subclasses) 261
3.4.5.6. Tip Kodlarını State/Strategy Şablonuna Çevir ( Type Code with State/Strategy) 264
3.4.6. Sınıflar Arası Erişimler 266
3.4.6.1. Delegasyonu Gizle (Hide Delegate) 266
3.4.6.2. Ortadaki Adamı Kaldır (Remove Middle Man) 268
3.4.6.3. Metotları Gizle (Hide Method) 270
3.4.6.4. Gerekli Olmayan Atama Metotlarını Kaldır (Remove Setting Method) 271
3.4.6.5. Alt Sınıfa Dönüşümleri Kapsülle (Encapsulate Downcast) 272
3.4.6.6. Davranışı Sınıfa Taşı (Moving Behavior into the Class) 274
3.4.6.7. Parametreyi Metoda Çevir ( Parameter with Method) 275
3.4.6.8. Yerel Eklenti Sınıfı Oluştur (Introduce Local Extension) 277
3.4.6.9. Yabancı Metot Oluştur (Introduce Foreign Method) 278
3.4.7. Hata Ayıklama ve Kontroller 280
3.4.7.1. Hata Kodlarını Exception ile Değiştir ( Error Code with Exception) 280
3.4.7.2. Exceptionları Testler ile Değiştir ( Exception with Test) 282
3.4.7.3. Assertion Kullan (Introduce Assertion) 284
4. DİĞER DÜZENLEME ALANLARI 285
4.1. Veritabanı Düzenleme (Database refactoring) 285
4.2. UML Düzenleme (UML refactoring) 287
4.3. Mikroservisleri Düzenleme (Refactoring microservices) 289
4.4. Mimari Düzenleme (Architectural refactoring) 290
Son Söz 293
Kaynakça 295
Kavram Dizini 297 |