Piramitsel ve Çekirdek programlama Test 2

Soru 09 / 10

🎓 Piramitsel ve Çekirdek programlama Test 2 - Ders Notu

Merhaba öğrenci! Bu ders notu, "Piramitsel ve Çekirdek programlama Test 2" sınavında karşılaşabileceğin temel yazılım mimarisi, tasarım prensipleri, yaygın programlama kalıpları ve test stratejileri konularını sade ve anlaşılır bir dille özetlemektedir.

📌 Yazılım Mimarileri ve Katmanlı Tasarım

Yazılım projelerinde düzeni sağlamak, yönetilebilirliği artırmak ve gelecekteki değişikliklere uyum sağlayabilmek için kullanılan yapısal yaklaşımlardır.

  • Katmanlı Mimari Kavramı: Uygulamayı farklı sorumluluklara sahip bağımsız katmanlara ayırma prensibidir.
  • Faydaları: Modülerlik, kodun yeniden kullanılabilirliği, kolay bakım ve test edilebilirlik sağlar.
  • Yaygın Katmanlar:
    • Sunum (Presentation) Katmanı: Kullanıcı arayüzü ve kullanıcıyla etkileşimi yönetir. (Örn: Web arayüzü, mobil uygulama ekranları)
    • İş Mantığı (Business Logic) Katmanı: Uygulamanın temel kurallarını ve süreçlerini içerir. (Örn: Sipariş işleme, kullanıcı doğrulama)
    • Veri Erişim (Data Access) Katmanı: Veritabanı veya diğer veri kaynaklarıyla iletişimi sağlar. (Örn: Veri kaydetme, sorgulama)
  • Mimari Desenler (MVC/MVVM): Belirli sorunları çözmek ve kod organizasyonunu sağlamak için kullanılan yaygın kalıplardır.
    • MVC (Model-View-Controller):
      • Model: Veriyi ve iş mantığını temsil eder.
      • View: Kullanıcıya sunulan arayüzdür.
      • Controller: Model ve View arasındaki iletişimi yönetir, kullanıcı girdilerini işler.
    • MVVM (Model-View-ViewModel): Özellikle modern UI (Kullanıcı Arayüzü) geliştirmede (WPF, Xamarin, Angular, React gibi) popülerdir.
      • ViewModel: View için veri ve komutları sağlar, Model ile View arasındaki köprüdür.
      • View'ın Model'den doğrudan bağımlılığını azaltarak test edilebilirliği artırır.

💡 İpucu: Katmanlı mimari, bir binanın katları gibidir; her katın belirli bir görevi vardır ve birbiriyle düzenli bir şekilde etkileşir.

📌 Temel Programlama Prensipleri ve Desenleri

Daha temiz, esnek, sürdürülebilir ve hata oranı düşük kod yazmak için kullanılan genel kurallar ve sık karşılaşılan sorunlara kanıtlanmış çözümlerdir.

  • SOLID Prensipleri: Nesne Yönelimli Programlama (OOP) tasarımında rehberlik eden 5 temel prensiptir.
    • S (Single Responsibility Principle - Tek Sorumluluk Prensibi): Bir sınıfın veya modülün yalnızca tek bir sorumluluğu olmalıdır. (Örn: Bir sınıf sadece kullanıcı yönetimi yapmalı, hem kullanıcı hem de ürün yönetimi yapmamalı.)
    • O (Open/Closed Principle - Açık/Kapalı Prensibi): Yazılım varlıkları (sınıflar, modüller vb.) geliştirmeye açık, değiştirmeye kapalı olmalıdır. (Mevcut kodu değiştirmeden yeni özellikler ekleyebilmelisin.)
    • L (Liskov Substitution Principle - Liskov Yerine Geçme Prensibi): Alt sınıflar (türetilmiş sınıflar), temel sınıfların (ebeveyn sınıflar) yerine geçebilmelidir. (Bir kedi bir hayvanın yerine geçebilmeli ve hayvanın tüm özelliklerini sorunsuz kullanabilmeli.)
    • I (Interface Segregation Principle - Arayüz Ayırma Prensibi): Müşteriler (kullanıcı sınıflar), kullanmadıkları metotlara bağımlı olmaya zorlanmamalıdır. (Büyük bir arayüz yerine, daha küçük ve özelleşmiş arayüzler kullan.)
    • D (Dependency Inversion Principle - Bağımlılığın Tersine Çevrilmesi Prensibi): Üst seviye modüller alt seviye modüllere değil, soyutlamalara (arayüzler, soyut sınıflar) bağımlı olmalıdır. (Somut uygulamalar yerine arayüzlere bağımlı ol.)
  • Tasarım Desenleri: Yazılım tasarımında sık karşılaşılan sorunlara standart çözümler sunan kalıplardır.
    • Singleton Deseni: Bir sınıftan yalnızca tek bir nesne (örnek) oluşturulmasını sağlar.
      • Kullanım Alanı: Veritabanı bağlantı yöneticisi, loglama servisi gibi uygulama genelinde tek bir örneği olması gereken durumlar.
      • ⚠️ Dikkat: Aşırı kullanımı bağımlılıkları artırabilir ve test etmeyi zorlaştırabilir.
    • Factory Method Deseni: Nesne oluşturma mantığını bir arayüz veya soyut sınıfa devreder, böylece alt sınıflar hangi nesnenin oluşturulacağına karar verir.
      • Kullanım Alanı: Farklı türde nesneler oluşturmanız gerektiğinde, ancak oluşturma mantığını merkezi bir yerde tutmak istediğinizde. (Örn: Farklı türde raporlar oluşturma.)
    • Strategy Deseni: Bir algoritma ailesini tanımlar ve her algoritmayı ayrı bir sınıfa koyar, böylece çalışma zamanında algoritmalar kolayca değiştirilebilir.
      • Kullanım Alanı: Farklı ödeme yöntemleri (kredi kartı, PayPal), farklı sıralama algoritmaları.
    • Observer Deseni: Bir nesnenin (Subject) durumundaki değişiklikleri, ona bağımlı olan diğer nesnelere (Observer) otomatik olarak bildirmesini sağlar.
      • Kullanım Alanı: Haber bülteni aboneliği, bildirim sistemleri, kullanıcı arayüzü güncellemeleri.
  • Hata Yönetimi ve İstisnalar (Exception Handling): Programın çalışma anında beklenmedik durumları veya hataları ele alma mekanizmasıdır.
    • `try-catch-finally` Blokları:
      • `try`: Hata potansiyeli olan kod bloğu.
      • `catch`: Belirli bir hata (istisna) oluştuğunda çalışacak kod bloğu.
      • `finally`: Hata olsun veya olmasın her zaman çalışacak kod bloğu (kaynakları serbest bırakmak için idealdir).
    • Özel İstisna Sınıfları: Uygulamaya özgü hataları daha anlamlı hale getirmek için kendi istisna sınıflarınızı oluşturabilirsiniz.
    • Faydaları: Programın çökmesini engellemek, kullanıcıya anlamlı geri bildirim sağlamak, hata ayıklamayı kolaylaştırmak.

⚠️ Dikkat: Tasarım desenlerini ezberlemek yerine, hangi sorunu çözdüklerini ve ne zaman kullanıldıklarını anlamak, gerçek projelerde size daha çok yardımcı olacaktır.

📌 Test Edilebilirlik ve Birim Testleri

Yazılımın doğru çalıştığından emin olmak, hataları erken aşamada tespit etmek ve kod kalitesini sürekli yüksek tutmak için kullanılan yöntemlerdir.

  • Birim Testleri (Unit Tests):
    • Tanım: Uygulamanın en küçük, bağımsız parçalarının (metotlar, sınıflar) beklendiği gibi çalışıp çalışmadığını kontrol eden testlerdir.
    • Önemi: Hataları geliştirme aşamasında yakalar, kod kalitesini artırır, kod üzerinde güvenle değişiklik yapma (refactoring) imkanı sağlar.
    • Özellikleri: Hızlı çalışmalı, diğer testlerden veya dış bağımlılıklardan (veritabanı, ağ) izole olmalı, tekrarlanabilir olmalı.
  • Test Güdümlü Geliştirme (TDD - Test-Driven Development):
    • Süreç:
      1. Önce başarısız olacak bir test yaz (Kırmızı).
      2. Testi geçecek minimum kodu yaz (Yeşil).
      3. Kodu yeniden düzenle (Refactor), yani temizle ve optimize et.
    • Faydaları: Temiz ve modüler tasarım, daha az hata, yüksek test kapsamı, geliştirme sürecine güven.
  • Mocking ve Stubbing: Birim testlerinde dış bağımlılıkları (veritabanı, ağ servisleri, diğer sınıflar) izole etmek için kullanılan tekniklerdir.
    • Mock (Taklit Nesne): Bağımlı olunan nesnenin davranışlarını taklit eder ve test sırasında bu nesneye yapılan çağrıları kaydeder (hangi metodun kaç kez çağrıldığı gibi).
      • Kullanım Amacı: Bir metodun doğru bağımlılıklarla etkileşime girip girmediğini kontrol etmek.
    • Stub (Sahte Nesne): Test senaryosu için önceden tanımlanmış sabit yanıtlar döndürür, yani sadece veri sağlar.
      • Kullanım Amacı: Bir bağımlılığın belirli bir senaryoda nasıl bir veri döndüreceğini simüle etmek.
    • Faydaları: Testleri daha hızlı, daha güvenilir ve bağımsız hale getirir. Gerçek bağımlılıkların karmaşıklığından ve yavaşlığından kaçınılır.

💡 İpucu: Birim testleri, kodunuzun bir "kullanım kılavuzu" gibidir. Kodunuzdaki her küçük parçanın nasıl çalışması gerektiğini gösterir ve gelecekteki değişikliklerde size güvence verir.

↩️ Testi Çözmeye Devam Et
✨ Konuları Gir, Yapay Zeka Saniyeler İçinde Sınavını Üretsin!
1 2 3 4 5 6 7 8 9 10
Ana Konuya Dön:
Geri Dön