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;
}
显然,为变量选择更好的名称
或者更好的是,将其分离成不同的方法
我将使不同的条件在实际对应用程序的作用方面更具表现力,因为您已经为操作使用了非常描述性的方法名称。比如:
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)||