Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重构我的C代码:if-else语句和代码重复_C#_Design Patterns_Refactoring - Fatal编程技术网

C# 重构我的C代码:if-else语句和代码重复

C# 重构我的C代码:if-else语句和代码重复,c#,design-patterns,refactoring,C#,Design Patterns,Refactoring,鉴于: private void updateAfieldItems(列出现有字段项,列出selectedFieldItems) { 列出所选的新字段项; var fieldSelectionChanges=GetFieldSelectionChanges(out newFieldItemsSelected);//重新运行标记的枚举 if(Coding.EnumHas(fieldSelectionChanges,fieldSelectionChanges.AddedFieldItem)) { S

鉴于:

private void updateAfieldItems(列出现有字段项,列出selectedFieldItems)
{
列出所选的新字段项;
var fieldSelectionChanges=GetFieldSelectionChanges(out newFieldItemsSelected);//重新运行标记的枚举
if(Coding.EnumHas(fieldSelectionChanges,fieldSelectionChanges.AddedFieldItem))
{
StartEditMode();
SetColumnDescriptorsToAdd(已选择新字段项);
更新项(选定字段项);
SetColumnsToShow();
自定义Signement和CellFormatters(\u tDatableGrid.TableGrid);
if(\u tDatableGrid.TableGrid.ColumnDescriptors.Count()>0)
{
SetAdditionalFirstGroupedColumn();
}
StopEditMode();
}
else if(Coding.EnumHas(fieldSelectionChanges,fieldSelectionChanges.Summary))
{
StartEditMode();
更新项目(现场项目);
SetColumnsToShow();
if(\u tDatableGrid.TableGrid.ColumnDescriptors.Count()>0)
{
SetAdditionalFirstGroupedColumn();
}
StopEditMode();
}
else if(Coding.EnumHas(fieldSelectionChanges,fieldSelectionChanges.Order)||
编码.EnumHas(fieldSelectionChanges,fieldSelectionChanges.AddedCustomFieldItem)||
编码.EnumHas(fieldSelectionChanges,fieldSelectionChanges.RemovedItem))
{
更新项目(现场项目);
SetColumnsToShow();
}
使无效();
}
//编码.cs
公共静态布尔枚举(FieldSelectionChanges selectionChanges,FieldSelectionChanges valueToCheck)
{
返回(selectionChanges&valueToCheck)=valueToCheck;
}
我愿意重构上述代码。 对于上面的代码,有两件事我不喜欢:

1) 在不同的情况下编写相同的方法调用,不可能从这些情况中提取公共方法调用

2) 这段代码的可读性很差。如果以后需要,理解和调试将非常混乱

有人能为这段代码推荐一种设计模式吗?或者是改善上述两个问题的方法


感谢您的关注。

我建议将这三个块提取为单独的、命名良好的方法。如果使用
UpdateFieldItems
方法,这将提高可读性。由于这三个区块完全不同,我无法进一步整合它们。

我建议将这三个区块提取为单独的、命名良好的方法。如果使用
UpdateFieldItems
方法,这将提高可读性。由于这三个模块完全不同,我无法进一步整合它们。

重复/有点难看的部分是IF语句

建议将这些IF条件的结果保存在布尔变量中,并利用它

这段代码不完整,但你明白了

private void UpdataFieldItems(List<FieldItemBase> existingFieldItems, List<FieldItemBase> selectedFieldItems)
    {
        List<FieldItemBase> newFieldItemsSelected;
        var fieldSelectionChanges = GetFieldSelectionChanges(out newFieldItemsSelected);//retuns a Flagged enum

        if (Coding.EnumHas(fieldSelectionChanges, FieldSelectionChanges.AddedFieldItem))
        {
            StartEditMode();
            SetColumnDescriptorsToAdd(newFieldItemsSelected);
            UpdateItems(selectedFieldItems);

            SetColumnsToShow();
            CustomizeAlignmentAndCellFormatters(_tfaTableGrid.TableGrid);

            if (_tfaTableGrid.TableGrid.ColumnDescriptors.Count() > 0)
            {
                SetAdditionalFirstGroupedColumn();
            }

            StopEditMode();
        }

        else if (Coding.EnumHas(fieldSelectionChanges, FieldSelectionChanges.Summary))
        {
            StartEditMode();

            UpdateItems(fieldItems);
            SetColumnsToShow();

            if (_tfaTableGrid.TableGrid.ColumnDescriptors.Count() > 0)
            {
                SetAdditionalFirstGroupedColumn();
            }

            StopEditMode();

        }

        else if (Coding.EnumHas(fieldSelectionChanges, FieldSelectionChanges.Order) ||
                 Coding.EnumHas(fieldSelectionChanges, FieldSelectionChanges.AddedCustomFieldItem) ||
                 Coding.EnumHas(fieldSelectionChanges, FieldSelectionChanges.RemovedItem))
        {
            UpdateItems(fieldItems);
            SetColumnsToShow();

        }
            Invalidate();
    }

//Coding.cs
public static bool EnumHas(FieldSelectionChanges selectionChanges, FieldSelectionChanges valueToCheck)
        {
            return (selectionChanges & valueToCheck) == valueToCheck;
        }
显然,为变量选择更好的名称


或者更好的方法是,将其分离成不同的方法。

重复的部分/有点难看的部分是IF语句

建议将这些IF条件的结果保存在布尔变量中,并利用它

这段代码不完整,但你明白了

private void UpdataFieldItems(List<FieldItemBase> existingFieldItems, List<FieldItemBase> selectedFieldItems)
    {
        List<FieldItemBase> newFieldItemsSelected;
        var fieldSelectionChanges = GetFieldSelectionChanges(out newFieldItemsSelected);//retuns a Flagged enum

        if (Coding.EnumHas(fieldSelectionChanges, FieldSelectionChanges.AddedFieldItem))
        {
            StartEditMode();
            SetColumnDescriptorsToAdd(newFieldItemsSelected);
            UpdateItems(selectedFieldItems);

            SetColumnsToShow();
            CustomizeAlignmentAndCellFormatters(_tfaTableGrid.TableGrid);

            if (_tfaTableGrid.TableGrid.ColumnDescriptors.Count() > 0)
            {
                SetAdditionalFirstGroupedColumn();
            }

            StopEditMode();
        }

        else if (Coding.EnumHas(fieldSelectionChanges, FieldSelectionChanges.Summary))
        {
            StartEditMode();

            UpdateItems(fieldItems);
            SetColumnsToShow();

            if (_tfaTableGrid.TableGrid.ColumnDescriptors.Count() > 0)
            {
                SetAdditionalFirstGroupedColumn();
            }

            StopEditMode();

        }

        else if (Coding.EnumHas(fieldSelectionChanges, FieldSelectionChanges.Order) ||
                 Coding.EnumHas(fieldSelectionChanges, FieldSelectionChanges.AddedCustomFieldItem) ||
                 Coding.EnumHas(fieldSelectionChanges, FieldSelectionChanges.RemovedItem))
        {
            UpdateItems(fieldItems);
            SetColumnsToShow();

        }
            Invalidate();
    }

//Coding.cs
public static bool EnumHas(FieldSelectionChanges selectionChanges, FieldSelectionChanges valueToCheck)
        {
            return (selectionChanges & valueToCheck) == valueToCheck;
        }
显然,为变量选择更好的名称

或者更好的是,将其分离成不同的方法

  • 对每个if语句的主体使用extract方法
  • 创建字典>,为fieldSelectionChanges选择适当的操作。这就是战略模式
  • 对每个if语句的主体使用extract方法
  • 创建字典>,为fieldSelectionChanges选择适当的操作。这就是战略模式

  • 我将使不同的条件在实际对应用程序的作用方面更具表现力,因为您已经为操作使用了非常描述性的方法名称。比如:

            bool scenarioOne = Coding.EnumHas(fieldSelectionChanges, FieldSelectionChanges.AddedFieldItem);
            bool scenarioTwo = Coding.EnumHas(fieldSelectionChanges, FieldSelectionChanges.Summary);
            bool scenarioThree = Coding.EnumHas(fieldSelectionChanges, FieldSelectionChanges.Order) || Coding.EnumHas(fieldSelectionChanges, FieldSelectionChanges.AddedCustomFieldItem) || Coding.EnumHas(fieldSelectionChanges,FieldSelectionChanges.RemovedItem);
    
            if (scenarioOne || scenarioTwo)
                StartEditMode();
    
            if (scenarioOne) {
                SetColumnDescriptorsToAdd(newFieldItemsSelected);
                UpdateItems(selectedFieldItems);
            }
            else if (scenarioTwo || scenarioThree) {
                UpdateItems(fieldItems);
            }
    
            if (scenarioOne || scenarioTwo || scenarioThree)
                SetColumnsToShow();
    
    private void updateAfieldItems(列出现有字段项,列出selectedFieldItems)
    {
    列出所选的新字段项;
    var fieldSelectionChanges=GetFieldSelectionChanges(out newFieldItemsSelected);//重新运行标记的枚举
    如果(IsValidChange(fieldSelectionChanges))
    {
    List targetfields=null;
    如果(IsInEditMode(fieldSelectionChanges))
    StartEditMode();
    如果(IsItemAdded(fieldSelectionChanges))
    {
    SetColumnDescriptorsToAdd(已选择新字段项);
    targetFields=所选字段项;
    }
    其他的
    targetFields=现有字段项;
    更新项(目标字段);
    SetColumnsToShow();
    如果(IsItemAdded(fieldSelectionChanges))
    自定义Signement和CellFormatters(\u tDatableGrid.TableGrid);
    如果(IsInEditMode(fieldSelectionChanges))
    {
    if(\u tDatableGrid.TableGrid.ColumnDescriptors.Count()>0)
    SetAdditionalFirstGroupedColumn();
    StopEditMode();
    }
    }
    使无效();
    }
    private bool InEdit模式(FlaggedEnum fieldSelectionChanges)
    {
    返回编码.EnumHas(fieldSelectionChanges,fieldSelectionChanges.Summary)| |编码.EnumHas(fieldSelectionChanges,fieldSelectionChanges.AddedFieldItem);
    }
    添加了专用布尔值(FlaggedEnum fieldSelectionChanges)
    {
    Coding.EnumHas(Coding.EnumHas(fieldSelectionChanges,fieldSelectionChanges.AddedFieldItem);
    }
    私有布尔值IsValidChange(FlaggedEnum fieldSelectionChanges)
    {
    返回编码.EnumHas(fieldSelectionChanges,fieldSelectionChanges.Order)||