[英]What would be the best practice for using switch statements? nested? specific?
只是想知道如果兩個代碼塊都會產生相同的結果,哪種方法會更好:
string from = ddFrom.SelectedItem.ToString(),
to = ddTo.SelectedItem.ToString();
switch(from)
{
case "celsius":
switch(to)
{
case "celsius":
break;
case "fahrenheit":
break;
case "kelvin":
break;
}
break;
case "fahrenheit":
switch(to)
{
case "celsius":
break;
case "fahrenheit":
break;
case "kelvin":
break;
}
break;
case "kelvin":
switch(to)
{
case "celsius":
break;
case "fahrenheit":
break;
case "kelvin":
break;
}
break;
}
或者這個:
string from = ddFrom.SelectedItem.ToString(),
to = ddTo.SelectedItem.ToString(),
conversion = from + to;
switch(conversion)
{
case "celsiusfahrenheit":
break;
case "celsiuskelvin":
break;
case "fahrenheitcelsius":
break;
case "fahrenheitkelvin":
break;
case "kelvincelsius":
break;
case "kelvinfahrenheit":
break;
}
謝謝。
第二種選擇更可取,因為正如大家所說,它使代碼的外觀和感覺更好。
但是,您可能需要考慮一個更具架構性的選項:
public class TemperatureConverter
{
private static readonly IDictionary<Tuple<string, string>, Func<double, double>> ConverterMap =
new Dictionary<Tuple<string, string>, Func<double, double>>
{
{ Tuple.Create("celsius", "kelvin"), t => t + 273 },
// add similar lines to convert from/to other measurements
}
public static double Convert(double degrees, string fromType, string toType)
{
fromType = fromType.ToLowerInvariant();
toType = toType.ToLowerInvariant();
if (fromType == toType) {
return degrees; // no conversion necessary
}
return ConverterMap[Tuple.Create(fromType, toType)](degrees);
}
}
用法:
TemperatureConverter.Convert(0, "celcius", "kelvin");
當然,這可以進一步改進(首先想到的是使用枚舉值而不是溫度類型的字符串,還需要進行一些錯誤檢查),但總體思路就在那里。
恕我直言,這是老式 C 風格的大型switch
和成熟的 OO 方法之間的一個很好的中間方法(這里實際上不需要 OO,因為這個特定的轉換問題有一個非常簡單的域模型)。
第二個對於快速結果和更少的編碼會更好,因為它給出了相同的結果。
最好重構你的代碼,這樣你就有了溫標類和一個抽象工廠,它根據輸入字符串返回相應的實例:
public interface ITemperatureScale
{
double GetAbsoluteValue();
ITemperatureScale ConvertTo(ITemperatureScale temperatureScale);
}
public class CelciusScale : ITemperatureScale
{
public double GetAbsoluteValue()
{
throw new NotImplementedException();
}
public ITemperatureScale ConvertTo(ITemperatureScale temperatureScale)
{
throw new NotImplementedException();
}
}
public class FarScale : ITemperatureScale
{
public double GetAbsoluteValue()
{
throw new NotImplementedException();
}
public ITemperatureScale ConvertTo(ITemperatureScale temperatureScale)
{
throw new NotImplementedException();
}
}
public class KelvinScale: ITemperatureScale
{
public double GetAbsoluteValue()
{
throw new NotImplementedException();
}
public ITemperatureScale ConvertTo(ITemperatureScale temperatureScale)
{
throw new NotImplementedException();
}
}
public static class TemperatureScaleProvider
{
private const string SCALE_CELSIUS = "celsius";
private const string SCALE_KELVIN = "kelvin";
private const string SCALE_FAHRENHEIT = "fahrenheit";
public static ITemperatureScale GetFromString(string temperatureScaleString)
{
//Some input checks here
switch (temperatureScaleString.ToLowerInvariant())
{
case (SCALE_CELSIUS):
return new CelciusScale();
case (SCALE_KELVIN):
return new KelvinScale();
case (SCALE_FAHRENHEIT):
return new FarScale();
default:
throw new ArgumentException("temperatureScaleString");
}
}
}
用法將是:
ITemperatureScale fromScale = TemperatureScaleProvider.GetFromString("celcius");
ITemperatureScale toScale = TemperatureScaleProvider.GetFromString("KELvIN");
我認為第二個更好,更直接且更具可讀性。 如果需要,第二種方法將來會更容易維護、修改和擴展。
選項 #2 看起來更干凈,並且會產生相同的結果
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.