Я должен избежать вложенный если операторы в Perl?

Существует большая разница между ними. В C++ Вы не должны определять класс или интерфейс для универсального типа. Вот почему можно создать действительно родовые функции и классы с протестом более свободного ввода.

template <typename T> T sum(T a, T b) { return a + b; }

метод выше добавляет два объекта того же типа и может использоваться для любого типа T, который имеет "+" доступный оператор.

В Java необходимо определить тип, если Вы хотите звонить, методы на объектах передали, что-то как:

<T extends Something> T sum(T a, T b) { return a.add ( b ); }

В C++ универсальные функции/классы могут только быть определены в заголовках, так как компилятор генерирует различные функции для различных типов (что это вызывается с). Таким образом, компиляция медленнее. В Java компиляция не имеет крупного штрафа, но Java использует технику, названную "стиранием", где универсальный тип стирается во времени выполнения, таким образом, в Java во время выполнения на самом деле звонит...

Something sum(Something a, Something b) { return a.add ( b ); }

, Таким образом, универсальное программирование в Java не действительно полезно, это - только немного синтаксического сахара для помощи с новой конструкцией foreach.

РЕДАКТИРОВАНИЕ: мнение выше о полноценности было записано младшим сам. Дженерики Java помогают с безопасностью типов, конечно.

5
задан brian d foy 28 July 2009 в 19:25
поделиться

10 ответов

Вот немного более читаемый вариант ответа хаоса:

# Set sane variable names...
my ($is_required, $default, $pattern) = @_

# Convert the external string convention for simpler evaluation...
$default = undef if $default eq 'NULL'

# Refuse problematic input before going any further...
if ($input ne '' && $input !~ $pattern || $input =~ /'.+'/) {
    print "! Format not respected. Match : /$pattern/ (without \' \')\n"; 
    next;
}


# If there was no input string...
if($input eq '') {

    # Set the default, if one was provided...
    if( $default ) {
        print "+ Using default value\n";
        $input = $default;
    } 
    # otherwise, complain if a default was required...
    else {
        if( $is_required eq 'y' ){
            print "! Mandatory parameter not filled in\n";
            next;
        }
        print "+ Ignoring parameter (no input or default provided).\n";
    }
}

Ключевые моменты:

  • Вам не нужно else , если вы выходите из текущего цикл с next
  • В первую очередь следует обработать исключительные случаи
  • Вы можете значительно улучшить читаемость, используя именованные переменные
10
ответ дан 18 December 2019 в 07:30
поделиться

Альтернативный подход, который иногда помогает с удобочитаемостью, - это размещение некоторых или всех ветвей в хорошо названных ссылках на код. Вот начало идеи:

$format_not_respected = sub {
    return 0 if ...;
    print "! Format not respected....";
    return 1;
}
$missing_mandatory_param = sub {
    return 0 if ...;
    print "! Mandatory parameter not filled in\n";
    return 1;
}

next if $format_not_respected->();
next if $missing_mandatory_param->();
etc...
4
ответ дан 18 December 2019 в 07:30
поделиться

Основная задача - сохранить читабельность кода.

Если вы можете получить читаемый код с вложенными операторами if, продолжайте. Но всегда держите здравый смысл активным.

3
ответ дан 18 December 2019 в 07:30
поделиться

Обычной практикой является определение констант для индексов массива и присвоение им значимых имен. Например:

use constant MANDATORY => 1,
             DEFAULT => 2,
             PATTERN => 3;
...
if($_[DEFAULT] eq 'NULL') {
   ...
}

Что касается вложенности - вам следует часто пытаться уменьшить отступ (что означает сохранение низкого уровня вложенности), но никогда не делайте этого за счет сохранения понятности кода. У меня нет проблем с уровнем вложенности, но это также лишь небольшая часть вашего кода. Если это действительно проблема, вы можете разбить условия на отдельные подпрограммы.

2
ответ дан 18 December 2019 в 07:30
поделиться

Учитывая, что вы, вероятно, сделаете спагетти goto , в противном случае, Абсолютно Нет.

Что может быть лучше, так это корпус переключателя .

]
0
ответ дан 18 December 2019 в 07:30
поделиться

Если ваша логика требует вложенного оператора if, то я думаю, что с ними нет ничего плохого.

Однако вы можете улучшить читаемость вашего кода с помощью

  1. , используя лишь немного больше пробелов и
  2. Используя свои собственные переменные вместо того, чтобы работать непосредственно с @_

Разве это не более читабельно?

 98        if ($input eq '') {
 99             if ($default eq 'NULL'){
100                 if ($input eq 'y'){
101                     print "! Mandatory parameter not filled in\n";
102                     next;
103                 }
104                 else {
105                     print "+ Ignoring parameter.\n";
106                     $input = '';
107                 }
108             }
109             else {
110                 print "+ Using default value\n";
111                 $input = $default;
112             }
113         }
114         elsif ($input !~ $foo || $input =~ /'.+'/) {
115                 print "! Format not respected. Match : /$foo/ (without \' \')\n"; 
116                 next;
117             }
118         }
1
ответ дан 18 December 2019 в 07:30
поделиться

вы можете упростить до следующего, если вам не нравится все остальное.

if($input eq ''){
    $input = $_[2];
    $output = "+ Using default value\n";
    if($_[2] eq 'NULL'){
        $input = '';
        $output = "+ Ignoring parameter.\n";
        if($_[1] eq 'y'){
            $output = "! Mandatory parameter not filled in\n";
        }
    }
}
elsif($input !~ $_[3] || $input =~ /'.+'/){
    $output = "! Format not respected. Match : /$_[3]/ (without \' \')\n"; 
}
print $output;
0
ответ дан 18 December 2019 в 07:30
поделиться
if($input ne '' && ($input !~ $_[3] || $input =~ /'.+'/)) {
    print "! Format not respected. Match : /$_[3]/ (without \' \')\n"; 
    next;
}
if($input eq '') {
    if($_[2] eq 'NULL') {
        if($_[1] eq 'y'){
            print "! Mandatory parameter not filled in\n";
            next;
        }
        print "+ Ignoring parameter.\n";
        $input = '';
    } else {
        print "+ Using default value\n";
        $input = $_[2];
    }
}
3
ответ дан 18 December 2019 в 07:30
поделиться

Я полагаю, вы могли бы использовать логические комбинации, чтобы сгладить это:

if(($input eq '')&&($_[2] eq 'NULL')&&($_[1] eq 'y')){
  print "! Mandatory parameter not filled in\n";
  next;
}

elsif(($input eq '')&&($_[2] eq 'NULL')){
  print "+ Ignoring parameter.\n";
  $input = '';
}

elsif($input eq ''){
  print "+ Using default value\n";
  $input = $_[2];
  next;
}


elsif($input !~ $_[3] || $input =~ /'.+'/){
  print "! Format not respected. Match : /$_[3]/ (without \' \')\n";
}

print $output;

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

-2
ответ дан 18 December 2019 в 07:30
поделиться

Я думаю, что основная (если не единственная) причина для беспокойства относительно вложенности - сложность алгоритма. В других случаях вам следует беспокоиться о удобочитаемости и ремонтопригодности, что может быть решено с помощью комментариев и отступов.

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

0
ответ дан 18 December 2019 в 07:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: