Лучший макет для заявления переключателя PHP?

Какое-то время это мучило меня: каков наилучший макет для оператора switch, особенно в PHP?

Я делаю это одним из двух способов, даже не задумываясь. Затем, иногда, когда я возвращаюсь к коду, я чувствую, что он выглядит неправильно, и переписываю его по-другому. Повторение!

Способ 1

switch($action)
{
  case 'a':
    //do something
  break;

  case 'b':
    //do something
  break;
}

Преимущества:

  • Я чувствую, что регистр / разрывы совпадают, как в скобках в выражениях switch / if.
  • Это выглядит лучше на мой взгляд

Недостатки:

Способ 2

switch($action)
{
  case 'a':
    //do something
    break;

  case 'b':
    //do something
    break;
}

Преимущества:

Недостатки:

  • Глядя на код, и я сталкиваюсь с разрывом, я иногда чувствую, что в операторе if отсутствует пропущенная конечная скобка, потому что он до сих пор имеет отступ.

Итак, мой вопрос: как правильно составить операторы переключения макетов? Я ошибаюсь при использовании метода 1?

6 ответов

Решение

Извините, что опубликовал это как ответ, но я не смог уместить его в комментарии:

Я предпочитаю метод 2, потому что:

  • перерывы не мешают удобочитаемости кейсов

  • и иногда вы будете иметь перерывы в условиях, например:

    if(...) {
      break;
    }
    

    поэтому дело может упасть до следующего дела или чего-то еще.

    И для моего личного предпочтения было бы неловко использовать метод 1 в этом сценарии, так как break казалось бы, с отступом "слишком много".

Способ 3

switch($action)
{
    case 'a' : 
    {
        //do 
        //something

        break;
    }

    case 'b' : 
    {
        //do 
        //something

        break;
    }
}

или немного более компактный

switch( $action ) {
    case 'a' : {
        //do 
        //something

        break;
    }
    case 'b' : {
        //do 
        //something

        break;
    }
}

Полностью необязательный, но правильный синтаксис скобок. Имхо значительно улучшает читаемость, особенно для очень больших регистров.

Следующий способ форматирования - это то, что я больше всего вижу в коде других людей, а также способ, которым я предпочитаю его форматировать:

switch($action)
{
    case 'login': 
        $this->userLogin($username); 
        break;

    case 'post': 
        $this->userPost($username); 
        break;

    case 'update': 
        $this->userUpdate($username); 
        break;

    case 'logout': 
        $this->userLogout($username); 
        break;

}

Я также видел, как это используется так. Обратите внимание на отступы? Это имеет смысл на самом деле, так как действие (код, который делает что-то) только один отступ от { а также } скобки, как обычные function или же if заявление. Тем не менее, для меня это делает уже странным switch Заявление еще более странное.

switch($action)
{
case 'login': 
    $this->userLogin($username); 
    break;

case 'post': 
    $this->userPost($username); 
    break;

case 'update': 
    $this->userUpdate($username); 
    break;

case 'logout': 
    $this->userLogout($username); 
    break;

}

Когда я долго switch Заявление, каждое с одним действием, я иногда использую следующий подход. Я думаю, что это делает его вполне читабельным.

switch($action)
{
    case 'login'    : $this->userLogin($username); break;
    case 'post'     : $this->userPost($username); break;
    case 'update'   : $this->userUpdate($username); break;
    case 'logout'   : $this->userLogout($username); break;
}

Который выглядит лучше при использовании returnв этом случае нет необходимости break:

switch($action)
{
    case 'login'    : return $this->userLogin($username);
    case 'post'     : return $this->userPost($username);
    case 'update'   : return $this->userUpdate($username);
    case 'logout'   : return $this->userLogout($username);
}

Просто в качестве примера, он может быть отформатирован так, где вместо { а также } скобки, вы используете : и endswitch:

switch($action):
    case 'login'    : return $this->userLogin($username);
    case 'post'     : return $this->userPost($username);
    case 'update'   : return $this->userUpdate($username);
    case 'logout'   : return $this->userLogout($username);
endswitch;

Нет правильного или неправильного метода; Синтаксис оператора switch не сбалансирован, поэтому нет способа "сделать все правильно".

Стандарт де-факто, кажется, второй метод. Но если вы хорошо владеете языком программирования, схема отступов не имеет большого значения, если она используется последовательно для данного блока кода.

switch($option){
case 'a': 
//do something; 
break;
case 'b': 
//do something; 
break;
default:
break;
}

Ни.

Не "У меня есть лучший способ, и вы должны использовать его вместо этого", а "Это не имеет значения".

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

Это нормально:

switch ('hi'){
    case 'hi': 
        PRINT "HI!";}

Это тоже нормально

switch ('hi')
{
    case 'hi': 
        PRINT "HI!";
}

Также все в порядке:

    switch ('hi'){
        case 'hi': PRINT "HI!";
    }

Очень нестандартно и отнимает много времени, так что я не знаю, что бы вы сделали, но тоже хорошо:

// *
switch ('hi')
{
// ****   
case 'hi': PRINT "HI!";
// ****
}
// *

Серьезно, пока люди могут читать это и легко различать, что происходит, это нормально.

Если только ваш коллега и коллега по программированию не слишком увлечены одним стилем и ОКР. В этот момент вам нужно исправить весь их код в другом стиле, чтобы сделать ваше рабочее место менее скучным.

Примечание: я шучу по поводу изменения кода ваших коллег, чтобы изменить их стили кодирования. Это обычно воспринимается как пассивная агрессия и просто делает рабочее место враждебным.

Другие вопросы по тегам