如何为成绩簿类编写符合业务逻辑的 accrueScore() 修改器方法

酷芳酱_7723

酷芳酱_7723

2026-03-31

179人浏览

原创

本文详解如何为 Gradebook 中的 Assignment 类设计健壮、可维护的 accrueScore() mutator 方法,涵盖边界校验、极值更新、累加统计等核心逻辑,并提供完整可运行代码与关键注意事项。

本文详解如何为 gradebook 中的 assignment 类设计健壮、可维护的 `accruescore()` mutator 方法,涵盖边界校验、极值更新、累加统计等核心逻辑,并提供完整可运行代码与关键注意事项。

在面向对象编程中,mutator(修改器)方法是封装数据变更逻辑的核心机制。对于模拟课程成绩管理的 Assignment 类,accrueScore(int newScore) 不仅需安全地更新内部状态,还需严格遵循业务规则:拒绝非法分数、动态维护极值、持续累积统计量。以下是一个专业、鲁棒且符合 Java 最佳实践的实现方案。

✅ 正确实现 accrueScore()

public class Assignment {
    private String name;
    private int totalPoints;
    private int minScore;
    private int maxScore;
    private int sum;
    private int count;

    public Assignment(String inName, int inTotalPoints) {
        this.name = inName;
        this.totalPoints = Math.max(0, inTotalPoints); // 防御性初始化:totalPoints ≥ 0
        this.minScore = 0;
        this.maxScore = 0;
        this.sum = 0;
        this.count = 0;
    }

    /**
     * 将新分数加入成绩记录。仅当分数合法(0 ≤ score ≤ totalPoints)时执行更新。
     * 自动维护最小分、最大分、总分和计数。
     *
     * @param newScore 待添加的分数
     * @return 当前累计分数总数(便于链式调用或调试),若未更新则返回原 sum
     */
    public int accrueScore(int newScore) {
        // 规则1:范围校验 —— 分数必须在 [0, totalPoints] 闭区间内
        if (newScore  totalPoints) {
            return sum; // 拒绝非法输入,不改变任何状态,返回当前 sum
        }

        // 规则2:首次录入 —— 初始化 min/max 为当前分数
        if (count == 0) {
            minScore = maxScore = newScore;
        } else {
            // 规则3 & 4:动态更新极值(无需 else-if,因 min/max 可能同时被同一分数触发)
            if (newScore > maxScore) {
                maxScore = newScore;
            }
            if (newScore <h3>? 关键设计说明</h3>
  • 防御性编程:构造函数中对 inTotalPoints 做 Math.max(0, ...) 处理,避免后续范围判断失效;accrueScore() 入口即做完整边界检查( totalPoints),比原文中 0
  • 首次录入的原子性:使用 count == 0 判断而非依赖初始值(如 minScore == 0),避免 totalPoints == 0 时逻辑混淆。
  • 极值更新独立判断:if (newScore > maxScore) 和 if (newScore
  • 返回值语义明确:返回 sum 支持链式调用(如 assignment.accrueScore(95).accrueScore(87) 不适用,但利于日志/断言),且便于单元测试验证状态一致性。
  • 无副作用原则:非法输入绝不修改任何字段(包括 minScore/maxScore 的初始值),确保对象始终处于一致、可预测状态。

⚠️ 注意事项与常见陷阱

  • ❌ 不要在构造函数中将 minScore/maxScore 初始化为 Integer.MAX_VALUE/Integer.MIN_VALUE:虽常见于算法题,但在此业务场景中会破坏“未录入分数时无有效极值”的语义,且易引发平均分计算错误。
  • ❌ 避免在 accrueScore() 中抛出异常替代静默忽略:分数越界属于预期中的业务约束(如学生误填 150/100),应静默拒绝而非中断流程;异常适用于真正意外的故障(如 null 输入)。
  • ✅ 建议补充单元测试:
    @Test
    void testAccrueScore() {
        Assignment hw = new Assignment("HW1", 100);
        assertEquals(0, hw.getCount());
        hw.accrueScore(85);
        assertEquals(85, hw.getMinScore());
        assertEquals(85, hw.getMaxScore());
        assertEquals(85, hw.getSum());
        assertEquals(1, hw.getCount());
        hw.accrueScore(92);
        assertEquals(85, hw.getMinScore());
        assertEquals(92, hw.getMaxScore());
        assertEquals(177, hw.getSum());
        hw.accrueScore(-5); // 越界,无变化
        assertEquals(2, hw.getCount()); // count 不变
    }

通过以上实现,accrueScore() 不仅满足题目全部六条规则,更具备生产环境所需的健壮性、可读性与可测试性,是 Gradebook 系统中值得信赖的数据聚合入口。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

11777

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

8882

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

7612

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1244

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

1008

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1496

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

3089

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

20351

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1355

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习