Ek Çalışma — Tasarım Kararları

Tasarım kararları alıştırma bankası

Bu sayfadaki soruların amacı daha fazla class sözdizimi yazmak değil, durum ve davranışın neden belirli bir nesnede bulunduğunu gerekçelendirmektir. Bazı sorularda tek bir tartışmasız doğru yoktur. Böyle durumlarda iyi cevap; gereksinimi açıklar, alternatifin maliyetini söyler ve seçilen sorumluluğu savunur.

1. “Sorumluluk kime ait?” — 20 kısa karar

Her maddede bir seçenek işaretleyin ve en az bir cümle gerekçe yazın. Yalnız harf yazmak yeterli değildir.

1

Siparis, SiparisSatiri, Urun var. toplam_tutar() nerede olmalı?

A) Urun
B) Siparis
C) ekrandaki menü kodu

2

Siparişe yüzde indirimi uygulayan kural kampanyaya göre sık değişiyor. indirim_tutari() için en iyi başlangıç hangisi?

A) Siparis içinde sabit bir if zinciri
B) ayrı bir IndirimPolitikasi davranışı ve siparişin bunu kullanması
C) Urun sınıfı

3

Fatura numarası merkezi, benzersiz bir seri üzerinden üretiliyor. Sorumluluk nerede daha doğal?

A) her Siparis nesnesi kendi sayacını tutar
B) FaturaNumaratoru/servis gibi tek koordinasyon noktası
C) Musteri

4

BankaHesabi.para_cek() bakiyenin negatife düşmesini engelleyecek. Kontrol nerede yapılmalı?

A) BankaHesabi
B) kullanıcı arayüzü
C) yalnızca çağıran kod

5

Rezervasyon başlangıç ve bitiş zamanını taşıyor. sure_dakika() nerede olmalı?

A) Rezervasyon
B) Musteri
C) global yardımcı fonksiyon zorunludur

6

Kutuphane, Uye ve KitapKopyasi var. Barkodla kitabı, numarayla üyeyi bulup ödünç işlemini koordine eden odunc_ver() nerede başlamalı?

A) KitapKopyasi
B) Kutuphane
C) Uye

7

Bir KitapKopyasinın şu anda ödünçte olup olmadığını kim bilmelidir?

A) KitapKopyasi
B) yalnız Kutuphane
C) ekrandaki liste

8

Bir öğrencinin yalnız kendi notlar listesine göre ortalamasını hesaplamak için en doğal yer hangisi?

A) Ogrenci
B) Derslik
C) DosyaOkuyucu

9

Sepet içindeki ürün satırlarına yeni satır eklerken tekrar/birleştirme kuralı uygulanacak. urun_ekle() nerede olmalı?

A) Sepet
B) Urun
C) Musteri

10

Bir ürünün fiyatı negatif olamaz. fiyat_degistir() doğrulaması nerede olmalı?

A) Urun
B) her ekran ayrı ayrı kontrol eder
C) CSV dosyası

11

Musteri bir Adres nesnesine sahip. Teslimat şehrini siparişin öğrenmesi gerekiyor. Hangi yaklaşım daha kontrollü?

A) Siparis, musteri.adres.sehir zincirini her yerde doğrudan kullanır
B) Musteri.teslimat_sehri() adresine delegation yapar; sipariş bu davranışı kullanır
C) şehir Siparis içine kopyalanmak zorundadır

12

Sipariş onaylanınca e-posta gönderilecek. SMTP ayrıntıları nereye konmalı?

A) Siparis.onayla() içine doğrudan
B) bildirim/iletişim servisine; sipariş yalnız alan durumunu değiştirir
C) Urun

13

Siparis.onayla() taslak siparişi onaylı duruma geçiriyor. Durum geçişi kuralı nerede olmalı?

A) Siparis
B) NotificationService
C) HTML şablonu

14

Siparişleri PDF/CSV olarak dışa aktarmak gerekiyor. Formatlama sorumluluğu için hangi başlangıç daha doğal?

A) Siparis içine to_pdf(), to_csv(), to_xlsx() eklemek
B) ayrı rapor/export bileşeni
C) Musteri

15

Bir sınıftaki öğrencilerin ortalamasını ve en yüksek notu hesaplamak gerekiyor. Bilgi bütün sınıf koleksiyonunda. Davranış nerede daha doğal?

A) tek tek Ogrenci
B) Derslik/NotDefteri gibi koleksiyonu yöneten nesne
C) Urun

16

Oda kapasitesini biliyor; rezervasyon 30 kişi talep ediyor. “Bu oda bu grubu alır mı?” sorgusu için en doğal bilgi sahibi kim?

A) Oda
B) RezervasyonFormu
C) yazdırma fonksiyonu

17

Bir sensör nesnesi kendi seri numarasını ve son ölçümünü taşıyor. son_okuma_gecerli_mi() yalnız bu iki bilgiye dayanıyor. Nerede olmalı?

A) Sensor
B) Dashboard
C) veritabanı bağlantısı

18

Bir aracın yakıt tüketimi hesabı yalnız Yolculuk nesnesinin mesafe ve kullanılan yakıt değerlerine dayanıyor. ortalama_tuketim() için en doğal yer hangisi?

A) Yolculuk
B) Arac
C) Surucu

19

Bir öğrenci aynı derse iki kez kaydedilememeli. Ders kayıtlarını yöneten ayrı KayitDefteri koleksiyonu varsa tekrar kontrolü nerede daha doğal?

A) KayitDefteri
B) her Ders nesnesi
C) terminal menüsü

20

Siparis ödeme tutarını biliyor; KrediKartiOdeme ve NakitOdeme aynı ode(tutar) davranışını sağlıyor. Ödeme işleminin yönteme özgü kısmı nerede olmalı?

A) Siparis içinde ödeme türüne göre uzun if zinciri
B) ödeme yöntemi nesnesinde; sipariş ortak ode() davranışını çağırır
C) Musteri.ad

  1. B. Sipariş toplamı siparişin satırlarının bütününden doğar.
  2. B. Değişen kampanya davranışı ayrı politika nesnesiyle daha kolay değiştirilebilir; küçük ve sabit tek kuralda A da savunulabilir.
  3. B. Sistem çapında benzersiz seri tek nesnenin yerel sayacı değildir; merkezi üretici/servis daha açık sınırdır.
  4. A. Bakiye invariantını hesabın kendisi korumalıdır.
  5. A. Gerekli iki değer rezervasyondadır.
  6. B. Birden çok nesneyi bulup işlemi koordine eden bilgi kütüphanededir; kopya kendi yerel ödünç durumunu yine kendisi koruyabilir.
  7. A. Yerel ödünç durumu kopyanın kendi durumudur.
  8. A. Hesap yalnız öğrencinin kendi notlarına dayanıyorsa davranış doğal olarak öğrencide bulunabilir.
  9. A. Koleksiyonun ekleme/tekrar kuralını koleksiyonu yöneten sepet korur.
  10. A. Ürün, kendi geçerli fiyat durumunu korumalıdır.
  11. B. Delegation, siparişin adresin iç yapısına gereksiz bağımlılığını azaltır. Tarihsel adres saklama gereksiniminde C türü snapshot da savunulabilir.
  12. B. Alan durumu ile SMTP altyapısı farklı değişim nedenlerine sahiptir.
  13. A. Geçerli sipariş durum geçişi sipariş alan kuralıdır.
  14. B. Çoklu dışa aktarma formatları alan nesnesini altyapı ayrıntılarıyla şişirmemelidir.
  15. B. Bütün koleksiyona dayanan özet davranış koleksiyonu yöneten nesnede daha doğaldır.
  16. A. Kapasite bilgisi odadadır; rezervasyon koordinasyonu ayrı yerde kalabilir.
  17. A. Gerekli bilgi sensördeyse sorgu sensöre yakındır.
  18. A. Hesap yolculuğun iki alanına dayanıyor. Araç modeline göre tüketim politikası değişiyorsa B de gerekçelendirilebilir.
  19. A. Benzersizlik koleksiyon sınırında uygulanırsa bütün ekleme yolları aynı kuraldan geçer.
  20. B. Ortak çağrı + farklı davranış polimorfizmin doğal kullanım alanıdır.

2. “Bu kalıtım neden yanlış?” — 8 vaka

Her vakada üç şeyi yazın: (1) hiyerarşi hangi kullanımda kırılabilir, (2) kompozisyon veya daha dar bir sözleşme nasıl kurulabilir, (3) bu problemde hangisini seçerdiniz?

  1. class Araba(Motor) — yalnız motorun calistir() kodunu yeniden kullanmak için kurulmuş.
  2. class Penguen(UcanKus) — üst sınıf bütün kuşların uc() davranışını zorunlu tutuyor.
  3. Mutable Dikdortgen sınıfından Kare türetilmiş; genislik ve yukseklik ayrı ayrı değiştirilebiliyor.
  4. class IsYigini(list) — alan kuralı yalnız push/pop iken dış kod insert, dilim ataması ve sort() kullanabiliyor.
  5. class PdfFatura(Fatura) — tek fark çıktı formatı; aynı fatura HTML, PDF ve CSV olarak da üretilebilmeli.
  6. class Calisan(VeritabaniBaglantisi) — yalnız save() metodunu tekrar kullanmak amacıyla kurulmuş.
  7. class OnlineSiparis(EmailGonderici) — sipariş onaylandığında e-posta göndermek için altyapı sınıfından miras alınmış.
  8. class SicaklikSensoru(list) — sensör ölçümlerini saklamak için liste davranışlarının tamamı public API hâline gelmiş.
  • 1: Araba motor değildir; motora sahiptir → kompozisyon.
  • 2: “Bütün kuşlar uçar” sözleşmesi yanlış genellemedir → daha dar Ucan davranışı veya farklı kompozisyon.
  • 3: Alt tür üst türün bağımsız boyut değiştirme sözünü koruyamıyorsa yerine geçme bozulur; immutable değer modeli veya ayrı türler düşünülebilir.
  • 4: list API’si alanın izin vermediği davranışları açar → iç list/deque kompozisyonu.
  • 5: PDF bir fatura türü değil, temsil/çıktı biçimidir → exporter/renderer davranışı.
  • 6: Çalışan bağlantı türü değildir → repository/service kompozisyonu.
  • 7: Sipariş e-posta gönderici türü değildir → bildirim bağımlılığı/delegation.
  • 8: Sensör bir liste değildir → ölçüm koleksiyonunu içeride tut ve gerekli davranışı aç.

3. Invariant bulma — 6 sınıf

Her sınıf için en az iki invariant yazın. Sonra bu kuralların hangi giriş noktalarında korunacağını belirtin: __init__, property setter, davranış metodu veya koleksiyon ekleme metodu.

A — Rezervasyon(baslangic, bitis, kisi_sayisi)

İpuçları: zaman sırası, kişi sayısı.

B — Urun(kod, fiyat, stok)

İpuçları: fiyat ve stok aralığı, ürün kodunun boş olmaması.

C — BankaHesabi(iban, bakiye)

Bu basit modelde eksi bakiyeye izin verilmediğini varsayın.

D — SinavSonucu(ogrenci_no, puan)

Puan 0–100 arasında olmalı; öğrenci numarası boş olamaz.

E — OdaRezervasyonu(oda, kisi_sayisi)

oda.kapasite bilgisi mevcut. Rezervasyon kişi sayısı pozitif ve kapasiteyi aşmamalı.

F — DersKayitDefteri()

Aynı (ogrenci_no, ders_kodu) çifti yalnız bir kez bulunabilir; eklenen ders kodu boş olamaz.

  • A: bitis > baslangic, kisi_sayisi > 0.
  • B: fiyat >= 0, stok >= 0, kod.strip() boş değil.
  • C: bakiye >= 0, iban boş değil; para_cek() kontrolü durum değişiminden önce yapılır.
  • D: 0 <= puan <= 100, ogrenci_no geçerli/boş değil.
  • E: kisi_sayisi > 0, kisi_sayisi <= oda.kapasite.
  • F: kayıt anahtarı benzersiz, ders kodu boş değil; tekrar kuralı koleksiyona ekleme sınırında uygulanır.

Aynı doğrulamayı hem __init__ hem setter içinde kopyalamak yerine mümkünse tek doğrulama yoluna yönlendirin.

Back to top