了解现有代码段并消除if语句 [英] Understanding existing code snippet and eleminating if statements

查看:53
本文介绍了了解现有代码段并消除if语句的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对以下代码有两个疑问.该代码的一部分是我们其中一个应用程序的生产代码,很早以前就写过了.

第一季度.

我不明白类"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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆