使用切换器或多个三元组

时间:2019-03-04 17:14:10

标签: php standards

所以我想知道他们使用多重三元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);

我认为,即使该开关占用更多行,也比三元选项更清晰,更容易理解。 (同样,这是一个非常基本的示例)。只是想知道其他人对此主题的想法。

4 个答案:

答案 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?