讲师中心 微信公众号
AI工具推荐 视频效率加速

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

酷芳酱_7723

酷芳酱_7723

发布时间:2026-03-31 14:12:12

|

179人浏览过

|

来源于php中文网

原创

本文详解如何为 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 < 0 || 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 < minScore) {
                minScore = newScore;
            }
        }

        // 规则5 & 6:累加并计数
        sum += newScore;
        count++;

        return sum;
    }

    // 辅助 getter(供验证与测试使用)
    public int getMinScore() { return count == 0 ? 0 : minScore; }
    public int getMaxScore() { return count == 0 ? 0 : maxScore; }
    public double getAverage() { return count == 0 ? 0.0 : (double) sum / count; }
    public int getCount() { return count; }
}

? 关键设计说明

  • 防御性编程:构造函数中对 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 系统中值得信赖的数据聚合入口。

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

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

相关专题

更多
java
java

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

11777

2023.06.15

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

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

8882

2023.07.05

java自学难吗
java自学难吗

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

7612

2023.07.31

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

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

1244

2023.08.01

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

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

1008

2023.08.02

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

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

1496

2023.08.02

java有什么用
java有什么用

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

3089

2023.08.02

java在线网站
java在线网站

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

20351

2023.08.03

Uvicorn 报错与问题解决教程
Uvicorn 报错与问题解决教程

本专题汇总了Uvicorn服务器常见问题与报错解决的教程合集,涵盖启动失败、端口占用、模块导入错误、事件循环冲突及热重载失效等典型故障的排查思路。同时整理了多进程与Worker配置、SSL/HTTPS证书报错、跨域与代理配置等实战解决方案,助你快速定位并解决Uvicorn运行中的各类问题。

0

2026.11.02

热门下载

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

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn