Существует большая разница между ними. В 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 помогают с безопасностью типов, конечно.
Вот немного более читаемый вариант ответа хаоса:
# 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";
}
}
Ключевые моменты:
Альтернативный подход, который иногда помогает с удобочитаемостью, - это размещение некоторых или всех ветвей в хорошо названных ссылках на код. Вот начало идеи:
$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...
Основная задача - сохранить читабельность кода.
Если вы можете получить читаемый код с вложенными операторами if, продолжайте. Но всегда держите здравый смысл активным.
Обычной практикой является определение констант для индексов массива и присвоение им значимых имен. Например:
use constant MANDATORY => 1,
DEFAULT => 2,
PATTERN => 3;
...
if($_[DEFAULT] eq 'NULL') {
...
}
Что касается вложенности - вам следует часто пытаться уменьшить отступ (что означает сохранение низкого уровня вложенности), но никогда не делайте этого за счет сохранения понятности кода. У меня нет проблем с уровнем вложенности, но это также лишь небольшая часть вашего кода. Если это действительно проблема, вы можете разбить условия на отдельные подпрограммы.
Учитывая, что вы, вероятно, сделаете спагетти goto
, в противном случае, Абсолютно Нет.
Если ваша логика требует вложенного оператора if, то я думаю, что с ними нет ничего плохого.
Однако вы можете улучшить читаемость вашего кода с помощью
Разве это не более читабельно?
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 }
вы можете упростить до следующего, если вам не нравится все остальное.
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;
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];
}
}
Я полагаю, вы могли бы использовать логические комбинации, чтобы сгладить это:
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;
Затем вы могли бы использовать переключатель, чтобы сделать его немного лучше.
Я думаю, что основная (если не единственная) причина для беспокойства относительно вложенности - сложность алгоритма. В других случаях вам следует беспокоиться о удобочитаемости и ремонтопригодности, что может быть решено с помощью комментариев и отступов.
Я всегда нахожу хорошее упражнение в ремонтопригодности, чтобы прочитать мой старый код, не только для обратной связи по удобочитаемости, но и по технике ...