Что является более элегантным решением для этих вложенных операторов if / elseif? - PullRequest
6 голосов
/ 28 сентября 2010

Я создаю веб-сайт, который содержит пользователей с профилями пользователей. Многие поля в профиле являются необязательными.

Существует возможность для большого количества пользовательского контента, и поэтому мне нужно отображать автора этого контента в разных местах сайта (комментарии, посты и т. Д.). В профиле пользователя он может (при желании) указать свое «имя», «фамилию» и «отображаемое имя».

Чтобы отобразить автора, я написал вспомогательный метод, который просматривает предоставленный массив этих полей и возвращает наиболее подходящее имя для пользователя в следующем порядке:

  1. Если пользователь заполнил display_name, это будет отображено.
  2. Если пользователь заполнил first_name и last_name, но не display_name, он отобразит оба имени
  3. Если пользователь только заполнил first_name, будет отображаться first_name.
  4. Если пользователь только заполнил last_name, на нем отобразится last_name.
  5. Если ничего не помогает, будет отображаться идентификатор пользователя, т.е. 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;
}

Ответы [ 9 ]

7 голосов
/ 28 сентября 2010
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"

2 голосов
/ 28 сентября 2010

Используя троичные условия, мы можем сократить и украсить код:

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;
}
1 голос
/ 28 сентября 2010

Я бы предложил это:

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;
}
0 голосов
/ 28 сентября 2010

Я не уверен, что моя версия была бы проще, но вот она:

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));
}
0 голосов
/ 28 сентября 2010

A Конечный автомат очень хорошо работает для такой логики. Это очень просто реализовать (используя инструкцию switch).

0 голосов
/ 28 сентября 2010

Несколько менее читабельно, но эффективно):

list($idx,$name) = array_shift(array_filter(array(
    $names['display_name'],
    implode(' ',array_filter(array($names['first_name'],$names['last_name']))),
    'user'.$names['id'];
    )));
0 голосов
/ 28 сентября 2010
//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++]);
}
0 голосов
/ 28 сентября 2010

Я бы пошел с:

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 или что-то в этом роде.

0 голосов
/ 28 сентября 2010

Это немного, но поскольку $ 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...