Meiner bescheidenen Meinung nach sollte dies im Allgemeinen weitgehend für Produktionscode vermieden werden, da Sie im Allgemeinen nur in sporadischen Funktionen versucht sind, die unterschiedliche Aufgaben ausführen. Ich tendiere dazu, es in einem Schrottcode zu tun, der zum Testen von Dingen verwendet wird, aber ich finde keine Versuchung, es im Produktionscode zu tun, wo ich vorher überlegt habe, was jede Funktion tun soll, da die Funktion dann natürlich eine sehr große Wirkung hat begrenzter Umfang in Bezug auf seinen lokalen Zustand.
Ich habe noch nie Beispiele für solche anonymen Blöcke gesehen (ohne Bedingungen, einen try
Block für eine Transaktion usw.), um den Umfang einer Funktion auf sinnvolle Weise zu reduzieren, ohne die Frage zu stellen, warum dies nicht möglich war weiter in einfachere Funktionen mit reduziertem Umfang unterteilt werden, wenn es tatsächlich praktisch von einem echten SE-Standpunkt aus den anonymen Blöcken profitiert hat. Normalerweise ist es eklektischer Code, der eine Reihe von Dingen ausführt, die lose oder sehr unabhängig voneinander sind, und zu denen wir am meisten versucht sind, danach zu greifen.
Wenn Sie beispielsweise versuchen, eine Variable mit dem Namen wiederzuverwenden count
, deutet dies darauf hin, dass Sie zwei unterschiedliche Dinge zählen. Wenn der Variablenname so kurz sein soll count
, ist es für mich sinnvoll, ihn an den Kontext der Funktion zu binden, der möglicherweise nur eine Art von Dingen zählt. Dann können Sie sofort den Namen und / oder die Dokumentation der Funktion anzeigen, sehen count
und sofort wissen, was sie im Kontext der Funktionsweise bedeutet, ohne den gesamten Code zu analysieren. Ich finde nicht oft ein gutes Argument für eine Funktion, um zwei verschiedene Dinge zu zählen, indem derselbe Variablenname in einer Weise wiederverwendet wird, die anonyme Bereiche / Blöcke im Vergleich zu den Alternativen so attraktiv macht. Das bedeutet nicht, dass alle Funktionen nur eines zählen müssen. ICH'Engineering-Nutzen für eine Funktion, die denselben Variablennamen zum Zählen von zwei oder mehr Dingen wiederverwendet und anonyme Blöcke verwendet, um den Umfang jeder einzelnen Zählung zu begrenzen. Wenn die Funktion einfach und klar ist, ist es nicht das Ende der Welt, zwei unterschiedlich benannte Zählvariablen zu haben, wobei die erste möglicherweise ein paar Zeilen mehr Sichtbarkeit aufweist, als im Idealfall erforderlich ist. Solche Funktionen sind im Allgemeinen nicht die Quelle von Fehlern, denen solche anonymen Blöcke fehlen, um den minimalen Umfang ihrer lokalen Variablen noch weiter zu reduzieren.
Kein Vorschlag für überflüssige Methoden
Dies soll nicht bedeuten, dass Sie Methoden mit Nachdruck erstellen, um den Umfang zu verringern. Das ist wohl genauso schlimm oder schlimmer, und was ich vorschlage, sollte nicht mehr als die Notwendigkeit anonymer Bereiche die Notwendigkeit umständlicher privater "Helfer" -Methoden erfordern. Dabei geht es zu sehr um den Code in seiner jetzigen Form und darum, den Gültigkeitsbereich von Variablen zu verringern, als vielmehr darum, das Problem auf Schnittstellenebene so zu lösen, dass lokale Funktionszustände auf natürliche Weise ohne tiefes Verschachteln von Blöcken sauber und kurz sichtbar sind und 6+ Ebenen der Einrückung. Ich stimme Bruno zu, dass Sie die Lesbarkeit von Code behindern können, indem Sie 3 Codezeilen mit Gewalt in eine Funktion einfügen. Dabei wird jedoch davon ausgegangen, dass Sie die Funktionen, die Sie erstellen, basierend auf Ihrer vorhandenen Implementierung weiterentwickeln. anstatt die Funktionen zu entwerfen, ohne sich in Implementierungen zu verheddern. Wenn Sie es auf die letztere Weise tun, habe ich wenig Bedarf an anonymen Blöcken gefunden, die keinen anderen Zweck erfüllen, als den Gültigkeitsbereich einer Variablen innerhalb einer bestimmten Methode zu reduzieren, es sei denn, Sie versuchen eifrig, den Gültigkeitsbereich einer Variablen um nur ein paar Zeilen weniger harmlosen Codes zu reduzieren wo die exotische Einführung dieser anonymen Blöcke wohl so viel intellektuellen Aufwand beiträgt, wie sie entfernen.
Versuchen, den Mindestumfang noch weiter zu reduzieren
Wenn es sich gelohnt hat, die Gültigkeitsbereiche lokaler Variablen auf das absolute Minimum zu reduzieren, sollte eine breite Akzeptanz von Code wie folgt bestehen:
ImageIO.write(new Robot("borg").createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize())), "png", new File(Db.getUserId(User.handle()).toString()));
... da dies die minimale Sichtbarkeit des Zustands bewirkt, indem nicht einmal Variablen erstellt werden, die überhaupt auf sie verweisen. Ich möchte nicht als dogmatisch abschneiden, aber ich denke tatsächlich, dass die pragmatische Lösung darin besteht, anonyme Blöcke zu vermeiden, wenn dies möglich ist, genauso wie es die monströse Codezeile oben ist, und wenn sie im Produktionskontext aus der Sicht von so absolut notwendig erscheinen Aus der Perspektive der Korrektheit und der Beibehaltung von Invarianten in einer Funktion halte ich es auf jeden Fall für sinnvoll, Ihren Code in Funktionen zu gliedern und Ihre Schnittstellen neu zu gestalten. Wenn Ihre Methode 400 Zeilen lang ist und der Gültigkeitsbereich einer Variablen für mehr als 300 Codezeilen sichtbar ist, kann dies natürlich ein echtes Konstruktionsproblem darstellen, das jedoch nicht unbedingt mit anonymen Blöcken gelöst werden muss.
Nicht zuletzt ist die Verwendung anonymer Blöcke überall exotisch und nicht idiomatisch, und exotischer Code birgt das Risiko, Jahre später von anderen, wenn nicht von Ihnen selbst, gehasst zu werden.
Der praktische Nutzen der Einschränkung des Anwendungsbereichs
Der ultimative Nutzen der Reduzierung des Gültigkeitsbereichs von Variablen besteht darin, dass Sie die Zustandsverwaltung korrekt ausführen und beibehalten können und auf einfache Weise über die Funktionsweise eines bestimmten Teils einer Codebasis nachdenken können, um konzeptionelle Invarianten beizubehalten. Wenn die Verwaltung des lokalen Status einer einzelnen Funktion so komplex ist, dass Sie den Umfang mit einem anonymen Codeblock, der nicht finalisiert und fehlerfrei sein soll, nachdrücklich reduzieren müssen, ist dies wiederum ein Zeichen für mich, dass die Funktion selbst erneut überprüft werden muss . Wenn Sie Schwierigkeiten haben, über die Zustandsverwaltung von Variablen in einem lokalen Funktionsbereich nachzudenken, stellen Sie sich die Schwierigkeit vor, über die privaten Variablen nachzudenken, auf die jede Methode einer ganzen Klasse zugreifen kann. Wir können keine anonymen Blöcke verwenden, um deren Sichtbarkeit zu verringern. Für mich ist es hilfreich, mit der Annahme zu beginnen, dass Variablen tendenziell einen etwas größeren Umfang haben, als sie im Idealfall in vielen Sprachen haben müssen, vorausgesetzt, sie geraten nicht außer Kontrolle, bis Sie Schwierigkeiten haben, Invarianten zu verwalten. Es ist nicht so viel mit anonymen Blöcken zu lösen, wie ich aus pragmatischer Sicht annehme.