Menu
CoddyTech

Ôn tập: hệ thống thanh toán

Thuộc phần Lập trình hướng đối tượng trong hành trình Swift của Coddy. Bài học 31 trên 57.

challenge icon

Thử thách

Khó

Thiết kế một hệ thống thanh toán bằng các giao thức. PaymentMethod yêu cầu name, fee(for amount: Int) -> Int và mutating func pay(_ amount: Int) -> Bool. Phần mở rộng giao thức cung cấp total(for:) (số tiền cộng với phí). Hãy triển khai Card (phí 2% được làm tròn xuống, luôn thành công, đếm payments), Wallet (có balance được lưu trữ, không tính phí, thất bại khi tổng số tiền lớn hơn số dư, nếu không thì trừ số tiền đó khỏi số dư) và GiftCard (có balance được lưu trữ, không tính phí, thanh toán trong phạm vi số dư: nếu số dư không đủ thì từ chối). Hoàn thành checkout(_:with:), hàm này thử từng phương thức thanh toán theo thứ tự đã cho và trả về paid 100 with wallet (fee 0) cho phương thức đầu tiên thanh toán thành công, hoặc declined nếu không có phương thức nào thành công. Hàm cũng trả về các phương thức đã cập nhật để số dư được giữ lại giữa các lần mua.

Code được cung cấp đọc số dư ví và số dư thẻ quà tặng, sau đó đọc các khoản tiền mua hàng. Với mỗi lần mua, chương trình thử thẻ quà tặng, ví rồi đến thẻ theo thứ tự đó, in kết quả, sau đó in số dư cuối cùng.

Code của bạn nằm trong PaymentMethod.swift, Card.swift, Wallet.swift, GiftCard.swift và Functions.swift. main.swift chứa code đầu vào/đầu ra được cung cấp và bạn không thể chỉnh sửa tệp này.

Tự làm thử

// Đoạn code đầu vào/đầu ra đã cho: giữ nguyên
var input: [String] = []
while let line = readLine() { input.append(line) }
var methods: [any PaymentMethod] = [GiftCard(balance: Int(input[1])!), Wallet(balance: Int(input[0])!), Card()]
for line in input.dropFirst(2) {
    let (result, updated) = checkout(Int(line)!, with: methods)
    methods = updated
    print(result)
}
for m in methods {
    if let g = m as? GiftCard { print("gift card left \(g.balance)") }
    if let w = m as? Wallet { print("wallet left \(w.balance)") }
    if let c = m as? Card { print("card payments \(c.payments)") }
}

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Playground Swift