Warum sind globale Variablen böse?
Ich war auf der Suche nach einer gute Quelle, die erklärt, warum die Verwendung von global
gilt als schlechte Praxis in python (und in der Programmierung im Allgemeinen). Kann jemand mir ein oder hier erklären?
InformationsquelleAutor der Frage LarsVegas | 2013-10-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies hat nichts zu tun mit Python; Globale Variablen sind schlecht in jeder Programmiersprache.
Jedoch, Globale Konstanten sind nicht konzeptionell die gleichen wie Globale Variablen; Globale Konstanten sind völlig in Ordnung, zu verwenden. Es ist nur so, dass in Python gibt es keinen syntaktischen Unterschied.
Der Grund, warum Sie schlecht sind, ist, dass Sie erlauben es, Funktionen zu versteckt (wie in "nicht-offensichtliche" und "schwarzarbeit") und daher schwer zu verstehen, Nebenwirkungen. Auch dies kann dazu führen,Spaghetti-code.
Außerdem beschränkte/kontrollierte/bewusste Verwendung von globals ist akzeptabel, nur als lokalen Zustand, d.h. veränderliche Variablen, die annehmbar ist, in die Funktionale Programmierung, entweder aus Gründen der Leistung oder die Einfachheit, oder für caching/memoization.
Aber natürlich, deine Frage hat viele Antworten, so dass Ihre beste Wette ist, um nur in google "warum sind Globale Variablen schlecht". Einige Beispiele:
Wenn Sie wollen, tiefer zu gehen und herauszufinden, warum die Nebenwirkungen sind alle über, und viele andere erhellende Dinge sollten Sie lernen, Funktionale Programmierung:
InformationsquelleAutor der Antwort Erik Allik
Ja, in der Theorieglobals (und "Staat" im Allgemeinen) sind böse. In der Praxis, wenn Sie einen Blick in Ihre python-packages-Verzeichnis werden Sie feststellen, dass die meisten Module beginnen mit einer Reihe von globalen Deklarationen. Offensichtlich haben die Menschen kein problem mit Ihnen.
Speziell zu python, globals " Sichtbarkeit beschränkt sich auf ein Modul, daher gibt es keine "wahre" Annahmen, die Auswirkungen auf das ganze Programm - das macht Sie so weniger schädlich. Ein weiterer Punkt: es gibt keine
const
so dass, wenn Sie eine Konstante, die Sie haben, um eine Globale.In meiner Praxis, wenn ich zufällig so ändern Sie eine Globale Funktion, die ich immer erklären, es mit
global
auch wenn es technisch keine Notwendigkeit dafür, wie in:Diese macht globals' Manipulationen leichter auf die Spur.
InformationsquelleAutor der Antwort georg
Sich eine persönliche Meinung zu dem Thema ist, dass Globale Variablen in einer Funktion verwendet Logik bedeutet, dass einige andere code ändern können Sie die Logik und den erwarteten Ausgang, die Funktion, die machen das Debuggen sehr schwer (vor allem bei großen Projekten) und macht die Prüfung schwieriger, wie gut.
Darüber hinaus, wenn Sie erwägen, andere Menschen Lesen Ihren code (open-source-community, Kollegen etc) Sie haben eine harte Zeit zu versuchen zu verstehen, wo die Globale variable gesetzt wird, wo geändert wurde und was zu erwarten von dieser globalen variable im Gegensatz zu einer isolierten Funktion, die seine Funktionalität kann bestimmt werden durch das Lesen der definition einer Funktion selbst.
(Wahrscheinlich) den Verstoß Gegen die Reine definition einer Funktion
Glaube ich, dass eine saubere und (fast) bug-free code sollte Funktionen haben, die sind so rein wie möglich (siehe Reine Funktionen). Eine Reine Funktion ist, welche die folgenden Bedingungen:
Dass Globale Variablen ist die Verletzung mindestens einer der oben genannten, wenn nicht beide als externe code kann wahrscheinlich zu unerwarteten Ergebnissen führen.
Andere klare definition von reinen Funktionen: "Reine Funktion ist eine Funktion, alle seine Eingänge als explizite Argumente und produziert alle seine Ausgänge als explizite Ergebnisse." [1]. Mit einem globalen Variablen verstößt gegen die Idee der reinen Funktionen, da eine Eingangs-und vielleicht einer der Ausgänge (der globalen variable) ist nicht explizit gegeben oder zurückgegeben.
(Wahrscheinlich) Gegen Unit-Test F. I. R. S. T-Prinzip
Weiter auf, dass, wenn man bedenkt, unit-Tests und die F. I. R. S. T-Prinzip (Fast-tests, ichndependent tests, Repeatable, Self-Validierung und Timely) wird wahrscheinlich gegen die Unabhängigen tests-Prinzip (was bedeutet, dass tests nicht voneinander abhängen).
Dass eine Globale variable (nicht immer), aber in den meisten Fällen (zumindest was ich bisher gesehen habe) ist die Vorbereitung und übergeben die Ergebnisse anderer Funktionen. Dies verstößt gegen dieses Prinzip. Wenn die Globale variable verwendet worden ist, die Art und Weise (ich.e die Globale variable in Funktion X gesetzt werden muss, um in eine Funktion Y first) es bedeutet, dass unit-test-Funktion X, die Sie ausführen müssen test/run-Funktion Y-ersten.
Globals als Konstanten
Auf der anderen Seite, und ebenso andere Leute haben gesagt, wenn die Globale variable verwendet wird, als eine "Konstante" variable kann etwas besser, da die Sprache unterstützt keine Konstanten. Aber ich habe immer lieber die Arbeit mit Klassen und die "Konstanten" als eine Klasse und nicht eine Globale variable. Wenn Sie einen code, der zwei unterschiedliche Klassen erfordern, um gemeinsam eine Globale variable, dann müssen Sie wahrscheinlich überarbeiten Sie Ihre Lösung und machen Sie Ihre Klassen unabhängig.
Ich glaube nicht, dass die globals nicht verwendet werden sollte. Aber wenn Sie verwendet werden, die Autoren sollten einige Grundsätze (die oben genannten und vielleicht anderen software-engineering-Prinzipien und guten Praktiken) für eine saubere und fast bug-free code.
InformationsquelleAutor der Antwort Rafael
Sind Sie wichtig, der Bildschirm ist ein gutes Beispiel. Jedoch, in einer Multithread-Umgebung oder mit dem viele Entwickler beteiligt sind, in der Praxis oft die Frage: wer hat (erraneously) setzen oder löschen? Abhängig von der Architektur, Analyse kann teuer werden und werden oft gefordert. Beim Lesen der Globale var sein kann, ok, das schreiben, es muss kontrolliert werden, beispielsweise von einem einzelnen thread oder threadsicher sind Klasse. Daher ist die Globale vars entstehen, die Angst vor hohen Entwicklungskosten möglich von den Folgen für die selbst als böse. Daher ist im Allgemeinen, es ist eine gute Praxis zu halten, die Anzahl der globalen vars gering.
InformationsquelleAutor der Antwort Horst Schlawutzke