![](/img/trans.png)
[英]How to go about formatting code without hurting the DRY principle in java + PDFBox?
[英]My code violates the DRY principle, but unsure about how to proceed with refactoring
我對 OOP 非常陌生,並且在 Java 中編寫了一些用於在不同長度單位之間轉換雙精度值的類,但是我意識到我違反了 DRY 原則,因為類似的類基本上做同樣的事情。
問題 1:在這種情況下,創建計量單位的更好解決方案是什么?
問題 2:我想在 'lengthConverter' class 中完成所有轉換,但我意識到它在多個類之間進行了拆分。 將 'Feet' class 中的 'convertTo' 方法放入 'lengthConverter' class 等每個附加單元是否有意義?
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 枚舉。 查看TimeUnit (特別是TimeUnit.convert(long,TimeUnit) )進行轉換。 源代碼在GitHub上可用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.