目前正在为万用表制作库,此时我发现我正在重复自己。我问,如何连接这两个功能。这只是一个开始,我将更多地拥有类似的功能,我需要的只是某种示例,或修复这个特定的代码,然后我能够自己解决其他问题。
@objc var content = ""
答案 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;
}
更好的方法是拥有两个独立的值,一个用于存储度量类型(volt
或current
),另一个用于存储类型({{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语句来表示当前方法之间不同的东西