Menu
Coddy logo textTech

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.

challenge icon

Görev

Kolay

OOP 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üren deposit(double amount) ve withdraw(double amount) metotlarını bildirmelidir.
  • InsufficientFundsException.java: Exception sınıfını genişleten özel bir istisna oluşturun. Yapıcı metot, denenmiş para çekme tutarını ve mevcut bakiyeyi kabul etmeli ve Insufficient 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) ve balance (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 bir getAccountType() metodu ekleyin. Bakiyeyi 2 ondalık basamağa biçimlendirerek getDetails() döndüren bir "[accountNumber] ([accountType]): $[balance]" metodu uygulayın.
  • SavingsAccount.java: Account sınıfını genişleten ve Transactable arayü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. Bakiyeyi applyInterest() kadar artıran bir balance * interestRate metodu ekleyin (oran kesir olarak saklanır, bu nedenle 0.05 %5 anlamına gelir).
  • CheckingAccount.java: Account sınıfını genişleten ve Transactable arayü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 ekler
    • findAccount(String accountNumber) - Account döndürür veya bulunamazsa null döndürür
    • transfer(String fromAccount, String toAccount, double amount) - hesaplar arasında para transferi yapar; kaynak hesapta yeterli para yoksa InsufficientFundsException fırlatır. Başarılı olursa "Transferred $[amount] from [fromAccount] to [toAccount]" döndürür
    • getTotalDeposits() - 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:interestRate
    • CHECKING:accountNumber:balance:overdraftLimit
    • DEPOSIT:accountNumber:amount
    • WITHDRAW:accountNumber:amount
    • TRANSFER:fromAccount:toAccount:amount
    • INTEREST: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 takdirde Withdrawal 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.50

Checking 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
    }
}
quiz iconKendini test et

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

Kendi başına pratik yap: Online Java derleyicisi