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 ilkelerini kullanarak gerçek dünyadaki finansal işlemleri modelleyen bir Bankacılık Sistemi oluşturmanızı ister.
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 kazanabilirken çek hesaplarında kredili mevduat koruması bulunabilir.
İşlemlerin nasıl modellenebileceğini düşünün. Transactable gibi bir arayüz, deposit() ve withdraw() yöntemlerini tanımlayabilir. Geçersiz işlemleri uygun şekilde ele almak için InsufficientFundsException gibi özel istisnalar kullanmayı değerlendirin.
Bir Bank sınıfı birden fazla hesabı ve müşteriyi yöneterek bileşimi gösterebilir. Farklı hesap türleri oluşturmak için Factory desenini uygulayabilir veya müşterileri hesap değişikliklerinden haberdar etmek için Observer desenini kullanabilirsin.
Bakiyeler ve hesap numaraları gibi hassas verileri korumak için kapsüllemeye odaklanın ve farklı hesap türlerini tekdüze biçimde işlemek için çok biçimliliği kullanın.
Görev
KolayOOP ilkelerine hâkimiyetinizi gösteren eksiksiz bir Bankacılık Sistemi oluşturalım! Farklı hesap türlerine, işlem yönetimine ve uygun istisna yönetimine sahip bir sistem oluşturacaksınız: tümü birden çok dosyada düzenlenecek.
Kodunuzu yedi dosya arasında düzenleyeceksiniz:
Transactable.java: Finansal işlemler için sözleşmeyi tanımlayan bir arayüz oluşturun. Başarılı işlemi belirtmek üzere 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. Yapıcı metot, denenmiş para çekme tutarını ve mevcut bakiyeyi kabul etmeli veInsufficient funds: attempted [amount], available [balance]biçiminde bir mesaj oluşturmalıdır.Account.java: Herhangi bir banka hesabını temsil eden soyut bir temel sınıf oluşturun.accountNumber(String) vebalance(double) için private alanlar, her ikisini başlatan bir yapıcı metot, uygun getter metotları, alt sınıfların değiştirebilmesi için balance için protected bir setter ve String döndüren soyut birgetAccountType()metodu ekleyin. Bakiyeyi 2 ondalık basamağa biçimlendirerekgetDetails()döndüren bir"[accountNumber] ([accountType]): $[balance]"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 private bir alan ekleyin. Yapıcı metot accountNumber, başlangıç bakiyesi ve interestRate alır.getAccountType()metodunu"Savings"döndürecek şekilde uygulayın.deposit()için tutarı bakiyeye ekleyin ve true döndürün.withdraw()için tutar bakiyeyi aşarsa false döndürün; aksi takdirde bakiyeden çıkarın ve true döndürün. BakiyeyiapplyInterest()kadar artıran birbalance * interestRatemetodu ekleyin (oran kesir olarak saklanır, bu nedenle0.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 private bir alan ekleyin. Yapıcı metot accountNumber, başlangıç bakiyesi ve overdraftLimit alır.getAccountType()metodunu"Checking"döndürecek şekilde uygulayın.deposit()için tutarı ekleyin ve true döndürün.withdraw()için, tutar balance artı overdraftLimit değerinden küçük veya eşitse para çekmeye izin verin; bu limiti 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)- bir hesabı bankaya eklerfindAccount(String accountNumber)- Account 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 yeterli para yoksaInsufficientFundsExceptionfırlatır. Başarılı olursa"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 oluşturun! 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ı olursa
Withdrew $[amount] from [accountNumber], aksi takdirdeWithdrawal 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 ayrıntılarını (getDetails()kullanarak) ve son olarak 2 ondalık basamağa biçimlendirilmişTotal deposits: $[total]ifadesini yazdırın.
Bir girdi alacaksınız: virgülle ayrılmış komut dizisi.
Örneğin, girdi 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 olduğunda çıktınız şöyle olur:
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.50Checking hesabının yalnızca $500 bakiyesi olmasına rağmen $600 çekilmesine izin verdiğine dikkat edin: bu, kredili mevduat korumasının işleyişidir! Savings hesabı, transferden sonra bakiyesi üzerinden %5 faiz kazanır. Bu çalışma; kalıtım, arayüzler, çok biçimlilik, özel istisnalar ve kapsüllemeyi gerçekçi bir bankacılık uygulamasında bir araya getirir!
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ştur
// TODO: Bireysel komutları almak için girdiyi virgülle ayır
// TODO: Her komutu işle:
// - SAVINGS:accountNumber:balance:interestRate -> Create SavingsAccount, print "Account created: [accountNumber]"
// - CHECKING:accountNumber:balance:overdraftLimit -> Create CheckingAccount, print "Account created: [accountNumber]"
// - DEPOSIT:accountNumber:amount -> Para yatır ve "Deposited $[amount] to [accountNumber]" yazdır
// - WITHDRAW:accountNumber:amount -> Withdraw and print success or "Withdrawal failed: [accountNumber]"
// - TRANSFER:fromAccount:toAccount:amount -> Transfer et ve başarıyı veya "Transfer failed: [exception message]" yazdır
// - INTEREST:accountNumber -> Apply interest and print "Interest applied to [accountNumber]"
// TODO: Tüm komutlardan sonra "--- Bank Summary ---" yazdır
// TODO: getDetails() kullanarak her hesabın detaylarını yazdır
// TODO: Print "Total deposits: $[total]" formatted to 2 decimal places
}
}
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ıKendi başına pratik yap: Online Java derleyicisi