【问题标题】:My code violates the DRY principle, but unsure about how to proceed with refactoring我的代码违反了 DRY 原则,但不确定如何进行重构
【发布时间】:2021-04-17 20:49:11
【问题描述】:

我对 OOP 很陌生,并且用 Java 编写了一些用于在不同长度单位之间转换双精度值的类,但是我意识到我违反了 DRY 原则,让类似的类做基本相同的事情。

问题 1:在这种情况下,创建计量单位的更好解决方案是什么?

问题 2: 我想在 'lengthConverter' 类中完成所有转换,但我意识到它在多个类之间进行了拆分。将 'Feet' 类中的 'convertTo' 方法放入 'lengthConverter' 类中是否有意义?

public class LengthConverter {

private Inches inches = new Inches();
private Feet feet = new Feet();
private Meters meters = new Meters();
private Miles miles = new Miles();
private Millimeters millimeters = new Millimeters();
private Centimeters centimeters = new Centimeters();
private Kilometers kilometers = new Kilometers();
private Yards yards = new Yards();

public LengthConverter() {
}

public double convert(String origUnit, double length, String toUnit) {
    double result = 0;
    switch (origUnit) {
        case "cm":
            centimeters.setLength(length);
            result = centimeters.convertTo(toUnit);
            break;
        case "ft":
            feet.setLength(length);
            result = feet.convertTo(toUnit);
            break;
        case "in":
            inches.setLength(length);
            result = inches.convertTo(toUnit);
            break;
        case "km":
            kilometers.setLength(length);
            result = kilometers.convertTo(toUnit);
            break;
        case "m":
            meters.setLength(length);
            result = meters.convertTo(toUnit);
            break;
        case "mi":
            miles.setLength(length);
            result = miles.convertTo(toUnit);
            break;
        case "mm":
            millimeters.setLength(length);
            result = millimeters.convertTo(toUnit);
            break;
        case "yd":
            yards.setLength(length);
            result = yards.convertTo(toUnit);
            break;
        default:
            System.out.println("Error: incorrect input");
    }
    return result;
}

public class Feet {
final private double FOOT_TO_CM = 30.48;
final private double FOOT_TO_INCH = 12;
final private double FOOT_TO_KM = 0.000305;
final private double FOOT_TO_METER = 0.3048;
final private double FOOT_TO_MILE = 0.000189;
final private double FOOT_TO_MM = 304.8;
final private double FOOT_TO_YD = 0.333333;
final private double FOOT = 1;

private double length;

public Feet() {
}

public void setLength(double length) {
    this.length = length;
}

public double convertTo(String unit) {
    double result = 0;
    switch (unit) {
        case "in":
            result = length * FOOT_TO_INCH;
            break;
        case "m":
            result = length * FOOT_TO_METER;
            break;
        case "mi":
            result = length * FOOT_TO_MILE;
            break;
        case "mm":
            result = length * FOOT_TO_MM;
            break;
        case "cm":
            result = length * FOOT_TO_CM;
            break;
        case "km":
            result = length * FOOT_TO_KM;
            break;
        case "yd":
            result = length * FOOT_TO_YD;
            break;
        case "ft":
            result = length * FOOT;
            break;
    }
    return result;
}

}

【问题讨论】:

标签: java oop refactoring dry


【解决方案1】:

您可以使用 Java 枚举。查看TimeUnit(特别是TimeUnit.convert​(long,TimeUnit))进行转换。来源在GitHub

【讨论】:

    猜你喜欢
    • 2014-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    相关资源
    最近更新 更多