所以我想知道他们使用多重三元vs切换语句的任何理由。我认为这是考虑到开发速度,并且花了所有时间以各种不同的经验登上新程序员。如果通过使用简短但难以理解的混淆代码来提高性能,或者根本不提高性能,那么这会减慢新开发的速度,这确实是一个好处。 (我使用的是一个非常简单的示例,但我认为大多数人都遇到了一段代码,这使我们挠头并停了一会儿。
一个非常简单的例子
switch ($cartItem->cart_item_type) {
case 'RA':
$wireTransferData['pending-RA'] = true;
break;
case 'FT':
$wireTransferData['pending-FT'] = true;
break;
default:// MF
$wireTransferData['pending-MF'] = true;
break;
}
VS
$wireTransferData['pending-RA'] = ('RA' == $pendingOrder->items ? true : false);
$wireTransferData['pending-FT'] = ('FT' == $pendingOrder->items ? true : false);
$wireTransferData['pending-MF'] = ('MF' == $pendingOrder->items ? true : false);
我认为,即使该开关占用更多行,也比三元选项更清晰,更容易理解。 (同样,这是一个非常基本的示例)。只是想知道其他人对此主题的想法。
答案 0 :(得分:1)
这两个版本不相等,至少在提供的代码中不相同。
使用该开关,其他2个键(不是值)可能未定义。即使使用已知值$pendingOrder->items
。在三元组中,它们都默认为false。
该开关将处理三元态$pendingOrder->items
的未知值。对于开关和未知值,此$wireTransferData['pending-MF']
为true
,三进制为false
....
$cartItem->cart_item_type = 'foo';
switch ($cartItem->cart_item_type) {
case 'RA':
$wireTransferData['pending-RA'] = true;
break;
case 'FT':
$wireTransferData['pending-FT'] = true;
break;
default:// MF
$wireTransferData['pending-MF'] = true;
break;
}
// - $wireTransferData['pending-MF'] = true;
// - $wireTransferData['pending-RA'] is undefined;
// - $wireTransferData['pending-FT'] is undefined;
$cartItem->cart_item_type = 'foo';
$wireTransferData['pending-RA'] = ('RA' == $pendingOrder->items ? true : false);
$wireTransferData['pending-FT'] = ('FT' == $pendingOrder->items ? true : false);
$wireTransferData['pending-MF'] = ('MF' == $pendingOrder->items ? true : false);
// - $wireTransferData['pending-MF'] = false;
// - $wireTransferData['pending-RA'] = false;
// - $wireTransferData['pending-FT'] = false;
只是一些想法。这些是细微的差异,但它们可能导致应用程序代码中出现严重的案例错误。
我认为它们用于不同的事物。或者,如果可以的话,它们可以用不同的方式定义数据。根据您的用例,我上面提到的内容可能很重要,而仅通过定义数据的方式,一个或另一个可能是更好的选择。
另一方面,这可能根本不重要,您可以使用其他一些条件进行选择。功能是第一个IMO。
在这种情况下,我个人将使用三元(或参见下文)。原因是$wireTransferData
的键不同。哪些使这些开关保持未定义状态,可能会导致更多下游问题,并需要更多代码来处理。但是该评估是基于很少的上下文。
更新
我同意以下其他答案:
$wireTransferData['pending-RA'] = ('RA' == $pendingOrder->items);
当您只想要布尔值时,三元级更好。这应该是明显的“ kinda”,但我想我还是会提到它,以防万一,当我在上面统称为“ Ternary”时...这种方法(我们称其为“有条件的”)基本上就相当于Ternary随着功能的发展。
最后一件事
另一种方法是简单地做到这一点:
$wireTransferData['pending-'.$cartItem->cart_item_type] = true;
或
$types = ['pending-MF','pending-RA','pending-FT']; //default is first item
//- function foo($cartItem, $types=['pending-MF','pending-RA','pending-FT']){...}
$wireTransferData = array_fill_keys($types,false); //default all to false
if(in_array('pending-'.$cartItem->cart_item_type, $types)){
$wireTransferData['pending-'.$cartItem->cart_item_type] = true;
}else{
$wireTransferData[$types[0]] = true; //pending-MF => true
}
这将执行Switch和三进制的所有操作(默认为false,设置默认值,检查可接受的类型等。),并且基于$types
数组是动态的。这可能是最好的方法,但是我认为这是一个“学术”问题。
欢呼
答案 1 :(得分:1)
三元组增加了不必要的复杂性。比较表达式已经计算为布尔值。
$wireTransferData['pending-RA'] = ('RA' == $pendingOrder->items);
$wireTransferData['pending-FT'] = ('FT' == $pendingOrder->items);
$wireTransferData['pending-MF'] = ('MF' == $pendingOrder->items);
括号也不是必需的,但我认为它们的确使那里的情况更加明显。
答案 2 :(得分:0)
在这种情况下,我认为多个三元运算符在这里更有意义,这不仅是为了提高可读性,而且是为了防止以后出现错误。值得的是,我认为这两个示例都可读性强。
我决定使用多个三元运算符的原因是将每个数组索引定义为true或false。在这个示例中,我无法确定这是否绝对必要,但如果开关为true,则开关只会定义该索引。以后需要进行其他检查以确保索引存在,然后再读取值。
根据实际应用,我将更改其编写方式,以便将“ pending”的索引设置为“ RA”,“ FT”,“ MF”或“” / false / null。< / p>
答案 3 :(得分:0)
这是另一个不太复杂的解决方案,它假设cart_item_type
中的值与$wireTransferData
键不相似:
$types = [
'RA' => 'pending-RA',
'FT' => 'pending-FT',
'MF' => 'pending-MF'
];
$wireTransferData[$types[$cartItem->cart_item_type]] = true; //readable?