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
- B. Sipariş toplamı siparişin satırlarının bütününden doğar.
- B. Değişen kampanya davranışı ayrı politika nesnesiyle daha kolay değiştirilebilir; küçük ve sabit tek kuralda A da savunulabilir.
- B. Sistem çapında benzersiz seri tek nesnenin yerel sayacı değildir; merkezi üretici/servis daha açık sınırdır.
- A. Bakiye invariantını hesabın kendisi korumalıdır.
- A. Gerekli iki değer rezervasyondadır.
- B. Birden çok nesneyi bulup işlemi koordine eden bilgi kütüphanededir; kopya kendi yerel ödünç durumunu yine kendisi koruyabilir.
- A. Yerel ödünç durumu kopyanın kendi durumudur.
- A. Hesap yalnız öğrencinin kendi notlarına dayanıyorsa davranış doğal olarak öğrencide bulunabilir.
- A. Koleksiyonun ekleme/tekrar kuralını koleksiyonu yöneten sepet korur.
- A. Ürün, kendi geçerli fiyat durumunu korumalıdır.
- 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.
- B. Alan durumu ile SMTP altyapısı farklı değişim nedenlerine sahiptir.
- A. Geçerli sipariş durum geçişi sipariş alan kuralıdır.
- B. Çoklu dışa aktarma formatları alan nesnesini altyapı ayrıntılarıyla şişirmemelidir.
- B. Bütün koleksiyona dayanan özet davranış koleksiyonu yöneten nesnede daha doğaldır.
- A. Kapasite bilgisi odadadır; rezervasyon koordinasyonu ayrı yerde kalabilir.
- A. Gerekli bilgi sensördeyse sorgu sensöre yakındır.
- A. Hesap yolculuğun iki alanına dayanıyor. Araç modeline göre tüketim politikası değişiyorsa B de gerekçelendirilebilir.
- A. Benzersizlik koleksiyon sınırında uygulanırsa bütün ekleme yolları aynı kuraldan geçer.
- 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?
class Araba(Motor)— yalnız motoruncalistir()kodunu yeniden kullanmak için kurulmuş.class Penguen(UcanKus)— üst sınıf bütün kuşlarınuc()davranışını zorunlu tutuyor.- Mutable
DikdortgensınıfındanKaretüretilmiş;genislikveyukseklikayrı ayrı değiştirilebiliyor. class IsYigini(list)— alan kuralı yalnızpush/popiken dış kodinsert, dilim ataması vesort()kullanabiliyor.class PdfFatura(Fatura)— tek fark çıktı formatı; aynı fatura HTML, PDF ve CSV olarak da üretilebilmeli.class Calisan(VeritabaniBaglantisi)— yalnızsave()metodunu tekrar kullanmak amacıyla kurulmuş.class OnlineSiparis(EmailGonderici)— sipariş onaylandığında e-posta göndermek için altyapı sınıfından miras alınmış.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
Ucandavranışı 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:
listAPI’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.
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,ibanboş değil;para_cek()kontrolü durum değişiminden önce yapılır. - D:
0 <= puan <= 100,ogrenci_nogeç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.