簡體   English   中英

對這些嵌套的if / elseif語句有什么更優雅的解決方案?

[英]What is a more elegant solution to these nested if/elseif statements?

我正在構建一個包含用戶個人資料的用戶的網站。 配置文件中的許多字段都是可選的。

有很多用戶生成內容的機會,因此我需要在網站的許多不同位置(評論,帖子等)顯示此內容的作者。 在用戶的個人資料中,他能夠(可選地)填寫他的“名字”,他的“姓氏”和“顯示名稱”。

為了顯示作者,我編寫了一個幫助器方法,該方法查看這些字段的提供數組,並按此優先順序返回用戶最合適的名稱:

  1. 如果用戶填寫了display_name ,則會顯示。
  2. 如果用戶填寫了first_namelast_name ,但沒有顯示display_name ,則會顯示這兩個名稱
  3. 如果用戶只填寫first_name ,它將顯示first_name
  4. 如果用戶只填寫last_name ,它將顯示last_name
  5. 如果所有其他方法都失敗,將顯示用戶ID,即user123
  6. 如果沒有數組鍵,或者參數為NULL,則名稱將顯示為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM