侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1823 篇文章
  • 累计收到 0 条评论

实现一个安全的银行账户类

2025-12-11 / 0 评论 / 4 阅读

题目

实现一个安全的银行账户类

信息

  • 类型:问答
  • 难度:⭐⭐

考点

类与对象, 封装, 异常处理, 实例方法

快速回答

实现要点:

  • 创建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方法实现复利计算