Menu
Coddy logo textTech

Bankacılık Sistemi

Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 89 / 91.

challenge icon

Görev

Kolay

Hesapları, işlemleri ve hesaplar arasındaki transferleri yöneten bir Bankacılık Sistemi oluşturalım. Finansal verileri korumak için uygun kapsülleme, farklı hesap türleri için kalıtım ve veri bütünlüğünü sağlamak için doğrulama içeren bir sistem oluşturacaksınız.

Kodunuzu altı dosya arasında düzenleyeceksiniz:

  • Transaction.php: Finansal işlemleri kaydetmek için bir Transaction sınıfı oluşturun. type (string: "deposit", "withdrawal" veya "transfer"), amount (float) ve timestamp (string) için yapıcı destekli özellik tanımlamasını kullanın. Tüm özellikler public readonly olmalıdır. getDescription(): string metodunu ekleyin; bu metot "[type]: $[amount]" değerini döndürmelidir (amount değerini 2 ondalık basamağa biçimlendirin).
  • BankAccount.php: Transaction dosyasını dahil edin. Aşağıdakilere sahip soyut bir BankAccount sınıfı oluşturun:
    • accountNumber (string, public readonly) ve holderName (string, public readonly) için yapıcı destekli özellik tanımlaması
    • 0.0 olarak başlatılan korumalı bir $balance özelliği
    • İşlem geçmişini depolamak için özel bir dizi
    • getBalance(): float: mevcut bakiyeyi döndürür
    • deposit(float $amount): string: bakiyeye ekleme yapar, işlemi kaydeder ve "Deposited: $[amount]" değerini döndürür
    • abstract withdraw(float $amount): string: alt sınıflar para çekme kurallarını uygular
    • addTransaction(Transaction $t): void: işlem geçmişine işlem ekleyen korumalı metot
    • getTransactionCount(): int: işlem sayısını döndürür
  • SavingsAccount.php: BankAccount dosyasını dahil edin. Aşağıdakilere sahip ve SavingsAccount sınıfını genişleten bir BankAccount sınıfı oluşturun:
    • 0.02 (%2) olarak ayarlanmış bir INTEREST_RATE sınıf sabiti
    • withdraw(float $amount): string: amount bakiyeyi aşarsa "Insufficient funds" değerini döndürür; aksi takdirde bakiyeden düşer, işlemi kaydeder ve "Withdrew: $[amount]" değerini döndürür
    • applyInterest(): string: mevcut bakiye üzerinden faizi hesaplar, bunu bir para yatırma işlemi olarak ekler ve "Interest applied: $[interest]" değerini döndürür
  • CheckingAccount.php: BankAccount dosyasını dahil edin. Aşağıdakilere sahip ve CheckingAccount sınıfını genişleten bir BankAccount sınıfı oluşturun:
    • Yapıcı aracılığıyla ayarlanan özel bir $overdraftLimit özelliği (varsayılan değeri 100.0 olan üçüncü bir parametre ekleyin)
    • withdraw(float $amount): string: amount, bakiye + kredili mevduat limitini aşmıyorsa para çekilmesine izin verir; başarısızlık durumunda "Insufficient funds (overdraft limit: $[limit])", başarı durumunda ise "Withdrew: $[amount]" değerini döndürür
    • getOverdraftLimit(): float: kredili mevduat limitini döndürür
  • Bank.php: Her iki hesap dosyasını da dahil edin. Hesapları yöneten bir Bank sınıfı oluşturun:
    • Hesap numarasına göre indekslenmiş hesapları depolamak için özel bir dizi
    • addAccount(BankAccount $account): void: bir hesap ekler
    • findAccount(string $accountNumber): ?BankAccount: hesabı veya null değerini döndürür
    • transfer(string $fromAccount, string $toAccount, float $amount): string: hesaplar arasında para transferi yapar. "Source account not found", "Destination account not found" değerlerinden birini veya başarısız olması durumunda para çekme işleminin sonucunu döndürür. Başarılı olursa hedef hesaba para yatırır ve "Transferred $[amount] from [from] to [to]" değerini döndürür
  • main.php: Bank dosyasını dahil edin. İki girdi alacaksınız: hesap verileri (JSON) ve işlemler (JSON).

    Hesaplar için JSON biçimi:

    [{"type": "savings", "number": "SAV001", "holder": "Alice", "initial": 1000}, {"type": "checking", "number": "CHK001", "holder": "Bob", "initial": 500, "overdraft": 200}]

    İşlemler için JSON biçimi:

    [{"op": "deposit", "account": "SAV001", "amount": 200}, {"op": "withdraw", "account": "CHK001", "amount": 600}, {"op": "transfer", "from": "SAV001", "to": "CHK001", "amount": 300}, {"op": "interest", "account": "SAV001"}, {"op": "balance", "account": "SAV001"}]

    Bankayı ve tüm hesapları oluşturun (başlangıç tutarlarını yatırarak). Her işlemi işleyin:

    • "deposit": deposit() sonucunu yazdırın
    • "withdraw": withdraw() sonucunu yazdırın
    • "transfer": transfer() sonucunu yazdırın
    • "interest": applyInterest() sonucunu yazdırın (yalnızca tasarruf hesapları için)
    • "balance": "[holder] balance: $[balance]" değerini yazdırın (2 ondalık basamak)

    Her sonucu yeni bir satıra yazdırın. Tüm parasal tutarları 2 ondalık basamağa biçimlendirin.

Transferlerin atomik olması gerektiğini unutmayın; para çekme işlemi başarısız olursa para yatırma işlemi gerçekleşmemelidir. Korumalı $balance özelliği, alt sınıfların bu özelliği değiştirmesine izin verirken dış koddan gizli kalmasını sağlar ve böylece finansal bir bağlamda uygun kapsüllemeyi gösterir.

Kendin dene

<?php

require_once 'Bank.php';

// Girdiyi oku
$accountsJson = trim(fgets(STDIN));
$operationsJson = trim(fgets(STDIN));

// JSON girdilerini ayrıştır
$accounts = (array)json_decode($accountsJson, true);
$operations = (array)json_decode($operationsJson, true);

// TODO: Bir Bank örneği oluştur

// TODO: Hesap verilerinden hesaplar oluştur
// $accounts içindeki her hesap için:
//   - Tip "savings" ise, SavingsAccount oluştur
//   - Tip "checking" ise, CheckingAccount oluştur (sağlanmışsa overdraft ile)
//   - Hesabı bankaya ekle
//   - Başlangıç tutarını yatır

// TODO: Her işlemi işle
// $operations içindeki her işlem için:
//   - "deposit": deposit() sonucunu yazdır
//   - "withdraw": withdraw() sonucunu yazdır
//   - "transfer": transfer() sonucunu yazdır
//   - "interest": applyInterest() sonucunu yazdır (yalnızca savings için)
//   - "balance": "[holder] balance: $[balance]" yazdır (2 ondalık basamak)

?>

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online PHP derleyicisi