了解现有代码段并消除if语句 [英] Understanding existing code snippet and eleminating if statements
问题描述
我对以下代码有两个疑问.该代码的一部分是我们其中一个应用程序的生产代码,很早以前就写过了.
第一季度.
我不明白类"ControlPosition"如何使用该类在类"PfControlPositions"内部使用.存储物理控制位置.
我不知道这有什么帮助.我们不能有一个常量类来存储这些值(我的意思是0、1、2、3等)
第二季度.
如果看到方法Do().实际上,它从其他组件"_calComponent.GetPosition()"获取位置编号.并将该值与pf控制位置(PfControlPositions)进行比较.
如您所见,我必须在这里使用许多假设条件.
我可以以某种方式消除很多if语句,并以更好的方式编写它.我也不能写开关盒,因为位置值是动态变化的,因此开关盒抛出编译时错误.我有一个约束 我只能修改DoSomething类.
你能建议吗?
公共接口ICalComponent
{
int GetPosition();
}
公共类DoSomething
{
私有只读ICalComponent _calComponent;
公共DoSomething(ICalComponent calComponent)
{
_calComponent = calComponent;
}
公共无效Do()
{
var功能=新的Dictionary< ControlAction,ControlFunctionality>();
整数= _calComponent.GetPosition();
如果(数字== PfControlPositions.pf1PositionOff)
{
功能[ControlAction.Medium] = ControlFunctionality.DoAction1;
}
如果(数字== PfControlPositions.pf1PositionOn)
{
功能[ControlAction.Medium] = ControlFunctionality.DoAction2;
}
如果(数字== PfControlPositions.pf1PositionOn)
{
功能[ControlAction.Medium] = ControlFunctionality.DoAction3;
}
如果(数字== PfControlPositions.pf2PositionOff)
{
功能[ControlAction.Medium] = ControlFunctionality.DoAction4;
}
如果(数字== PfControlPositions.pf1PositionOn)
{
功能[ControlAction.Medium] = ControlFunctionality.DoAction5;
}
如果(数字== PfControlPositions.pf1PositionOff)
{
功能[ControlAction.Medium] = ControlFunctionality.DoAction6;
}
如果(数字== PfControlPositions.pf2PositionOn)
{
功能[ControlAction.Medium] = ControlFunctionality.DoAction7;
}
如果(数字== PfControlPositions.pf2PositionOff)
{
功能[ControlAction.Medium] = ControlFunctionality.DoAction8;
}
如果(数字== PfControlPositions.pf3PositionOn)
{
功能[ControlAction.Medium] = ControlFunctionality.DoAction9;
}
如果(数字== PfControlPositions.pf3PositionOff)
{
功能[ControlAction.Medium] = ControlFunctionality.DoAction10;
}
}
}
公共类PfControlPositions
{
公共静态ControlPosition pf1PositionOff = new ControlPosition(0);
公共静态ControlPosition pf1PositionOn = new ControlPosition(1);
公共静态ControlPosition pf2PositionOn = new ControlPosition(2);
公共静态ControlPosition pf2PositionOff = new ControlPosition(3);
公共静态ControlPosition pf3PositionOn = new ControlPosition(4);
公共静态ControlPosition pf3PositionOff = new ControlPosition(5);
公共静态ControlPosition pf4PositionOn = new ControlPosition(6);
公共静态ControlPosition pf4PositionOff = new ControlPosition(7);
公共静态ControlPosition pf5PositionOn = new ControlPosition(8);
公共静态ControlPosition pf5PositionOff = new ControlPosition(9);
}
公共类ControlPosition
{
私有只读UInt32 _physicalPosition;
公共ControlPosition(UInt32 physicalStepPosition)
{
_physicalPosition = physicalStepPosition;
}
公共静态隐式运算符int(ControlPosition position)
{
return(int)position._physicalPosition;
}
}
公共枚举ControlFunctionality
{
DoAction1,
DoAction2,
DoAction3,
DoAction4,
DoAction5,
DoAction6,
DoAction7,
DoAction8,
DoAction9,
DoAction10,
}
公共枚举ControlAction
{
拨= 0,
短= 1,
中= 2
}
非常感谢
我认为字典应该在这里工作.但不幸的是它没有用.有人可以建议字典在这里还是在我做错的地方能工作吗?
字典< ControlPosition,ControlFunctionality>功能=新字典< ControlPosition,ControlFunctionality>(){
{PfControlPositions.pf1PositionOff,ControlFunctionality.DoAction1},
{PfControlPositions.pf1PositionOn,ControlFunctionality.DoAction2}
};
var功能=新的Dictionary< ControlAction,ControlFunctionality>();整数= _calComponent.GetPosition();
功能[ControlAction.Medium] =功能[数量];在这里失败了
功能[ControlAction.Medium] =功能[数量];
错误:参数类型为"int";不能分配给参数类型"ControlPosition".理想情况下,当我看到代码时,它应该可以正常工作,因为"_calComponent.GetPosition()"返回一个int并且
"PfControlPositions.pf1PositionOff" 也是int.您知道为什么它会失败吗?
Hi,
I have two questions with the below code. Part of the code is the production code from one of our application written long back.
Q1.
I do not understand how the class "ControlPosition" works.This class is used inside class "PfControlPositions" to store the physical control positions.
I did not understand how this helps. Can't we have a constant class to store these values (i mean 0, 1, 2, 3 etc)
Q2.
If you see the method Do(). It actually gets the position number from other component "_calComponent.GetPosition()" and compares the value with the pf control positions (PfControlPositions).
As you can see there are many if conditions that I had to use here.
Can I somehow eliminate these many if statements and write it in some better way. I am not able to write the switch case also because the position value comes dynamically and hence switch case throws compile time error. I have a constraint that I can only modify DoSomething class.
Can you please suggest?
public interface ICalComponent
{
int GetPosition();
}
public class DoSomething
{
private readonly ICalComponent _calComponent;
public DoSomething(ICalComponent calComponent)
{
_calComponent = calComponent;
}
public void Do()
{
var functionality = new Dictionary<ControlAction, ControlFunctionality>();
int number = _calComponent.GetPosition();
if (number == PfControlPositions.pf1PositionOff)
{
functionality[ControlAction.Medium] = ControlFunctionality.DoAction1;
}
if (number == PfControlPositions.pf1PositionOn)
{
functionality[ControlAction.Medium] = ControlFunctionality.DoAction2;
}
if (number == PfControlPositions.pf1PositionOn)
{
functionality[ControlAction.Medium] = ControlFunctionality.DoAction3;
}
if (number == PfControlPositions.pf2PositionOff)
{
functionality[ControlAction.Medium] = ControlFunctionality.DoAction4;
}
if (number == PfControlPositions.pf1PositionOn)
{
functionality[ControlAction.Medium] = ControlFunctionality.DoAction5;
}
if (number == PfControlPositions.pf1PositionOff)
{
functionality[ControlAction.Medium] = ControlFunctionality.DoAction6;
}
if (number == PfControlPositions.pf2PositionOn)
{
functionality[ControlAction.Medium] = ControlFunctionality.DoAction7;
}
if (number == PfControlPositions.pf2PositionOff)
{
functionality[ControlAction.Medium] = ControlFunctionality.DoAction8;
}
if (number == PfControlPositions.pf3PositionOn)
{
functionality[ControlAction.Medium] = ControlFunctionality.DoAction9;
}
if (number == PfControlPositions.pf3PositionOff)
{
functionality[ControlAction.Medium] = ControlFunctionality.DoAction10;
}
}
}
public class PfControlPositions
{
public static ControlPosition pf1PositionOff = new ControlPosition(0);
public static ControlPosition pf1PositionOn = new ControlPosition(1);
public static ControlPosition pf2PositionOn = new ControlPosition(2);
public static ControlPosition pf2PositionOff = new ControlPosition(3);
public static ControlPosition pf3PositionOn = new ControlPosition(4);
public static ControlPosition pf3PositionOff = new ControlPosition(5);
public static ControlPosition pf4PositionOn = new ControlPosition(6);
public static ControlPosition pf4PositionOff = new ControlPosition(7);
public static ControlPosition pf5PositionOn = new ControlPosition(8);
public static ControlPosition pf5PositionOff = new ControlPosition(9);
}
public class ControlPosition
{
private readonly UInt32 _physicalPosition;
public ControlPosition(UInt32 physicalStepPosition)
{
_physicalPosition = physicalStepPosition;
}
public static implicit operator int(ControlPosition position)
{
return (int)position._physicalPosition;
}
}
public enum ControlFunctionality
{
DoAction1,
DoAction2,
DoAction3,
DoAction4,
DoAction5,
DoAction6,
DoAction7,
DoAction8,
DoAction9,
DoAction10,
}
public enum ControlAction
{
Dial = 0,
Short = 1,
Medium = 2
}
Thank a lot
I think dictionary should work here. But unfortunately it did not worked. Can someone suggest if dictionary can work here or where I am doing mistake?
Dictionary<ControlPosition, ControlFunctionality> functions = new Dictionary<ControlPosition, ControlFunctionality>(){
{PfControlPositions.pf1PositionOff, ControlFunctionality.DoAction1},
{PfControlPositions.pf1PositionOn, ControlFunctionality.DoAction2}
};
var functionality = new Dictionary<ControlAction, ControlFunctionality>();int number = _calComponent.GetPosition();
functionality[ControlAction.Medium] = functions[number];It fails here
functionality[ControlAction.Medium] = functions[number];
Error: The argument type "int" is not assignable to parameter type "ControlPosition".Ideally when I see the code, it should work because "_calComponent.GetPosition()" returns an int and
"PfControlPositions.pf1PositionOff" is also int.Do you have any idea why it fails?
这篇关于了解现有代码段并消除if语句的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!