【发布时间】:2021-12-02 18:31:48
【问题描述】:
我最近在工作中遇到了一段代码,它有一个重复的 if-else 条件,它检查一个名为 OperationType 的枚举:
public enum OperationType
{ A, B }
现在该类的工作是在设备 A 或设备 B 上运行操作,同时从 SharedDevice 读取数据并存储一些基本用于 X、Y 绘图的值。我们在DeviceA或DeviceB的函数中记录了SharedDevice的特性。问题是我们需要遍历不同参数的列表并将它们发送到 SharedDevice。此列表对于设备 A 和设备 B 是不同的。
Device类:
public class Device
{
public double CurrentValue { get; }
public DeviceParameters Parameters { get; set; }
}
这里是负责执行这个操作的类:
public class MyOperationExecuter
{
public Device SharedDevice { get; }
public Device DeviceA { get; }
public Device DeviceB { get; }
public List<DeviceParameters> ParametersA { get; }
public List<DeviceParameters> ParametersB { get; }
public List<double> XValuesOfA { get; }
public List<double> YValuesOfA { get; }
public List<double> XValuesOfB { get; }
public List<double> YValuesOfB { get; }
public void DoMyOperation(OperationType operationType)
{
List<DeviceParameters> changingDeviceParameters;
if (operationType == OperationType.A)
{
changingDeviceParameters = ParametersA;
}
else
{
changingDeviceParameters = ParametersB;
}
if (operationType == OperationType.A)
{
XValuesOfA.Clear();
YValuesOfA.Clear();
}
else
{
XValuesOfB.Clear();
YValuesOfB.Clear();
}
foreach (var parameters in changingDeviceParameters)
{
// set the device parameters
SharedDevice.Parameters = parameters;
// retrieve the device readings and store the values in the correct dataprovider
if (operationType == OperationType.A)
{
XValuesOfA.Add(DeviceA.CurrentValue);
YValuesOfA.Add(SharedDevice.CurrentValue));
}
else
{
XValuesOfB.Add(DeviceB.CurrentValue);
YValuesOfB.Add(SharedDevice.CurrentValue);
}
}
// save updated x,y data
Save();
}
}
正如你所看到的,有一个重复的 if 语句,这不是未来的证明,因为我们必须在每一步中检查枚举。此外,我们可能需要添加一个 C 类型的设备,这将导致不断增长的 switch 语句。我们可能还需要在 A 和 B 上执行操作。我应该如何重构这个操作,以便我可以继续扩展它,而不会总是重复 if-else 逻辑?
【问题讨论】:
-
您可以从一个将
List<double>作为参数和List<DeviceParameters>并传入XValuesOfB或XValuesOfB等的方法开始。基于operationType。小步骤重构..
标签: c# if-statement design-patterns enums