当然,多态性。每当你看到长开关语句或者/ then/else结构时,总是可以用多态和工厂来处理它们。在你的情况下,我会想象一个具有华氏温度,Celcius,Kelvin和Rankine的具体实现的IT温度转换接口将会很好地实现。
UPDATE:
如果你发现你有这样的逻辑重复,为什么不能有超过一个双重的角度更好的抽象?
如果您使用面向对象的语言编写代码,那么最好在基元之上(例如double和yes,string)将行为封装到对象中。
我会考虑一个角度类,它会挂在这个值上,并将它作为你想要的任何度量返回。
下面是在Java中执行此操作的一种方法。我将把译文留给C#,其余的给你。
package angles;
public class Angle
{
private double value;
private AngleUnit units;
public Angle()
{
this(0.0, AngleUnit.RADIANS);
}
public Angle(double value)
{
this(value, AngleUnit.RADIANS);
}
public Angle(double value, AngleUnit units)
{
this.value = value;
this.units = units;
}
public double getValue()
{
return value;
}
public AngleUnit getUnits()
{
return units;
}
public Angle convert(AngleUnit newUnits)
{
Angle newAngle = null;
if (this.units.equals(newUnits))
{
return this;
}
return newAngle;
}
}
package angles;
public interface AngleConverter
{
Angle convert(Angle angle, AngleUnit to);
}
package angles;
public enum AngleUnit
{
DEGREES, RADIANS, GRADIANS;
}
package angles;
import java.util.HashMap;
import java.util.Map;
public class DegreeConverter implements AngleConverter
{
private final Map<AngleUnit, Double> factors;
public DegreeConverter(Map<AngleUnit, Double> factors)
{
this.factors = new HashMap<AngleUnit, Double>();
this.factors.put(AngleUnit.DEGREES, 1.0);
this.factors.put(AngleUnit.RADIANS, Math.PI/180.0);
this.factors.put(AngleUnit.GRADIANS, 100.0/90.);
}
public Angle convert(Angle angle, AngleUnit to)
{
assert angle != null && to != null;
return new Angle(angle.getValue()*this.factors.get(to), to);
}
}
看看markdown语法,下次您在SO上发布答案或问题时:http:// stackoverflow。com/editing-help – 2009-12-20 19:10:34