
本文详解如何为 Assignment 类设计健壮、可维护的 accrueScore mutator 方法,涵盖边界校验、极值更新、累计统计等核心逻辑,并提供完整可运行代码与关键注意事项。
本文详解如何为 `assignment` 类设计健壮、可维护的 `accruescore` mutator 方法,涵盖边界校验、极值更新、累计统计等核心逻辑,并提供完整可运行代码与关键注意事项。
在面向对象编程中,mutator(修改器)方法用于安全地变更对象内部状态。对于模拟单个作业成绩管理的 Assignment 类,accrueScore(int newScore) 是一个典型的数据聚合型修改器——它不返回新对象,而是持续更新成绩统计元数据。正确实现需兼顾数据一致性、边界鲁棒性和逻辑完整性。
✅ 核心实现逻辑解析
accrueScore 需严格遵循六条业务规则。关键在于:
- 先校验,再操作:所有更新动作仅在 0 ≤ newScore ≤ totalPoints 时执行;
- 首次赋值特殊处理:当 count == 0 时,minScore 和 maxScore 同时初始化为 newScore,避免初始值(如 0)干扰后续比较;
- 极值动态维护:使用独立 if 判断(而非 else if),确保 newScore 可同时成为新的最小值和最大值(虽数学上不可能,但逻辑更清晰且便于未来扩展);
- 原子性累计:sum += newScore 与 count++ 必须成对执行,且置于校验块内,防止非法分数污染统计。
以下是完整、经优化的实现(含必要注释与修复):
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 = inTotalPoints;
// 初始化为无效值(非0),明确标识“尚未录入任何成绩”
this.minScore = Integer.MAX_VALUE;
this.maxScore = Integer.MIN_VALUE;
this.sum = 0;
this.count = 0;
}
/**
* 记录一次作业得分,自动更新统计信息
* @param newScore 待录入的成绩(必须在 [0, totalPoints] 范围内)
* @return 当前累计成绩总数(便于链式调用或调试),非法输入时返回当前 sum
*/
public int accrueScore(int newScore) {
// 规则1:范围校验(闭区间)
if (newScore totalPoints) {
return sum; // 提前退出,不修改任何状态
}
// 规则2:首次录入 —— 初始化极值
if (count == 0) {
minScore = maxScore = newScore;
} else {
// 规则3 & 4:动态更新极值(独立判断,逻辑清晰)
if (newScore > maxScore) {
maxScore = newScore;
}
if (newScore <h3>⚠️ 关键注意事项</h3>
- 初始值陷阱:原代码将 minScore/maxScore 初始化为 0,会导致首个正数成绩无法正确更新 minScore(因 0
- 方法返回值设计:返回 sum 既满足“无副作用”原则(不改变对象状态),又提供即时反馈,支持如 System.out.println(assignment.accrueScore(85)); 的调试场景。
- 线程安全性:当前实现非线程安全。若需并发访问,应添加同步块(如 synchronized(this))或改用 AtomicInteger。
- 扩展建议:生产环境可增加日志记录、事件通知(如 ScoreAddedEvent)或异常抛出(如 IllegalArgumentException 替代静默忽略),以增强可观测性。
通过以上实现,Assignment 类不仅能准确建模单次作业的成绩聚合过程,其清晰的逻辑分层与防御性编程风格,也为后续扩展(如成绩分布直方图、离群值检测)奠定了坚实基础。










