避免代码重复c#

时间:2017-09-29 06:47:19

标签: c# repeat

目前正在为万用表制作库,此时我发现我正在重复自己。我问,如何连接这两个功能。这只是一个开始,我将更多地拥有类似的功能,我需要的只是某种示例,或修复这个特定的代码,然后我能够自己解决其他问题。

@objc var content = ""

6 个答案:

答案 0 :(得分:2)

我认为这是我对您提供的代码所能做的最好的事情:

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

答案 1 :(得分:1)

只需将第一行替换为:

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

更好的方法是拥有两个独立的值,一个用于存储度量类型(voltcurrent),另一个用于存储类型({{1} }或DC):

AC

现在你甚至不需要两种方法,只需要这样:

class MyType
{
    private string Type; // either CURR or VOLT
    private string otherType;  // either DC or AC

    public MyType(string type, otherType)
    { /* fill the members */ }
}

现在简单地称之为:

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

答案 2 :(得分:1)

在这些情况下你应该问自己的第一个问题是"它真的一样吗?"。

如果是,那么你是对的,它可能是一个重复,可能应该避免。注意我已经说过"可能" - 这不是一个严格的规则,有时可能需要复制,甚至是好的,例如如果它增加了清晰度。

如果不是,那么避免看似重复的代码实际上可能是一件坏事。它不仅会使您的代码更加混乱,而且可能完全忽略了这一点 - 例如如果你有一个狗对象和一个桌子对象,并决定,因为他们都有4条腿,他们可能会面对人们试图将他们的咖啡放在现场 - 我相当肯定他&他#39; d对象!请注意对相同方法的一些调用,特别是如果他们的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;
}

注意我保留了您的代码格式,以说明它很简单"将Measure中的所有内容复制到一个单独的方法中,并将其替换为Measure(Meas)的调用

更进一步;您的电压和电流枚举是相同的 - 从代码的角度来看,这一点没有什么意义,无论如何,它不像您获得直流电流的交流电压。考虑到这一点,你可以删除重复 - 让我们调用替换" PowerType"鉴于它涵盖了两者。此外,您可以确定此功率类型和测量类型都是您的测量方法的参数,并执行类似这样的操作

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

答案 3 :(得分:0)

我会把

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}?" );

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

答案 4 :(得分:0)

public string MeasureVoltage()
{
    return DoMeasurement($"MEAS:VOLT:{vt.ToString()}?");
}

public string MeasureCurrent()
{
    return DoMeasurement($"MEAS:CURR:{ct.ToString()}?");
}

private string DoMeasurement(string Meas)
{
    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 }

很简单,是吧? :)

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

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

答案 5 :(得分:-1)

我想你可以制作一个Measure方法,并给出你想要测量的参数,并且只使用switch语句来表示当前方法之间不同的东西