代码之家  ›  专栏  ›  技术社区  ›  Manish Basantani

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

  •  1
  • Manish Basantani  · 技术社区  · 14 年前

    鉴于:

    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;
            }
    

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

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

    谢谢你的关心。

    4 回复  |  直到 14 年前
        1
  •  1
  •   MrDosu    14 年前

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

            private void UpdataFieldItems(List<FieldItemBase> existingFieldItems, List<FieldItemBase> selectedFieldItems)
            {
                List<FieldItemBase> newFieldItemsSelected;
                var fieldSelectionChanges = GetFieldSelectionChanges(out newFieldItemsSelected);//retuns a Flagged enum
    
                if (IsValidChange(fieldSelectionChanges))
                {
                    List<FieldItemBase> targetfields = null;
                    if (IsInEditMode(fieldSelectionChanges))
                        StartEditMode();
    
                    if (IsItemAdded(fieldSelectionChanges))
                    {
                        SetColumnDescriptorsToAdd(newFieldItemsSelected);
                        targetFields = selectedFieldItems;
                    }
                    else
                        targetFields = existingFieldItems;
    
                    UpdateItems(targetFields);
                    SetColumnsToShow();
    
                    if (IsItemAdded(fieldSelectionChanges))
                        CustomizeAlignmentAndCellFormatters(_tfaTableGrid.TableGrid);
    
                    if (IsInEditMode(fieldSelectionChanges))
                    {
                        if (_tfaTableGrid.TableGrid.ColumnDescriptors.Count() > 0)
                            SetAdditionalFirstGroupedColumn();
                        StopEditMode();
                    }
                }
    
                Invalidate();
            }
    
            private bool InEditMode(FlaggedEnum fieldSelectionChanges)
            {
                return Coding.EnumHas(fieldSelectionChanges, FieldSelectionChanges.Summary) || Coding.EnumHas(fieldSelectionChanges, FieldSelectionChanges.AddedFieldItem);
            }
    
            private bool IsItemAdded(FlaggedEnum fieldSelectionChanges)
            {
                Coding.EnumHas(Coding.EnumHas(fieldSelectionChanges, FieldSelectionChanges.AddedFieldItem);
            }
    
            private bool IsValidChange(FlaggedEnum fieldSelectionChanges)
            {
                return Coding.EnumHas(fieldSelectionChanges, FieldSelectionChanges.Order) ||
                       Coding.EnumHas(fieldSelectionChanges, FieldSelectionChanges.AddedCustomFieldItem) ||
                       Coding.EnumHas(fieldSelectionChanges, FieldSelectionChanges.RemovedItem) ||
                       Coding.EnumHas(fieldSelectionChanges, FieldSelectionChanges.Summary) ||
                       Coding.EnumHas(fieldSelectionChanges, FieldSelectionChanges.AddedFieldItem);
            }
    
            //Coding.cs
            public static bool EnumHas(FieldSelectionChanges selectionChanges, FieldSelectionChanges valueToCheck)
            {
                return (selectionChanges & valueToCheck) == valueToCheck;
            }
    
        2
  •  2
  •   gandjustas    14 年前
    1. 对每个if语句的主体使用extract方法
    2. Create Dictionary>为fieldSelectionChanges选择适当的操作。这就是战略模式
        3
  •  1
  •   RPM1984    14 年前

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

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

            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();
    

    显然,为变量选择更好的名称。

        4
  •  0
  •   Peter Lillevold Rene    14 年前

    我建议将这三个块提取为单独的、命名良好的方法。如果 UpdateFieldItems