代码重构 C#

本文关键字:重构 代码 | 更新日期: 2023-09-27 18:36:25

我正在开发一个小应用程序来掌握 C#,我已经编写了一个小应用程序,它当前将项目的值相加(当前预定义) 这是我到目前为止所拥有的:

//Defining classes
 public class Item1{
  public string Type{get{return "Item1";}}
 }
 public class Item2{
  public string Type{get{return "Item2";}}
 }
//Methods
public void CalcItems(Item1 item1, int val){
 this.Log(item1.Type + "Val:" + val);
 this.total += val;
}
public void CalcItems(Item2 item2, int val){
 this.Log(item2.Type + "Val:" + val);
 this.total += val;
}
//Calling these methods
Items.CalcItems(new Item1(), 30);
Items.CalcItems(new Item2(), 12);

如何通过一种计算方法传递第 1 项和第 2 项?

代码重构 C#

使用Interface

public interface IItem
{
    string Type { get; }
}

然后在类声明上实现接口:

public class Item1 : IItem
{
    ...
    public string Type { get; }
    ...
}
public class Item2 : IItem
{
    ...
    public string Type { get; }
    ...
}

现在我们可以将方法CalcItems()定义为接受IItem参数:

public void CalcItems(IItem item, int val)
{
    this.Log(item1.Type + "Val:" + val);
    this.total += val;
}

这样,以下内容现在将引用相同的方法:

Items.CalcItems(new Item1(), 30);
Items.CalcItems(new Item2(), 12);

向项目添加一个 IItem 接口,并将 Calcitems 中的 Item1 替换为 iitem。那么你不需要两个计算项目

您可以为Item1Item2定义一个接口,因为它们都共享公共属性Type

MSDN:接口(C# 编程指南)

public interface IMyItem
{
    string Type;
}
public class Item1 : IMyItem
{
    public string Type{get{return "Item1";}}
}
public class Item2: IMyItem
{
    public string Type{get{return "Item2";}}
}
public void CalcItems(IMyItem item, int val){
    this.Log(item.Type + "Val:" + val);
    this.total += val;
}
Items.CalcItems(new Item1(), 30);
Items.CalcItems(new Item2(), 12);
你可以

使用泛型。为 Item 对象定义一个接口,并声明该方法,如下所示:

 void CalcItems<T>(T item, int val) where T : IItem

您可以使用策略设计模式进行重构。声明一个接口并将该接口实现到 Item1 和 Item2 类。使用该接口执行计算操作。

public interface IItem {
    string Type { get; }
}
public class Item1: IItem {
    public string Type{get{return "Item1";}}
}
public class Item2: IItem {
    public string Type{get{return "Item2";}}
}
public void CalcItems(IItem item, int val){
    this.Log(item.Type + "Val:" + val);
    this.total += val;
}
Items.CalcItems(new Item1(), 30);
Items.CalcItems(new Item2(), 12);