Bu Kitap Kimin İçin Yazıldı?
15
2. Baskıda Yapılan Değişiklikler
19
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
4.1. En Çok Kullanılan 10 Yazılım Mimarisi Kalıbı
49
4.1.1. Katmanlı Mimari
49
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.3. Entegrasyon Testleri
69
6.2. Fonksiyonel Olmayan Testler
70
6.2.1. Performans 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
8. GÜVENLİ YAZILIM GELİŞTİRME
83
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.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.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.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.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.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.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.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.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.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.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.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