Soyutlama ve Dört Sütun — Hangi Değişikliğe Hangisi Yardım Eder?
Önce şunu oku: Polimorfizm ve Dinamik Bağlama — Kararı Kim Veriyor? , Interface ve Abstract Class — Rol mü, İskelet mi?
30 saniyede özet
Kapsülleme, soyutlama, kalıtım ve polimorfizm dört ayrı ezber değil, dört ayrı değişikliğe karşı sigorta. Bu ders eksik kalan soyutlamayı tanıtıyor ve dördünü tek bir banka kodunda yan yana koyuyor.
Televizyonu açarken kumandanın içindeki devreyi düşünmezsin. Düğmeye basarsın, iş olur. Kumanda değişse bile düğmeler aynı kaldıkça hayatın değişmez.
Adım adım oku
- Kapsülleme: kasaya yalnızca veznedar dokunur; kural tek kapıda.
- Soyutlama: düğmeleri görürsün, kabloları görmezsin.
- Kalıtım ortak kodu paylaştırır, polimorfizm aynı düğmeyi her cihazda çalıştırır.
- Dördü birlikte, değişikliği küçük ve yerel tutar.
-
Bayt: Dört sütunun adlarını ezberledim. Ama hangisi ne işe yarıyor, karışıyor.
-
Sen: Bence de. Hepsi biraz aynı gibi.
-
Bayt: Ezberi bırakalım. Her birine bir değişiklik isteği getirelim ve kim korunuyor, bakalım.
Soyutlama: ne yapıldığı, nasıl değil
abstractionBir şeyi kullanana yalnızca ne yaptığını gösterip nasıl yaptığını saklamak. Java'da çoğu zaman bir arayüz ya da abstract sınıf ile kurulur.Sözlükte gör →, bir şeyi kullanan kişiye yalnızca ne yaptığını gösterip nasıl yaptığını saklamaktır. Java’da bunun en sık hâli bir arayüzdür: BankGateway “para gönder” der, hangi bankaya nasıl bağlandığını söylemez.
TransferService bir BankGateway istediğinde, arkadaki gerçek istemciyi değiştirmek servisi değiştirmez. Testte sahte bir gateway verirsin, canlıda gerçeğini.
Kafam karıştı, daha basit anlat
Soyutlama bir kumandadır. Düğmeler aynı kaldıkça içindeki devreyi kimse dert etmez.
Soyutlama en kısa hâliyle nedir?
TransferService constructor'ında bir BankGateway arayüzü alıyor. Bunun en somut kazancı hangisi?
Dört sütun, dört değişiklik
kapsüllemeBir nesnenin iç durumunu yalnızca kendi metotlarından değiştirilebilir kılmak. Amaç alanları gizlemek değil, nesnenin kuralını (invariant) korumaktır.Sözlükte gör → bir kuralı tek kapıda toplar: bakiyeyi yalnızca withdraw() değiştirebiliyorsa, limit kuralı da yalnızca orada yaşar.
polimorfizmAynı çağrının, nesnenin gerçek tipine göre farklı davranış üretmesi. Java'da override edilmiş örnek metotlarıyla sağlanır.Sözlükte gör → yeni bir türü tek yere toplar: herkes method.pay() derse, QR ödeme eklemek yeni bir sınıf yazmak demektir. kalıtımBir sınıfın başka bir sınıfı extends ile genişletip onun API'sini ve uygulamasını devralması. "B, bir A'dır" ilişkisini ifade eder.Sözlükte gör → ise ortak kodu paylaştırır; değişikliği de paylaştırdığını unutmamak gerekir.
Kod, ödeme türüne göre üç farklı sınıfta switch (kind) yapıyor. QR ödeme eklemek istiyorsun. Kaç var olan dosyayı değiştirmen gerekir? Cevabı göster
Üç. Her switch’e yeni bir dal eklemelisin. Birini unutursan derleyici çoğu zaman uyarmaz ve hata, o kod ilk çalıştığında ortaya çıkar.
Polimorfizm bu üç switch’i siler, ama bir şartla: ortada ortak bir tip olmalı. Ortak tip olmadan çağrılacak ortak bir metot da yoktur.
Kafam karıştı, daha basit anlat
Kapsülleme kuralı, polimorfizm yeni türü, soyutlama bağımlılığı tek yerde tutar. Kalıtım kodu paylaştırır ama değişikliği de paylaştırır.
Bakiye alanı public ve dört farklı sınıf onu doğrudan değiştiriyor. 'Bakiye -limit altına inmesin' kuralı geldi. Asıl sorun hangi sütunun eksikliği?
Polimorfizmin switch (kind) dallarını silebilmesi için ne gerekir?
Kendin gör
Değişiklik isteği geldi
Tohum 709444Oynat ya da adımla.
Şu an ne oldu?
QR ödeme ekle
Bu istek en çok soyutlama + polimorfizm ile ilgili. Hangi anahtarlar açık, ona bak.
Görevler0/3
QR ödemeyi ekle ve bir switch'i unutaçık
İpucu
Varsayılan ayarlar yeter.
QR ödemeyi var olan hiçbir dosyaya dokunmadan ekleaçık
İpucu
Tek anahtar yetmez.
Kart ücretini havaleye dokunmadan değiştiraçık
İpucu
Ortak kodu nerede tutuyorsun?
Olay günlüğü (0)
Henüz olay yok. Oynat veya adımla.
- Varsayılanla oynat. QR ödeme için iki switch değişti, üçüncüsü unutuldu.
- Yalnızca polimorfizmi aç. Ortak tip olmadığı için yine switch.
- Soyutlamayı da aç. Tek yeni dosya, sıfır değişiklik.
- İsteği kart ücreti yap. Taban sınıftaki değişiklik havaleyi de etkiledi; kalıtımı kapatınca etkilemedi.
- Bakiye limitini ve testi dene. Kapsüllemeyi ve soyutlamayı kapatıp aç, farka bak.
Kart ücreti hesabı abstract BasePayment.fee() içinde ve havale de onu miras alıyor. Yalnızca kart ücreti değişecek. Risk nedir?
Tuzaklar
Tek uygulamalı arayüz. Değişmesi beklenmeyen her sınıfa bir arayüz eklemek, kodu okumayı zorlaştırır. Arayüzü, arkası gerçekten değişecek ya da testte taklit edilecekse yaz.
Yalnızca getter ve setter. Her alana bir setter vermek kapsülleme değildir. Kural yine dışarıda kalır; kapsülleme anlamlı metotlarla gelir.
Kod paylaşmak için kalıtım. İki sınıf birkaç satır ortak diye taban sınıf açmak, ileride ayrışacak davranışı birbirine bağlar. Önce kompozisyonu düşün.
Kafam karıştı, daha basit anlat
Sütunları ihtiyaç kadar dik. Arkası değişmeyecek bir sınıfa arayüz, kuralı olmayan bir alana metot gerekmez.
Her alana bir getter ve bir setter yazılmış. Bu sınıf kapsüllenmiş sayılır mı?
Yalnızca bir uygulaması olan ve değişmesi beklenmeyen bir yardımcı sınıfa arayüz eklemek ne zaman gereksizdir?
Aşağıdaki örnek, simülatördeki banka kodunun dört sütunla yazılmış hâli.
Derinleş · Ödemeler: dört sütun tek kodda 5 dosya · ~96 satır · ilk okumada atlayabilirsin
Kendini sına
Soyutlama, bir şeyin nasıl yapıldığını saklayıp ne yaptığını gösterir.
Ödeme türüne göre üç sınıfta switch var. Yeni bir tür eklenip bir switch unutuldu. Hata ne zaman ortaya çıkar?
Aklında kalacak üç şey
- 1 Soyutlama, kullanana yalnızca ne yapıldığını gösterir, nasıl yapıldığını saklar. Kod bir arayüze konuşunca arkasındaki sınıf değişebilir.
- 2 Her sütun bir tür değişikliği tek yere toplar: kapsülleme kuralı, soyutlama bağımlılığı, polimorfizm yeni türü, kalıtım ortak kodu.
- 3 Polimorfizm ortak bir tip ister. Ortak tip yoksa kod yine türe göre dallanır ve her yeni tür bütün switch'leri gezer.