C# 避免代码重复#

C# 避免代码重复#,c#,repeat,C#,Repeat,目前正在制作万用表库,我发现我在重复我自己。我在问,如何连接这两个功能。这仅仅是一个开始,我将有更多类似的函数,我所需要的只是一些例子,或者修复这个特定的代码,然后我就能自己找出其他函数 public string MeasureVoltage() { string Meas = "MEAS:VOLT:"; if (vt == VoltageType.DC) { Meas += "DC?"; } else { Meas

目前正在制作万用表库,我发现我在重复我自己。我在问,如何连接这两个功能。这仅仅是一个开始,我将有更多类似的函数,我所需要的只是一些例子,或者修复这个特定的代码,然后我就能自己找出其他函数

public string MeasureVoltage()
{
    string Meas = "MEAS:VOLT:";
    if (vt == VoltageType.DC)
    {
       Meas += "DC?";
    }
    else
    {
       Meas += "AC?";
    }
    io.PrintfAndFlush(Meas + "\n");
    Console.WriteLine(Meas);
    string response;
    io.Scanf("%s", out response);
    return response;
}

public string MeasureCurrent()
{
    string Meas = "MEAS:CURR:";
    if (ct == CurrentType.DC)
    {
       Meas += "DC?";
    }
    else
    {
       Meas += "AC?";
    }
    io.PrintfAndFlush(Meas + "\n");
    Console.WriteLine(Meas);
    string response;
    io.Scanf("%s", out response);
    return response;
}

public enum VoltageType { AC, DC }
public enum CurrentType { AC, DC }

我想你可以做一个测量方法,给出一个你想要它测量的参数,然后用一个switch语句来表示你当前方法之间的不同,我想你可以做一个测量方法,给出一个你想要它测量的参数,只需使用一个switch语句来处理当前方法之间不同的内容

io.PrintfAndFlush(Meas + "\n");
Console.WriteLine(Meas);
string response;
io.Scanf("%s", out response);
return response;
在其自己的方法中,并从以下两个方面调用:

public string MeasureVoltage()
{
    string Meas = "MEAS:VOLT:";
    if (vt == VoltageType.DC)
    {
        Meas += "DC?";
    }
    else
    {
        Meas += "AC?";
    }
    return PerformMeasurement(Meas);
}

public string MeasureCurrent()
{
    string Meas = "MEAS:CURR:";
    if (ct == CurrentType.DC)
    {
        Meas += "DC?";
    }
    else
    {
        Meas += "AC?";
    }
    return PerformMeasurement(Meas);
}

private string PerformMeasurement(string Meas)
{
    io.PrintfAndFlush(Meas + "\n");
    Console.WriteLine(Meas);
    string response;
    io.Scanf("%s", out response);
    return response;
}
如果希望
MeasureVoltage
/
MeasureCurrent
显示得更短,请内联创建
Meas

public string MeasureVoltage() => PerformMeasurement( $"MEAS:VOLT:{vt}?" );
编辑:如果可以选择
枚举
值名称以匹配所需字符串,则可以完全删除

io.PrintfAndFlush(Meas + "\n");
Console.WriteLine(Meas);
string response;
io.Scanf("%s", out response);
return response;
在其自己的方法中,并从以下两个方面调用:

public string MeasureVoltage()
{
    string Meas = "MEAS:VOLT:";
    if (vt == VoltageType.DC)
    {
        Meas += "DC?";
    }
    else
    {
        Meas += "AC?";
    }
    return PerformMeasurement(Meas);
}

public string MeasureCurrent()
{
    string Meas = "MEAS:CURR:";
    if (ct == CurrentType.DC)
    {
        Meas += "DC?";
    }
    else
    {
        Meas += "AC?";
    }
    return PerformMeasurement(Meas);
}

private string PerformMeasurement(string Meas)
{
    io.PrintfAndFlush(Meas + "\n");
    Console.WriteLine(Meas);
    string response;
    io.Scanf("%s", out response);
    return response;
}
如果希望
MeasureVoltage
/
MeasureCurrent
显示得更短,请内联创建
Meas

public string MeasureVoltage() => PerformMeasurement( $"MEAS:VOLT:{vt}?" );

编辑:如果可以选择
枚举
值名称以匹配所需字符串,则可以完全删除

只需将第一行替换为以下内容:

public string MeasureVoltage()
{
     string Meas = "MEAS:VOLT:" + (vt == VoltageType.DC ? "DC?" : "AC?");
     return Measure(meas);
}

public string MeasureCurrent()
{
    string Meas = "MEAS:CURR:" + (ct == CurrentType.DC ? "DC?" : "AC?");
    return Measure(meas);
}
现在,将两种方法之间的共同点提取到以下内容中:

private string Measure(string measure)
{
    io.PrintfAndFlush(Meas + "\n");
    Console.WriteLine(Meas);
    string response;
    io.Scanf("%s", out response);
    return response;
}
更好的方法是有两个独立的值,一个存储测量类型(
volt
current
),另一个存储测量类型(
DC
AC
):

现在您甚至不需要两种方法,只需要以下方法:

public string Measure()
{
    var measure = "MEAS:" + this.Type + ":" + this.OtherType + "?\n";
    io.PrintfAndFlush(measure );
    Console.WriteLine(measure );
    string response;
    io.Scanf("%s", out response);
    return response;
}
现在简单地称之为:

var m = new MyType("VOLT", "AC");
var result = m.Measure();

哪一行将打印“MEAS:VOLT:AC?”

只需将第一行替换为以下内容:

public string MeasureVoltage()
{
     string Meas = "MEAS:VOLT:" + (vt == VoltageType.DC ? "DC?" : "AC?");
     return Measure(meas);
}

public string MeasureCurrent()
{
    string Meas = "MEAS:CURR:" + (ct == CurrentType.DC ? "DC?" : "AC?");
    return Measure(meas);
}
现在,将两种方法之间的共同点提取到以下内容中:

private string Measure(string measure)
{
    io.PrintfAndFlush(Meas + "\n");
    Console.WriteLine(Meas);
    string response;
    io.Scanf("%s", out response);
    return response;
}
更好的方法是有两个独立的值,一个存储测量类型(
volt
current
),另一个存储测量类型(
DC
AC
):

现在您甚至不需要两种方法,只需要以下方法:

public string Measure()
{
    var measure = "MEAS:" + this.Type + ":" + this.OtherType + "?\n";
    io.PrintfAndFlush(measure );
    Console.WriteLine(measure );
    string response;
    io.Scanf("%s", out response);
    return response;
}
现在简单地称之为:

var m = new MyType("VOLT", "AC");
var result = m.Measure();

哪个将打印
“MEAS:VOLT:AC?”

我想这是我能用你提供的代码做的最好的了:

public enum VoltageType { AC, DC}
public enum CurrentType { AC, DC}

public string MeasureVoltage()
{
    return Measure(MeasureType.Voltage);
}
public string MeasureCurrent()
{
    return Measure(MeasureType.Current);
}

private enum MeasureType {Voltage, Current}

private string Measure(MeasureType mt)
{
    var what = (mt == Voltage) ? "VOLT" : "CURR";
    var type = ((mt == MeasureType.Voltage && vt == VoltageType.AC) || 
                (mt == MeasureType.Current && ct == CurrentType.AC)) ? "AC" : "DC";

    // c# 6 or higher:
    var Meas = $"MEAS:{what}:{type}?";
    // for older versions of c#, use string.Format:
    // var Meas = string.Format("MEAS:{0}:{1}?", what, type);
    io.PrintfAndFlush(Meas + "\n");
    Console.WriteLine(Meas);
    string response;
    io.Scanf("%s", out response);
    return response;
}

我认为这是使用您提供的代码所能做到的最好的:

public enum VoltageType { AC, DC}
public enum CurrentType { AC, DC}

public string MeasureVoltage()
{
    return Measure(MeasureType.Voltage);
}
public string MeasureCurrent()
{
    return Measure(MeasureType.Current);
}

private enum MeasureType {Voltage, Current}

private string Measure(MeasureType mt)
{
    var what = (mt == Voltage) ? "VOLT" : "CURR";
    var type = ((mt == MeasureType.Voltage && vt == VoltageType.AC) || 
                (mt == MeasureType.Current && ct == CurrentType.AC)) ? "AC" : "DC";

    // c# 6 or higher:
    var Meas = $"MEAS:{what}:{type}?";
    // for older versions of c#, use string.Format:
    // var Meas = string.Format("MEAS:{0}:{1}?", what, type);
    io.PrintfAndFlush(Meas + "\n");
    Console.WriteLine(Meas);
    string response;
    io.Scanf("%s", out response);
    return response;
}
很简单,是吗?:)

$”
语法就是所谓的语法,它在C#6.0中可用。如果您正在编制早期版本,可以将其替换为
string.Format()
,如下所示:

DoMeasurement(stringFormat("MEAS:VOLT:{0}?", vt.ToString()));
很简单,是吗?:)

$”
语法就是所谓的语法,它在C#6.0中可用。如果您正在编制早期版本,可以将其替换为
string.Format()
,如下所示:

DoMeasurement(stringFormat("MEAS:VOLT:{0}?", vt.ToString()));

在这种情况下,你应该问自己的第一个问题是“这真的是一样的吗?”

如果是的话,那么你是对的,这可能是重复,应该避免。注:我说过“可能”-这不是一条硬性规定,有时可能需要复制,甚至是好的,例如,如果它增加了清晰度

如果不是,那么避免看似重复的代码实际上可能是一件坏事。这不仅会使你的代码更加混乱,而且会完全忽略要点——例如,如果你有一个狗对象和一个桌子对象,并且决定因为它们都有4条腿,所以它们是相同的东西,你可能会面对试图把咖啡放在现场的人——我敢肯定他会反对!请注意对相同方法的一些调用,特别是如果它们是实用方法,如
WriteLine
,则不视为重复

在你的例子中,我认为你的行为有两个方面——决定采取哪种措施,然后采取措施

看看你的代码,你的“测量”是一样的;一个好的第一步可能是把它拉出来,变成这样的“度量”方法

public string MeasureVoltage()
{
    string Meas = "MEAS:VOLT:";
    if (vt == VoltageType.DC)
    {
       Meas += "DC?";
    }
    else
    {
       Meas += "AC?";
    }
    return Measure(Meas);
}

public string MeasureCurrent()
{
    string Meas = "MEAS:CURR:";
    if (ct == CurrentType.DC)
    {
       Meas += "DC?";
    }
    else
    {
       Meas += "AC?";
    }
    return Measure(Meas);
}

public string Measure(string Meas)
{
    io.PrintfAndFlush(Meas + "\n");
    Console.WriteLine(Meas);
    string response;
    io.Scanf("%s", out response);
    return response;
}
public enum PowerType { AC, DC }

public string Measure(string measurementType, PowerType pt)
{
    string powerString = pt == PowerType.AC ? "AC" : "DC";
    string measurement = measurementType + powerString;

    io.PrintfAndFlush(measurement + "\n");
    Console.WriteLine(measurement);
    string response;
    io.Scanf("%s", out response);
    return response;
}
注意,我保留了您的代码格式,以说明这是一个简单的“将
Measure
中的所有内容复制到一个单独的方法中,并用调用
Measure(Meas)
替换它”

更进一步,您的电压和电流枚举是相同的-从代码的角度来看,这没有什么意义,而且,不管怎样,这不像是直流电流得到交流电压。考虑到这一点,您可以删除重复项-让我们将替换项称为“电源类型”“鉴于它涵盖了这两个方面。此外,您可以确定此电源类型和测量类型都是测量方法的参数,并执行类似操作

public string MeasureVoltage()
{
    string Meas = "MEAS:VOLT:";
    if (vt == VoltageType.DC)
    {
       Meas += "DC?";
    }
    else
    {
       Meas += "AC?";
    }
    return Measure(Meas);
}

public string MeasureCurrent()
{
    string Meas = "MEAS:CURR:";
    if (ct == CurrentType.DC)
    {
       Meas += "DC?";
    }
    else
    {
       Meas += "AC?";
    }
    return Measure(Meas);
}

public string Measure(string Meas)
{
    io.PrintfAndFlush(Meas + "\n");
    Console.WriteLine(Meas);
    string response;
    io.Scanf("%s", out response);
    return response;
}
public enum PowerType { AC, DC }

public string Measure(string measurementType, PowerType pt)
{
    string powerString = pt == PowerType.AC ? "AC" : "DC";
    string measurement = measurementType + powerString;

    io.PrintfAndFlush(measurement + "\n");
    Console.WriteLine(measurement);
    string response;
    io.Scanf("%s", out response);
    return response;
}

在这种情况下,你应该问自己的第一个问题是“这真的是一样的吗?”

如果是的话,那么你是对的,这可能是重复,应该避免。注:我说过“可能”-这不是一条硬性规定,有时可能需要复制,甚至是好的,例如,如果它增加了清晰度

如果不是,那么避免看似重复的代码实际上可能是一件坏事。这不仅会使你的代码更加混乱,而且会完全忽略要点——例如,如果你有一个狗对象和一个桌子对象,并且决定因为它们都有4条腿,所以它们是相同的东西,你可能会面对试图把咖啡放在现场的人——我敢肯定他会反对!请注意对相同方法的一些调用,特别是如果它们是实用方法,如
WriteLine
,则不视为重复

在你的例子中,我认为你的行为有两个方面——决定采取哪种措施,然后采取措施

看看你的代码,你的“测量”是一样的;一个好的第一步可能是把它拉出来,变成这样的“度量”方法

public string MeasureVoltage()
{
    string Meas = "MEAS:VOLT:";
    if (vt == VoltageType.DC)
    {
       Meas += "DC?";
    }
    else
    {
       Meas += "AC?";
    }
    return Measure(Meas);
}

public string MeasureCurrent()
{
    string Meas = "MEAS:CURR:";
    if (ct == CurrentType.DC)
    {
       Meas += "DC?";
    }
    else
    {
       Meas += "AC?";
    }
    return Measure(Meas);
}

public string Measure(string Meas)
{
    io.PrintfAndFlush(Meas + "\n");
    Console.WriteLine(Meas);
    string response;
    io.Scanf("%s", out response);
    return response;
}
public enum PowerType { AC, DC }

public string Measure(string measurementType, PowerType pt)
{
    string powerString = pt == PowerType.AC ? "AC" : "DC";
    string measurement = measurementType + powerString;

    io.PrintfAndFlush(measurement + "\n");
    Console.WriteLine(measurement);
    string response;
    io.Scanf("%s", out response);
    return response;
}
注意,我保留了您的代码格式,以说明它是一个简单的“cop”