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ı transferleri yöneten bir Banka Sistemi oluşturalım. Finansal verileri korumak için uygun kapsülleme (encapsulation), farklı hesap türleri için kalıtım (inheritance) ve veri bütünlüğünü sağlamak için doğrulama içeren bir sistem oluşturacaksınız.

Kodunuzu altı dosya halinde 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 constructor promotion kullanın. Tüm özellikler public readonly olmalıdır. "[type]: $[amount]" döndüren (tutarı 2 ondalık basamağa göre formatlayın) bir getDescription(): string metodu ekleyin.
  • BankAccount.php — Transaction dosyasını dahil edin. Aşağıdaki özelliklere sahip soyut bir BankAccount sınıfı oluşturun:
    • accountNumber (string, public readonly) ve holderName (string, public readonly) için constructor promotion
    • 0.0 olarak başlatılan korumalı (protected) bir $balance özelliği
    • İşlem geçmişini saklamak için özel (private) bir dizi
    • getBalance(): float — mevcut bakiyeyi döndürür
    • deposit(float $amount): string — bakiyeye ekleme yapar, işlemi kaydeder, "Deposited: $[amount]" döndürür
    • abstract withdraw(float $amount): string — alt sınıflar para çekme kurallarını uygular
    • addTransaction(Transaction $t): void — geçmişe işlem eklemek için korumalı (protected) metod
    • getTransactionCount(): int — işlem sayısını döndürür
  • SavingsAccount.php — BankAccount dosyasını dahil edin. BankAccount sınıfını genişleten bir SavingsAccount sınıfı oluşturun:
    • 0.02 (%2) olarak ayarlanmış bir sınıf sabiti (class constant) INTEREST_RATE
    • withdraw(float $amount): string — tutar bakiyeyi aşarsa "Insufficient funds" döndürür; aksi takdirde tutarı düşer, işlemi kaydeder, "Withdrew: $[amount]" döndürür
    • applyInterest(): string — mevcut bakiye üzerinden faiz hesaplar, bunu bir mevduat (deposit) olarak ekler, "Interest applied: $[interest]" döndürür
  • CheckingAccount.php — BankAccount dosyasını dahil edin. BankAccount sınıfını genişleten bir CheckingAccount sınıfı oluşturun:
    • Yapıcı (constructor) aracılığıyla ayarlanan özel (private) bir $overdraftLimit özelliği (varsayılan değeri 100.0 olan üçüncü bir parametre ekleyin)
    • withdraw(float $amount): string — tutar bakiye + kredili mevduat limitini (overdraft limit) aşmıyorsa para çekmeye izin verir; başarısızlık durumunda "Insufficient funds (overdraft limit: $[limit])", başarı durumunda "Withdrew: $[amount]" 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ı saklamak için özel (private) bir dizi
    • addAccount(BankAccount $account): void — bir hesap ekler
    • findAccount(string $accountNumber): ?BankAccount — hesabı veya null döndürür
    • transfer(string $fromAccount, string $toAccount, float $amount): string — hesaplar arası para transferi yapar. "Source account not found", "Destination account not found" veya başarısız olursa para çekme işleminin sonucunu döndürür. Başarılı olursa, hedef hesaba yatırın ve "Transferred $[amount] from [from] to [to]" döndürün
  • main.php — Bank dosyasını dahil edin. İki girdi alacaksınız: hesap verileri (JSON) ve işlemler (JSON).

    Hesaplar JSON formatı:

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

    İşlemler JSON formatı:

    [{"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]" 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 göre formatlayın.

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ı (protected) $balance özelliği, alt sınıfların bu özelliği değiştirmesine izin verirken dış koddan gizli tutulmasını sağlar ve finansal bir bağlamda uygun kapsüllemeyi (encapsulation) 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şturun

// TODO: Hesap verilerinden hesapları oluşturun
// $accounts içindeki her bir hesap için:
//   - Tür "savings" ise, SavingsAccount oluşturun
//   - Tür "checking" ise, CheckingAccount oluşturun (varsa kredili mevduat ile)
//   - Hesabı bankaya ekleyin
//   - Başlangıç tutarını yatırın

// TODO: Her bir işlemi gerçekleştirin
// $operations içindeki her bir işlem için:
//   - "deposit": deposit() sonucunu yazdırın
//   - "withdraw": withdraw() sonucunu yazdırın
//   - "transfer": transfer() sonucunu yazdırın
//   - "interest": applyInterest() sonucunu yazdırın (sadece birikim hesapları için)
//   - "balance": "[holder] balance: $[balance]" yazdırın (2 ondalık basamaklı)

?>

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