dedlfix: if Problem

Beitrag lesen

Tach!

Andererseits gibt es mittlerweile auch IDEs, die Code in Text erkennen können und Unterstützung dafür bieten.

Anstatt Entwickler dazu zu bringen, vernünftigen™ Code zu schreiben, werden IDEs immer weiter überladen‽ 🤔

Das grundlegende Problem lässt sich nicht restlos beseitigen. Es wird immer Situationen geben, wo Code in Strings erstellt werden muss. Nur wenige Sprachen haben einen Mechanismus um fremden Code einzubetten. Selbst PHP kann das nur für den Code des umschließenden Dokuments. Beispielsweise SQL-Statements werden immer als String formuliert werden müssen. Es ist also gar nicht möglich, generell Entwickler zu "vernünftigem" Code in diesem Sinne zu bringen, weil das Ziel nicht erreichbar ist. Eine Hilfe für Code in Strings empfinde ich deshalb fernab von überladen.


<?php if ($bedingung) { ?>
  <p>Text</p>
<?php } ?>

<?php if ($bedingung): ?>
  <p>Text</p>
<?php endif; ?>

Wo ist da der Unterschied? Wird im zweiten Fall der Block etwa nicht unterbrochen? Im ersten Fall findet wenigstens der Klammernpaarmechanismus im Editor noch das Gegenstück.

Es geht um die Sicht menschlicher Codeleser.

Das hatte ich schon aus der Diskussion herausgelesen, dass es nicht um PHPs Parsefähigkeiten geht. Aber auch als Mensch sehe ich in der einen Schreibweise keinen mehr oder weniger zusammenhängenden Block als in der anderen.

Außerdem macht es den Code besser lesbar, wenn beim jeweiligen Ende am Bezeichner erkennbar ist, auf welchen Anfang sich das bezieht – so wie es Entwickler von HTML (End-Tags) auch gewöhnt sind.

Das Argument ist mir nicht stark genug. Das klappt nur, wenn unterschiedliche Kontrollstrukturen im Spiel sind. Bei verschachtelten if-endif zum Beispiel hat man das gleiche Problem mit der nicht mehr ganz eindeutigen Zuordnung. Erwähnte ich schon den nützlichen Klammernpaaranzeigemechanismus der Editoren? Der hilft mir bei der Zuordnung weitaus mehr als mein eingebauter Parser, der es als anstrengend empfindet, die Übersicht zu behalten, je komplexer der Code wird.

Nehmen wir uns nochmal den Codeschnipsel vor:

<?php if (isset($_POST['abschicken']) && !empty($errors1)): ?>
	<ul>
		<?php foreach ($errors1 as $error1): ?>
			<li>
				<?php echo $error1; ?>
			</li>
		<?php endforeach; ?>
	</ul>'; 
<?php endif; ?>

Je kleiner der Code in den Blöcken ist, desto geringer macht sich ein Unterschied beider Methoden bemerkbar. Die Schwierigkeit steigt mit der Entfernung zwischen Blockanfang und -ende. Inwieweit da die eine oder die andere Methode und die dabei zur Verfügung stehenden Hilfsmittel besser helfen, vermag ich nicht allgemeingültig zu klären.

Ich sehe ein größeres Problem in der Geschwätzigkeit des Codes, weil PHP mit <?php ?> oder <?= ?> ziemlich viele Zeichen für den Wechsel zwischen den Kontexten benötigt. Derselbe Code in Razor-Syntax (für C#-Projekte) lässt sich auch mit Klammern statt ausführlichen Blockenden einfach lesen. 4 statt 2 Leerzeichen Einrückung mag auch zur besseren Übersichtlichkeit beitragen.

@if (isset(_POST["abschicken"]) && !empty(errors1)) {
    <ul>
        @foreach (var error11 in errors1) {
            <li>@error1</li>
        }
    </ul>
}

Meinetwegen auch im Allman-Stil

@if (isset(_POST["abschicken"]) && !empty(errors1))
{
    <ul>
        @foreach (var error11 in errors1)
        {
            <li>@error1</li>
        }
    </ul>
}

Wenn man also Probleme mit der Übersichtlichkeit hat, sollte man vielleicht besser eine insgesamt einfachere Syntax (und damit eine Template-Engine) in die Waagschale werfen.

dedlfix.