这个问题是两代人的。但我会回答这个问题,因为这个问题曾经也困扰着我。
这是您正在查看的内容:语法 A和语法 B。
你应该看什么:整个代码中的语法一致性。
选择一种风格并坚持下去。这可以由个人选择、团队选择、老板选择等决定。在遇到瓶颈之前担心性能是本末倒置。
作为代码和复杂性积累的一般后果,如果您面临 switch 语句,那么有人在某处编写了错误的代码并试图在一个代码的一个毛线球中处理很多事情。
恰当的例子:一个返回 JSON 的 API 调用,它在一个数组中发回 5 个不同的值,您需要弄清楚如何处理它或根据需要选择哪些数据。
大多数时候,只要有多个返回或 if 的可能性,您就应该将代码分成小块。
以 Jon Skeet 的代码为例:
public int DoSomething(string input1, string input2)
{
int ret;
// First simple case
if (input1 == null || input2 == null)
{
ret = -1;
}
else
{
// Second simple case
int totalLength = input1.Length + input2.Length;
if (totalLength < 10)
{
ret = totalLength;
}
else
{
// Imagine lots of lines here, using input1, input2 and totalLength
// ...
ret = someComplicatedResult;
}
}
return ret;
}
让我们先看看能否让代码更具可读性。
private int someComplicatedTask(string input1, string input2){
// Second simple case
int ret = 0;
int totalLength = input1.Length + input2.Length;
if (totalLength < 10)
{
ret = totalLength;
}
else
{
// Imagine lots of lines here, using input1, input2 and totalLength
// ...
ret = someComplicatedResult;
}
return ret;
}
public int DoSomething(string input1, string input2)
{
return input1 == null || input2 == null ? -1 : someComplecatedTask(...);
}
这应该让您想知道,“当输入可能为空时,您为什么要调用 DoSomething?”。
请注意问题尚未解决。我所做的只是让代码看起来更好。
以下是我在 if 条件下的处理方式:
空输入的条件将移出到清理功能。或者只有当输入不为空时才会调用。
...
if(input1 != null && input2 != null){
output = DoSomething(input1, input2);
}
...
public int DoSomething(string input1, string input2)
{
int len = input1.Length + input2.Length;
return len < 10 ? len : someComplecatedTask(input1, input2);
}
private int someComplicatedTask(string input1, string input2){
// Imagine lots of lines here, using input1, input2
// ...
return someComplicatedResult;
}
因此,代码现在看起来更易于管理。代码只有两条路可以走,一切都很好。
现在让我们看看您的第一个代码片段。
public double xMax {
get {
double val = 0.00f;
switch(x_option) {
case 0:
val = priMax;
break;
case 1:
val = rfMax;
break;
case 2:
val = pwMax;
break;
}
return val;
}
}
在我看来,这很糟糕,原因有两个:
1. 将来某个时候,x_option 会获得另一个值,您将在每次 get {} 下寻找适当的更改。
2. 获取 {} 应该是直截了当的。Set {} 应包含设置适当值的条件。
所以代码应该看起来像这样:
public double xMax {
set {
double val = 0.00f;
switch(value) {
case 0:
val = priMax;
break;
case 1:
val = rfMax;
break;
case 2:
val = pwMax;
break;
}
xmax = value * val; // say // This makes break better in switch.
}
get { return xmax; }
}
因为,在你的情况下,你可以做更多的(所有情况下通用的)操作,那么这比返回要好。这个例子相对于 get one 更好,因为在设置时你不知道值,所以你需要一个决策树。
但是在获取时,您的对象确切地知道它包含什么,并兴高采烈地返回所询问的内容。
现在,您的第二个代码示例根本没有意义。决定返回什么不是对象的职责。它应该返回它所拥有的东西。
在设置时,无论如何你都不应该强行返回。
我希望这能消除一些疑虑并提出更多问题,因为还有很多东西要学。