Ruby OOP实例方法问题:VendingMachine类购买零食余额校验报错求助
问题原因
你当前触发购买报错的核心问题是buy_snack方法的购买资格判断逻辑存在缺失:
原代码仅判断了「库存为0」或「用户余额为0」两种拦截场景,遗漏了用户余额大于0但不足以支付零食价格的情况,比如零食定价100分,用户仅投入50分的场景下,原代码依然会允许用户完成购买,不符合业务逻辑,因此触发测试错误。
三个属性原有的变化逻辑:
snack_price_cents:初始化时赋值,用attr_reader声明不可修改,购买操作全程不会变动,原有逻辑正确。snack_count:只要不满足「库存为0/余额为0」的拦截条件就直接减1,没有做余额是否足够覆盖定价的校验,逻辑错误。user_balance_cents:只要不满足拦截条件就直接扣除零食定价,没有余额校验,逻辑错误。
修复方案
只需要修改buy_snack方法的判断条件,将余额校验从「是否为0」调整为「是否大于等于零食定价」即可,修改后的完整代码如下:
class VendingMachine attr_reader :snack_price_cents, :user_balance_cents attr_accessor :snack_count def initialize(snack_price_cents, snack_count) @user_balance_cents = 0 @snack_count = snack_count @snack_price_cents = snack_price_cents end def insert_coin(input_cents) @user_balance_cents = user_balance_cents + input_cents if input_cents end def buy_snack # 调整拦截条件:库存为0 或 余额不足以支付定价 则拦截购买 if snack_count.zero? || user_balance_cents < snack_price_cents return end # 购买成功才修改库存和余额 @snack_count -= 1 @user_balance_cents -= snack_price_cents end end
修改后三个属性的正确变化逻辑:
snack_price_cents:依然保持初始化赋值后不可修改,符合定价固定的业务逻辑。snack_count:仅当库存≥1、用户余额≥零食定价时才减1,其余场景保持原有数值。user_balance_cents:仅当购买成功时扣除对应零食定价,其余场景保持原有数值。
内容的提问来源于stack exchange,提问作者Onur Karadeniz
相关产品推荐
相关产品推荐

