Bankacılık Sistemi
Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 85 / 87.
Bu görev, OOP prensiplerini kullanarak gerçek dünyadaki finansal işlemleri modelleyen bir Bankacılık Sistemi oluşturmanızı beklemektedir.
Sisteminiz, her ikisi de temel bir Account sınıfını genişleten SavingsAccount ve CheckingAccount gibi farklı hesap türlerini işlemelidir. Her hesap türünün kendine özgü davranışları vardır: tasarruf hesapları faiz getirebilirken, vadesiz hesaplar kredili mevduat korumasına sahip olabilir.
İşlemlerin nasıl modelleneceğini düşünün. Transactable gibi bir arayüz, deposit() ve withdraw() için metotlar tanımlayabilir. Geçersiz işlemleri düzgün bir şekilde ele almak için InsufficientFundsException gibi özel istisnalar kullanmayı düşünün.
Bir Bank sınıfı, kompozisyonu (composition) göstererek birden fazla hesabı ve müşteriyi yönetebilir. Farklı hesap türleri oluşturmak için Factory desenini uygulayabilir veya müşterileri hesap değişikliklerinden haberdar etmek için Observer desenini kullanabilirsiniz.
Bakiyeler ve hesap numaraları gibi hassas verileri korumak için kapsüllemeye odaklanın ve farklı hesap türlerini tek tipte işlemek için çok biçimliliği kullanın.
Görev
KolayOOP prensiplerindeki ustalığınızı gösterecek eksiksiz bir Bankacılık Sistemi inşa edelim! Farklı hesap türleri, işlem yönetimi ve uygun istisna yönetimi içeren, tamamı birden fazla dosyaya yayılmış bir sistem oluşturacaksınız.
Kodunuzu yedi dosya halinde düzenleyeceksiniz:
Transactable.java: Finansal işlemler için sözleşmeyi tanımlayan bir arayüz (interface) oluşturun. Başarıyı belirtmek için her ikisi de boolean döndürendeposit(double amount)vewithdraw(double amount)metotlarını bildirmelidir.InsufficientFundsException.java:Exceptionsınıfını genişleten özel bir istisna oluşturun. Kurucu (constructor), denenen çekim miktarını ve mevcut bakiyeyi kabul etmeli veInsufficient funds: attempted [amount], available [balance]formatında bir mesaj oluşturmalıdır.Account.java: Herhangi bir banka hesabını temsil eden soyut (abstract) bir temel sınıf oluşturun.accountNumber(String) vebalance(double) için özel (private) alanlar, her ikisini de başlatan bir kurucu, uygun getter metotları, bakiyenin alt sınıflar tarafından değiştirilebilmesi için korumalı (protected) bir setter ve String döndüren soyut birgetAccountType()metodu ekleyin. Bakiyeyi 2 ondalık basamakla formatlanmış şekilde"[accountNumber] ([accountType]): $[balance]"döndüren birgetDetails()metodu uygulayın.SavingsAccount.java:Accountsınıfını genişleten veTransactablearayüzünü uygulayan bir sınıf oluşturun.interestRate(double) için özel bir alan ekleyin. Kurucu; accountNumber, başlangıç bakiyesi ve interestRate alır.getAccountType()metodunu"Savings"döndürecek şekilde uygulayın.deposit()için miktarı bakiyeye ekleyin ve true döndürün.withdraw()için miktar bakiyeyi aşarsa false döndürün; aksi takdirde çıkarın ve true döndürün. Bakiyeyibalance * interestRatekadar artıran birapplyInterest()metodu ekleyin (oran kesir olarak saklanır, yani0.05%5 anlamına gelir).CheckingAccount.java:Accountsınıfını genişleten veTransactablearayüzünü uygulayan bir sınıf oluşturun.overdraftLimit(double) için özel bir alan ekleyin. Kurucu; accountNumber, başlangıç bakiyesi ve overdraftLimit alır.getAccountType()metodunu"Checking"döndürecek şekilde uygulayın.deposit()için miktarı ekleyin ve true döndürün.withdraw()için, miktar bakiye artı overdraftLimit değerine eşit veya daha azsa çekime izin verin; bu sınırı aşarsa false döndürün.Bank.java: Hesapları bir ArrayList kullanarak yöneten bir sınıf oluşturun. Şu metotları ekleyin:addAccount(Account account)- bankaya bir hesap eklerfindAccount(String accountNumber)- hesabı döndürür veya bulunamazsa null döndürürtransfer(String fromAccount, String toAccount, double amount)- hesaplar arasında para transferi yapar, kaynak hesapta yetersiz bakiye varsaInsufficientFundsExceptionfırlatır. Başarılı olduğunda"Transferred $[amount] from [fromAccount] to [toAccount]"döndürürgetTotalDeposits()- tüm hesap bakiyelerinin toplamını döndürür
Main.java: Bankacılık sisteminizi kurun! Virgülle ayrılmış bir komut dizisi alacaksınız:SAVINGS:accountNumber:balance:interestRateCHECKING:accountNumber:balance:overdraftLimitDEPOSIT:accountNumber:amountWITHDRAW:accountNumber:amountTRANSFER:fromAccount:toAccount:amountINTEREST:accountNumber
Her komutu işleyin ve şunları yazdırın:
- SAVINGS/CHECKING:
Account created: [accountNumber] - DEPOSIT:
Deposited $[amount] to [accountNumber] - WITHDRAW: Başarılı olduğunda
Withdrew $[amount] from [accountNumber]veya başarısız olduğundaWithdrawal failed: [accountNumber] - TRANSFER: Başarı mesajını veya
Transfer failed: [exception message]yazdırın - INTEREST:
Interest applied to [accountNumber]
Tüm komutlardan sonra,
--- Bank Summary ---yazdırın, ardından her hesabın detaylarını (getDetails()kullanarak) ve son olarak 2 ondalık basamakla formatlanmışTotal deposits: $[total]yazdırın.
Bir girdi alacaksınız: virgülle ayrılmış komut dizisi.
Örneğin, SAVINGS:SAV001:1000.00:0.05,CHECKING:CHK001:500.00:200.00,DEPOSIT:SAV001:250.00,WITHDRAW:CHK001:600.00,TRANSFER:SAV001:CHK001:100.00,INTEREST:SAV001 girdisiyle çıktınız şöyle olacaktır:
Account created: SAV001
Account created: CHK001
Deposited $250.00 to SAV001
Withdrew $600.00 from CHK001
Transferred $100.00 from SAV001 to CHK001
Interest applied to SAV001
--- Bank Summary ---
SAV001 (Savings): $1207.50
CHK001 (Checking): $0.00
Total deposits: $1207.50Vadesiz hesabın (checking account), sadece $500 bakiyesi olmasına rağmen $600 çekime nasıl izin verdiğine dikkat edin—bu, kredili mevduat korumasının (overdraft protection) iş başındaki halidir! Tasarruf hesabı (savings account), transferden sonraki bakiyesi üzerinden %5 faiz kazanır. Bu meydan okuma; kalıtım, arayüzler, polimorfizm, özel istisnalar ve kapsüllemeyi gerçekçi bir bankacılık uygulamasında birleştiriyor!
Kendin dene
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
// TODO: Bir Bank örneği oluşturun
// TODO: Komutları tek tek almak için girişi virgüle göre ayırın
// TODO: Her komutu işleyin:
// - SAVINGS:accountNumber:balance:interestRate -> SavingsAccount oluşturun, "Account created: [accountNumber]" yazdırın
// - CHECKING:accountNumber:balance:overdraftLimit -> CheckingAccount oluşturun, "Account created: [accountNumber]" yazdırın
// - DEPOSIT:accountNumber:amount -> Para yatırın ve "Deposited $[amount] to [accountNumber]" yazdırın
// - WITHDRAW:accountNumber:amount -> Para çekin ve başarılıysa yazdırın veya "Withdrawal failed: [accountNumber]" yazdırın
// - TRANSFER:fromAccount:toAccount:amount -> Transfer yapın ve başarılıysa yazdırın veya "Transfer failed: [exception message]" yazdırın
// - INTEREST:accountNumber -> Faizi uygulayın ve "Interest applied to [accountNumber]" yazdırın
// TODO: Tüm komutlardan sonra "--- Bank Summary ---" yazdırın
// TODO: getDetails() kullanarak her hesabın ayrıntılarını yazdırın
// TODO: "Total deposits: $[total]" ifadesini virgülden sonra 2 basamak olacak şekilde yazdırın
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarAlanlar (Öznitelikler)Yapıcı MetotYapıcı Metot Aşırı YüklemeÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (extends)super Anahtar KelimesiMetot Geçersiz Kılma (@Override)Yapıcı Metot ZincirlemeObject SınıfıTekli ve Çok Seviyeli KalıtımNeden Çoklu Sınıf Kalıtımı Yok?Özet - Çalışan Hiyerarşisi7Özel Metotlar ve Object Sınıfı
toString() Metoduequals() ve hashCode()clone() MetoducompareTo() ve ComparableComparator ArayüzüÖzet - Özel Sıralama2Erişim Belirleyiciler ve Kapsülleme
Erişim Seviyelerine Genel BakışGetter ve Setter MetotlarıBilgi Gizlemefinal Anahtar KelimesiÖzet - Banka Hesabı Yöneticisi5Polimorfizm
Metot Aşırı Yükleme TemelleriMetot Geçersiz Kılma (Çalışma Zamanı)Upcasting ve Downcastinginstanceof OperatörüSoyut Sınıflar ve MetotlarÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımAgregasyon vs KompozisyonDahili, Yuvalanmış ve Anonim SınıflarEnum'lar ve Enum MetotlarıRecords (Java 16+)Sealed Classes (Java 17+)11Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıBuilder KalıbıObserver KalıbıStrategy Kalıbı14Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi3Sınıf Özellikleri ve Statik Üyeler
Instance ve Statik DeğişkenlerStatik MetotlarStatik BloklarSabitler (static final)Özet - Sayaç ve Utility6Arayüzler ve Soyut Sınıflar
Arayüzlere GirişArayüzleri UygulamaÇoklu Arayüz UygulamaArayüzlerde Default ve StaticSoyut Sınıflar ve ArayüzlerFonksiyonel ArayüzlerÖzet - Ödeme Sistemi9Generics
Generics'e GirişGeneric SınıflarGeneric MetotlarSınırlandırılmış Tip ParametreleriWildcard'lar (?, extends, super)Özet - Generic Container12Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıYineleyici Kalıbı