[英]What is a more elegant solution to these nested if/elseif statements?
我正在构建一个包含用户个人资料的用户的网站。 配置文件中的许多字段都是可选的。
有很多用户生成内容的机会,因此我需要在网站的许多不同位置(评论,帖子等)显示此内容的作者。 在用户的个人资料中,他能够(可选地)填写他的“名字”,他的“姓氏”和“显示名称”。
为了显示作者,我编写了一个帮助器方法,该方法查看这些字段的提供数组,并按此优先顺序返回用户最合适的名称:
display_name
,则会显示。 first_name
和last_name
,但没有显示display_name
,则会显示这两个名称 first_name
,它将显示first_name
。 last_name
,它将显示last_name
。 user123
NULL
该方法效果很好,但很难看。 必须有一种方法来替代嵌套的if / else语句来美化它。
public function nameify($names = NULL) {
$name = '';
if (!empty($names)) {
if (!empty($names['display_name'])) {
$name = $names['display_name'];
} elseif (!empty($names['first_name'])) {
$name = $names['first_name'];
if (!empty($names['last_name'])) {
$name .= ' ' . $names['last_name'];
}
} elseif (!empty($names['last_name'])) {
$name = $names['last_name'];
}
if (empty($name) && !empty($names['id'])) {
$name = 'user' . $names['id'];
} else {
$name = 'NULL';
}
} else {
$name = 'NULL';
}
return $name;
}
public function nameify($names = NULL) {
if ($names) {
if (!empty($names['display_name'])) {
return $names['display_name'];
}
if (!empty($names['first_name'])) {
$name = $names['first_name'];
}
if (!empty($names['last_name'])) {
$name .= ' ' . $names['last_name'];
}
if (empty($name) && !empty($names['id'])) {
$name = 'user' . $names['id'];
}
}
return $name ? ltrim($name) : 'NULL';
}
首先设置默认值,如果没有其他匹配则返回。 然后,因为我们总是希望返回显示名称,如果我们有这样做。
编辑:调整以防止返回“NULL”
使用三元条件,我们可以缩短和美化代码:
public function nameify($names = NULL) {
$name = 'NULL';
if (!empty($names)) {
$name = ($names['display_name']) ? $names['display_name'] : trim($names['first_name']." ".$names['last_name']);
if(!$name) $name = ($names['id'] > 0) ? 'user'.$names['id'] : 'NULL';
}
return $name;
}
我建议这个:
public function nameify($names = null) { if(empty($names)) return null; if(!empty($names['display_name'])) return $names['display_name']; if(!empty($names['first_name'])) { $name = $names['first_name']; if (!empty($names['last_name'])) { $name .= ' ' . $names['last_name']; } return $name; } if(!empty($names['id])) return 'user' . $names['id']; return null; }
它并不多,但因为$ name它至少为NULL:
public function nameify($names = NULL) {
$name = 'NULL';
if (!empty($names)) {
if (!empty($names['display_name'])) {
$name = $names['display_name'];
} elseif (!empty($names['first_name'])) {
$name = $names['first_name'];
if (!empty($names['last_name'])) {
$name .= ' ' . $names['last_name'];
}
} elseif (!empty($names['last_name'])) {
$name = $names['last_name'];
}
if ($name=='NULL' && !empty($names['id'])) {
$name = 'user' . $names['id'];
}
}
return $name;
}
我会去:
if( empty($names['display_name']) ) {
$name = $names['first_name'] . ' ' $names['last_name'];
else
$name = $names['display_name'];
$name = trim($name);
if( empty($name) )
$name = 'user'.$names['id'];
if( empty($name) )
$name = 'NULL';
这将是'核心逻辑'......需要进行其他检查,比如$names != NULL
或者其他什么......
//pointers to functions
$arrayOfSulutions{"display_name_strategy", "full_name_strategy" ..., "null_strategy" }
function display_name_strategy{
return $names['display_name'];
}
$i = 0;
while($res == null){
$res = call($arrayOfSulutions[$i++]);
}
可读性稍差但有效):
list($idx,$name) = array_shift(array_filter(array(
$names['display_name'],
implode(' ',array_filter(array($names['first_name'],$names['last_name']))),
'user'.$names['id'];
)));
状态机非常适合这样的逻辑。 实现起来也非常简单(使用switch语句)。
我不确定我的版本会更简单,但它是:
public function nameify($names = null) {
$result = array();
if( !empty($names['display_name']) ) {
array_push($result,$names['display_name']);
} else {
if( !empty($names['first_name']) ) {
array_push($result, $names['first_name']);
}
if( !empty($names['last_name']) ) {
array_push($result, $names['last_name']);
}
}
if( empty($result) && !empty($names['id']) ) {
array_push($result, 'user'.$names['id']);
}
return (empty($result) ? 'NULL' : implode(' ', $result));
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.