题目
实现一个安全的银行账户类
信息
- 类型:问答
- 难度:⭐⭐
考点
类与对象, 封装, 异常处理, 实例方法
快速回答
实现要点:
- 创建
BankAccount类,包含balance实例变量 - 通过
deposit方法处理存款,需验证金额有效性 - 通过
withdraw方法处理取款,需检查余额充足性 - 使用自定义异常
InsufficientFundsError处理透支情况 - 通过
attr_reader安全暴露余额
问题核心
本题要求实现一个线程安全的银行账户类,需正确处理存款/取款业务逻辑,并通过异常机制防止非法操作。
代码实现
class InsufficientFundsError < StandardError; end
class BankAccount
attr_reader :balance
def initialize(initial_balance = 0)
@balance = initial_balance
end
def deposit(amount)
raise ArgumentError, "存款金额必须为正数" unless amount > 0
@balance += amount
end
def withdraw(amount)
raise ArgumentError, "取款金额必须为正数" unless amount > 0
raise InsufficientFundsError, "余额不足" if amount > @balance
@balance -= amount
amount
end
end原理说明
- 封装:通过类封装账户状态(
@balance),避免外部直接修改 - 异常处理:自定义
InsufficientFundsError明确业务错误,ArgumentError处理参数错误 - 数据验证:存款/取款前验证金额正负性和余额充足性
最佳实践
- 使用
attr_reader替代attr_accessor防止余额被外部修改 - 异常消息明确具体错误原因(如区分"金额无效"和"余额不足")
- 方法返回取款金额保持接口一致性
常见错误
- 未验证金额正负性:允许负数的存款/取款操作
- 缺少异常处理:直接使用
puts输出错误 - 未使用线程安全机制:多线程环境下需加锁(
Mutex)
扩展知识
- 线程安全改进:
def initialize @balance = 0 @mutex = Mutex.new end def withdraw(amount) @mutex.synchronize { # 同步操作代码 } end - 交易记录:可扩展
@transactions数组记录每笔操作 - 利率计算:添加
apply_interest方法实现复利计算