使用开关或多个ternarys [关闭]

问题描述 投票:0回答:4

所以我想知道他们有什么理由使用多个三元vs一个switch语句。我认为,考虑到开发的速度以及花在不同经验水平上的新程序员的所有时间。如果使用较短但难以理解的令人困惑的代码,它们没有或只有很少的性能提升,如果它减缓了新的开发,它真的是一个好处。 (我使用的是一个非常简单的例子,但我认为大多数人遇到了一段代码,这些代码让我们抓住了头脑并暂停了一会儿。

非常简单的例子

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

我觉得即使开关需要更多线路,它也更清晰,可以比三元选项更快地理解。 (这是一个非常基本的例子)。只是想知道别人对这个话题的看法。

php standards
4个回答
1
投票

三元组增加了不必要的复杂性。比较表达式已经计算为布尔值。

$wireTransferData['pending-RA'] = ('RA' == $pendingOrder->items);
$wireTransferData['pending-FT'] = ('FT' == $pendingOrder->items);
$wireTransferData['pending-MF'] = ('MF' == $pendingOrder->items);

括号也不是必需的,但我认为它们确实使那里发生的事情变得更加明显。


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的钥匙是不同的。哪些交换机留下这些未定义可能会导致下游更多问题并需要更多代码来处理。但该评估基于非常少的背景。

UPDATE

我同意其他答案:

$wireTransferData['pending-RA'] =  ('RA' == $pendingOrder->items);

当你只想要一个布尔值时,比三元更好。哪个应该是“有点”显而易见的,但我想我会提到它以防万一我在上面统称为“三元”......这种方法(让我们称之为“有条件的”)基本上相当于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数组的动态。这可能是最好的方式,但我认为这是一个“学术”问题。

干杯


0
投票

我认为在这种情况下,多个三元运算符在这里会更有意义,不仅仅是为了可读性,而是为了防止以后的错误。对于它的价值,我认为这两个例子都非常易读。

我决定使用多个三元运算符的原因是将每个数组索引定义为true或false。我不知道这个例子是否绝对需要,但是如果它是真的,那么开关只会定义索引。这将需要在以后进行额外检查,以确保在读取值之前存在索引。

根据实际应用,我会改变它的编写方式,以便我将“pending”索引设置为“RA”,“FT”,“MF”或“”/ false / null。


0
投票

这是另一个不那么详细的解决方案,假设cart_item_type中的值与$wireTransferData键不相似:

$types = [
    'RA' => 'pending-RA',
    'FT' => 'pending-FT',
    'MF' => 'pending-MF'
];

$wireTransferData[$types[$cartItem->cart_item_type]] = true; //readable?
© www.soinside.com 2019 - 2024. All rights reserved.