编写许多if语句的替代方法?

时间:2009-12-20 19:03:05

标签: c# winforms combobox

这是我的方法:

private void ConvertValues()  
{  
    txtResult.Text = angles[cmbUnits1.SelectedIndex];  
    double value1 = Convert.ToDouble(txtValue1.Text);  
    double value2 = Convert.ToDouble(txtValue2.Text);  
    int unit1 = cmbUnits1.SelectedIndex;  
}

我想要的方法是获取所选的ComboBox并测试值。但我想知道是否有替代方案:

if( angles[cmbUnits1.SelectedIndex].Equals("Degrees") && 
    angles[cmbUnits2.SelectedIndex].Equals("Radians")) {  
    ...  
}

顺便说一下,我正在制作一种单位转换器,所以我会有除角度以外的部分。所以我想要一些我可以实现的枚举,接口,抽象类或类。也许是一个名为Unit的班级?所以我可以用单位作为枚举来创建像Unit degrees = new Unit(Units.Angle)这样的新对象。或者只是Unit sqrMillimeters = new Unit("Area");

5 个答案:

答案 0 :(得分:9)

当然,多态性。任何时候你看到很长的switch语句或if / then / else构造它总是可以使用多态和工厂来处理它们。在你的情况下,我想象一个ITemperatureConverter接口,具有Fahrenheit,Celcius,Kelvin和Rankine的具体实现,可以很好地完成。

更新:

如果你发现你重复了这个逻辑,为什么没有一个更好的抽象角度而不是双倍?

如果您正在使用面向对象的语言编写,那么最好将原语(例如,double和,是的,字符串)升级为将行为封装到对象中。

我会考虑一个会挂在值上的Angle类,并将其作为您想要的任何度量返回。

这是在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);
    }
}

答案 1 :(得分:2)

double UnitToFactor(string unit) { returns 1 for radians, pi/180 for degrees, etc }

然后

ratio = UnitToFactor(unit1) / UnitToFactor(unit2);

dest = src*ratio

这样,代替N ^ 2 if()语句,你只有N。

答案 2 :(得分:1)

你有什么方法可以写一个switch声明吗?

switch (something)
{
  case "degrees" : do work
  ...etc
}

答案 3 :(得分:1)

SelectedIndexChanged / SelectedValueChanged事件和某些多态的组合怎么样?

答案 4 :(得分:0)

您可以连接两个字符串(“DegreesRadians”)并通过反射调用名为“DegreesRadians”的方法:

MethodInfo theMethod = thisType.GetMethod(methodName);
theMethod.Invoke(this, parameters);

其中methodName是连接字符串(可能带有附加信息,如“convert”+ unit1 +“2”+ unit2,如“convertDegrees2Radians”),而参数是包含两个值的数组。