當然,多態性。每當你看到長開關語句或者/ 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