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 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.

challenge icon

Görev

Kolay

OOP 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ü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. Kurucu (constructor), denenen çekim miktarını ve mevcut bakiyeyi kabul etmeli ve Insufficient 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) ve balance (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 bir getAccountType() metodu ekleyin. Bakiyeyi 2 ondalık basamakla formatlanmış şekilde "[accountNumber] ([accountType]): $[balance]" döndüren bir getDetails() 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 ö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. Bakiyeyi balance * interestRate kadar artıran bir applyInterest() metodu ekleyin (oran kesir olarak saklanır, yani 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 ö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 ekler
    • findAccount(String accountNumber) - hesabı 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 yetersiz bakiye varsa InsufficientFundsException fırlatır. Başarılı olduğunda "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 kurun! 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ı olduğunda Withdrew $[amount] from [accountNumber] veya başarısız olduğunda 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 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.50

Vadesiz 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
    }
}
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