Sollte ich vermeiden Sie verschachtelte if-Anweisungen in Perl?
Mache ich einige Perl-und da mein verschachtelte "wenn" - Aussagen ist das fahren mich verrückt. Ich habe es geschafft zu reduzieren, einige von Ihnen mit guard blockiert, die in einem anderen Abschnitt, aber ich bin hier hängengeblieben.
Glaubst du, ich kann den code belassen wie er ist, oder ist es eine "richtige" Art und Weise umgestalten, die folgenden ? (Auch ich zugeben, als relativ neu in Perl)
Dies ist eigentlich ein Unterprogramm Fragen für den Benutzer Eingang für jeden Parameter eine Liste (externe Datei). $[3] wird das matching-pattern, $[2] ist der default-Wert für die betrachteten parameter (NULL, wenn es keines gibt), $_[1] gibt an, ob es obligatorisch ist oder nicht. der 'next' - Anweisung bezieht sich auf den nächsten parameter Lesen (while-Schleife).
Mit jeder s Hilfe (vielen Dank !), hier ist die neueste version.
100 if ( $input ne '' && ( $input !~ $match || $input =~ /'.+'/ ) ) {
101 print "! Format not respected. Match : /$match/(without \' \')\n";
102 next;
103 }
104 if ( $input eq '' ) {
105 if ( $default eq 'NULL' ) {
106 if ( $manda eq 'y' ) {
107 print "! Mandatory parameter not filled in\n";
108 next;
109 }
110 print "+ Ignoring parameter.\n";
111 $input = '';
112 }
113 else {
114 print "+ Using default value\n";
115 $input = $default;
116 }
117 }
98 if($input eq ''){
99 if($_[2] eq 'NULL'){
100 if($_[1] 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 = $_[2];
112 }
113 }
114 elsif($input !~ $_[3] || $input =~ /'.+'/){
115 print "! Format not respected. Match : /$_[3]/(without \' \')\n";
116 next;
117 }
118 }
- Was konkret ist es, das treibt Sie verrückt über diese verschachtelten ifs?
- Ich weiß nicht, ich habe einfach das Gefühl es ist eine andere Art des Schreibens, die...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist eine etwas besser lesbare version des chaos' Antwort:
Die wichtigsten Punkte sind:
Einen alternativen Ansatz, der hilft manchmal mit der Lesbarkeit ist, um einige oder alle der Filialen in der gut-namens code verweist. Hier ist einer auf die Idee zu starten:
Den Hauptanliegen ist, halten Sie den code lesbar.
Wenn man lesbaren code mit verschachtelten if-Anweisungen, gehen Sie vor. Aber halten Sie den gesunden Menschenverstand zu jeder Zeit aktiv.
Gängige Praxis ist die Definition von Konstanten für deine array Indizes, und geben Sie Ihnen aussagekräftige Namen. Wie:
Soweit verschachteln-Sie sollten versuchen oft zur Reduzierung der Gedankenstrich (d.h. halten die Ebene der Schachtelung zu tief), aber nie auf Kosten zu halten, den code verständlich. Ich habe kein problem mit dem Niveau der Verschachtelung, aber das ist auch nur ein kleiner Ausschnitt des Codes. Wenn es wirklich ein Problem, Sie könnte brechen, die die Bedingungen in separaten Unterprogrammen.
Wenn Sie die Logik, die erforderlich geschachtelte if-Anweisung, dann denke ich, es ist nichts falsch mit Ihnen.
Jedoch, Sie könnte verbessern Sie Ihre code-Lesbarkeit durch
Ist das nicht ein bisschen mehr lesbar?
Gegeben, dass Sie wird wahrscheinlich nicht ein spaghetti -
goto
sonst Absolut Keine.Was besser sein könnte, ist ein switch case.
given
/when
?könnte man vereinfachen Sie den folgenden, wenn Sie nicht wie alle anderen.
Ich denke, der wichtigste (wenn nicht einzige) Grund für die Bedenken regardong nesting-Algorithmus ist die Komplexität. Auf der anderen Fällen sollten Sie sich sorgen machen über Lesbarkeit und Wartbarkeit, die sich also mit propoer kommentieren und Einrücken.
Finde ich immer eine gute übung in maintanability Lesen Alter code von mir, nicht nur, um feedback über die Lesbarkeit, sondern auch auf Technik...
Ich nehme an, Sie könnten tun, Logik-Kombinationen zu glätten Sie es heraus:
Dann könnten Sie einen Schalter, um es ein wenig besser.
elseif
nurelsif
.