java - 如何将函数重构为目标函数?

标签 java math refactoring

鲍勃叔叔在他的“干净代码”中提供了无需步骤的重构示例,因此我在阅读时尝试复制它们。

原始代码:

public int calculateWeeklyPay(boolean overtime) {
 int tenthRate = getTenthRate();
 int tenthsWorked = getTenthsWorked();
 int straightTime = Math.min(400, tenthsWorked);
 int overTime = Math.max(0, tenthsWorked - straightTime);
 int straightPay = straightTime * tenthRate;
 double overtimeRate = overtime ? 1.5 : 1.0 * tenthRate;
 int overtimePay = (int)Math.round(overTime*overtimeRate);
 return straightPay + overtimePay;
 }

重构:

public int straightPay() {
 return getTenthsWorked() * getTenthRate();
 }
 public int overTimePay() {
 int overTimeTenths = Math.max(0, getTenthsWorked() - 400);
 int overTimePay = overTimeBonus(overTimeTenths);
 return straightPay() + overTimePay;
 }
 private int overTimeBonus(int overTimeTenths) {
 double bonus = 0.5 * getTenthRate() * overTimeTenths;
 return (int) Math.round(bonus);
 }

问题出在加类费上。当我尝试替换变量和函数时,我得到以下结果:

overtimePay = round(max(0, tenthsWorked - min(400, tenthsWorked))*tenthRate);

在原始和目标中

overtimePay = round(0.5 * tenthRate * max(0, tenthsWorked - 400));

为什么是 0.5?

另外,原来的overtimeRate中可能少了一个“)”,但是不管怎样,为什么新的overtimePay是这样的呢?

最佳答案

0.5 * tenthRate来自加类率 ( 1.5 * tenthRate ) 和非加类率 ( 1.0 * tenthRate ) 之间的差异。

重构版本背后的逻辑是,您不必为非加类时间和加类时间单独计算工资金额,而只需为整个工作时间支付标准费率

关于java - 如何将函数重构为目标函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57927734/

相关文章:

java - 没有到主机的路由 - Android 客户端 TCP 连接

java - 在鼠标单击时创建对象时出错,根本无法发现代码中的错误

java - 不要转义 th :content tag in Thymeleaf

python - 查找由一组线创建的平面的所有分区

python - Python 中的 C 指针算法

javascript - 从原型(prototype)类改进此代码片段

java - 关于Java内存模型的一个问题

c++ - 如何在 OpenCv 中使用变换矩阵变换图像?

C# 自动化构造函数重构

c# - 在 visual studio 中快速轻松重构