重构If else树

Bob*_*tor 6 .net c# refactoring

我有一个if else树将会增长,因为我添加额外的项目来维护它,我正在寻找最好的方法来编写它的可维护性我从这个代码开始

private void ControlSelect()
{

    if (PostingType == PostingTypes.Loads && !IsMultiPost)
    {
        singleLoadControl.Visible = true;
          singleTruckControl.Visible = false;
          multiTruckControl.Visible = false;
          multiLoadControl.Visible = false;
    }
    else if (PostingType == PostingTypes.Trucks && !IsMultiPost)
    {
        singleLoadControl.Visible = false;
          singleTruckControl.Visible = true;
          multiTruckControl.Visible = false;
          multiLoadControl.Visible = false;
    }
    else if (PostingType == PostingTypes.Loads && IsMultiPost)
    {
        singleLoadControl.Visible = false;
          singleTruckControl.Visible = false;
          multiTruckControl.Visible = false;
          multiLoadControl.Visible = true;
    }
    else if (PostingType == PostingTypes.Trucks && IsMultiPost)
    {
        singleLoadControl.Visible = false;
        singleTruckControl.Visible = false;
          multiTruckControl.Visible = true;
        multiLoadControl.Visible = false;
    }
}
Run Code Online (Sandbox Code Playgroud)

并考虑将其重新分解为类似的东西

private void ControlSelect()
{
    List<UserControl> controlList = GetControlList();

      string visableControl = singleLoadControl.ID;
      if (PostingType == PostingTypes.Loads && !IsMultiPost)
      {
        visableControl = singleLoadControl.ID;
      }
      else if (PostingType == PostingTypes.Trucks && !IsMultiPost)
      {
        visableControl = singleTruckControl.ID;
      }
      else if (PostingType == PostingTypes.Loads && IsMultiPost)
      {
        visableControl = multiLoadControl.ID;
      }
      else if (PostingType == PostingTypes.Trucks && IsMultiPost)
      {
        visableControl = multiTruckControl.ID;
      }

      foreach (UserControl userControl in controlList)
      {
        userControl.Visible = (userControl.ID == visableControl);
      }
}

private List<UserControl> GetControlList()
{
    List<UserControl> controlList = new List<UserControl>
      {
        singleLoadControl,
            multiTruckControl,
            singleTruckControl,
            multiLoadControl
      };
      return controlList;
}
Run Code Online (Sandbox Code Playgroud)

我的表现很受欢迎,但我可以管理我的所有控件都是一个地方

我的另一个想法是让每个选定的控制块都有自己的方法,就像这样

private void SetSingleLoadControlAsSelected()
{
      singleLoadControl.Visible = true;
      singleTruckControl.Visible = false;
      multiTruckControl.Visible = false;
      multiLoadControl.Visible = false;
}
Run Code Online (Sandbox Code Playgroud)

我没有受到性能影响,但我在多个位置维护控件

我只是因为我喜欢它的可维护性方面而倾向于选择一个.

Cha*_*ana 23

关于什么

singleLoadControl.Visible  = 
      PostingType == PostingTypes.Loads  && !IsMultiPost;      
singleTruckControl.Visible = 
      PostingType == PostingTypes.Trucks && !IsMultiPost;      
multiTruckControl.Visible  = 
      PostingType == PostingTypes.Loads  && IsMultiPost;      
multiLoadControl.Visible   =  
      PostingType == PostingTypes.Trucks && IsMultiPost;
Run Code Online (Sandbox Code Playgroud)

如果您希望能够使多个控件可见(或添加更多枚举值),请使用[Flags]属性修饰枚举,如下所示:

[Flags]   
public enum PostTyp { None=0, IsMultiPost = 1, Loads = 2, Trucks = 4 }
Run Code Online (Sandbox Code Playgroud)

并修改代码如下:

singleLoadControl.Visible  = 
      ((PostingType &  (PostTyp.Loads | ~PostTyp.MultiCast)) 
         == PostingType );      
singleTruckControl.Visible = 
      ((PostingType & (PostTyp.Trucks | ~PostTyp.MultiCast)) 
         == PostingType );          
multiTruckControl.Visible  = 
      ((PostingType & (PostTyp.Loads  |  PostTyp.MultiCast)) 
         == PostingType );        
multiLoadControl.Visible   =  
      ((PostingType & (PostTyp.Trucks |  PostTyp.MultiCast)) 
         == PostingType );      
Run Code Online (Sandbox Code Playgroud)

  • 这仍然有效.除了使用上述算法的值之外,所有值都将为false. (3认同)

Jef*_*tes 6

当您似乎使用枚举时,我建议使用默认情况下的开关来处理未知值.我相信这种方法使得意图比完成任务中的所有检查更清晰.

switch (PostingType)
{
case PostingTypes.Loads:
   singleLoadControl.Visible = !IsMultiPost;
   multiTruckControl.Visible = IsMultiPost;
   singleTruckControl.Visible = false;
   multiTruckLoadControl.Visible = false;
   break;

case PostingTypes.Trucks:
   singleLoadControl.Visible = false;
   multiTruckControl.Visible = false;
   singleTruckControl.Visible = !IsMultiPost;
   multiLoadControl.Visible = IsMultiPost;
   break;

default:
   throw InvalidOperationException("Unknown enumeration value.");
}
Run Code Online (Sandbox Code Playgroud)


Ser*_*gio 5

那这个呢:

     singleLoadControl.Visible = false;
     singleTruckControl.Visible = false;
     multiTruckControl.Visible = false;
     multiLoadControl.Visible = false;

    if (PostingType == PostingTypes.Loads && !IsMultiPost)
    {
            singleLoadControl.Visible = true;
    }
    else if (PostingType == PostingTypes.Trucks && !IsMultiPost)
    {
          singleTruckControl.Visible = true;
    }
    else if (PostingType == PostingTypes.Loads && IsMultiPost)
    {
        multiLoadControl.Visible = true;
    }
    else if (PostingType == PostingTypes.Trucks && IsMultiPost)
    {
          multiTruckControl.Visible = true;
}
Run Code Online (Sandbox Code Playgroud)