Ruby TDD练习求助:如何实现学习后成绩提升功能
解决Ruby TDD练习中的成绩升级问题
嘿,你这个问题其实有几种很实用的解决思路,计数器确实是完全可行的方案之一,当然我们也可以用更灵活的等级映射方式来实现。我给你详细拆解下两种方案,都能完美通过你的第二个测试~
方案一:使用计数器直接控制等级
我们可以给Student类添加一个学习次数的实例变量,每次调用study方法时增加计数,再根据计数来对应不同的成绩等级。这样逻辑清晰,很容易理解:
class Student attr_reader :grade def initialize(grade = "C") @grade = grade # 根据初始成绩设置对应的学习次数基准 @study_count = case grade when 'C' then 0 when 'B' then 1 when 'A' then 2 else 0 end end def study # 最多升到A,所以次数达到2后不再增加 @study_count += 1 unless @study_count >= 2 # 根据当前学习次数更新成绩 @grade = case @study_count when 0 then 'C' when 1 then 'B' when 2 then 'A' else 'A' end end end
方案二:使用等级数组映射(扩展性更强)
如果以后可能需要增加更多成绩等级(比如D、A+这类),用数组来维护等级顺序会更灵活。我们可以定义一个固定的等级数组,通过索引来控制当前成绩:
class Student # 定义成绩等级的顺序,后续扩展只需要修改这个数组 GRADE_LEVELS = ['C', 'B', 'A'].freeze attr_reader :grade def initialize(grade = "C") # 确保初始成绩在合法范围内,默认回到C current_index = GRADE_LEVELS.index(grade) || 0 @current_grade_index = current_index @grade = GRADE_LEVELS[current_index] end def study # 只有当前没到最高等级时才升级 if @current_grade_index < GRADE_LEVELS.length - 1 @current_grade_index += 1 @grade = GRADE_LEVELS[@current_grade_index] end end end
验证效果
这两种方案都能完美通过你的测试:
def test_grade_can_improve student = Student.new student.study assert_equal "B", student.grade student.study assert_equal "A", student.grade end
而且额外处理了边界情况:如果学生初始成绩已经是A,多次调用study也不会改变成绩,符合逻辑。
回到你的问题:计数器是完全合理的选择,方案一就是基于计数器的直接实现,方案二的索引其实也是计数器的一种变种,都能满足你的需求。如果只是当前的C→B→A需求,两种方案都好用;如果考虑未来扩展,方案二更值得推荐。
内容的提问来源于stack exchange,提问作者cjl85
相关产品推荐
相关产品推荐

