Buku Besar Bank
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Swift di Coddy. Pelajaran 57 dari 57.
Tantangan
SulitBuat bank kecil. Account adalah class dengan id, owner, dan private(set) var balance, serta method deposit(_:) dan withdraw(_:) yang melempar BankError.invalidAmount (di bawah 1) dan BankError.insufficient(id:). Checking mengizinkan cerukan sebesar 100 (saldo dapat turun hingga -100); Savings menolak penarikan yang akan membuat saldo negatif, menambahkan bunga 1% (dibulatkan ke bawah) saat monthEnd(), dan mengizinkan paling banyak 2 penarikan per bulan (BankError.limit(id:)), yang diatur ulang oleh monthEnd(). Account.monthEnd() tidak melakukan apa pun. Class Bank menyimpan akun berdasarkan id dan memiliki transfer(from:to:amount:), yang melakukan penarikan dan setoran atau tidak mengubah apa pun jika gagal.
Kode yang disediakan membaca perintah open checking 1 ada, open savings 2 bo, dep 1 100, wd 2 30, tr 1 2 50 atau month, mencetak ok atau error (invalid amount, insufficient funds in 2, withdrawal limit on 2, no account 9), lalu mencetak setiap akun yang diurutkan berdasarkan id sebagai 1 ada checking: -20.
Kodemu ditulis di BankError.swift, Account.swift, Checking.swift, Savings.swift, dan Bank.swift. main.swift berisi kode input/output yang disediakan dan tidak boleh diedit.
Coba sendiri
// Kode input/output yang disediakan: biarkan apa adanya
var input: [String] = []
while let line = readLine() { input.append(line) }
let bank = Bank()
for cmd in input {
let p = cmd.split(separator: " ").map(String.init)
do {
switch p[0] {
case "open":
let id = Int(p[2])!
bank.accounts[id] = p[1] == "savings" ? Savings(id: id, owner: p[3]) : Checking(id: id, owner: p[3])
case "dep": try bank.account(Int(p[1])!).deposit(Int(p[2])!)
case "wd": try bank.account(Int(p[1])!).withdraw(Int(p[2])!)
case "tr": try bank.transfer(from: Int(p[1])!, to: Int(p[2])!, amount: Int(p[3])!)
default: bank.accounts.values.forEach { $0.monthEnd() }
}
print("ok")
} catch BankError.invalidAmount {
print("invalid amount")
} catch BankError.insufficient(let id) {
print("insufficient funds in \(id)")
} catch BankError.limit(let id) {
print("withdrawal limit on \(id)")
} catch BankError.noAccount(let id) {
print("no account \(id)")
} catch {
print("error")
}
}
for id in bank.accounts.keys.sorted() {
let a = bank.accounts[id]!
print("\(a.id) \(a.owner) \(a.kind): \(a.balance)")
}
Semua pelajaran di Pemrograman Berorientasi Objek
1Class dan Object
Bekerja dengan FileMendefinisikan ClassMethod dan selfInitializerClass adalah ReferensiUlasan: Kartu Perpustakaan4Enkapsulasi
Kontrol AksesHanya Bisa Dibaca dari LuarMelindungi StateInitializer yang Bisa GagalRangkuman: Rekening Bank7Polimorfisme dan Generik
PolimorfismeKonversi TipeFungsi GenerikTipe GenerikRangkuman: Kalkulator Bentuk2Struct dan Tipe Nilai
StructSemantik NilaiMethod yang Mengubah NilaiStruct atau classRangkuman, Item Inventaris11Proyek: Manajemen Perpustakaan
Buku dan AnggotaPeminjaman BukuLatihan sendiri: Playground Swift