wake-up-neo.com

Sind globale Variablen schlecht?

Sind globale Variablen in C/C++ so schlecht, wie mein Professor sie denkt?

212
timp

Das Problem bei globalen Variablen ist, dass es mit jeder Funktion immer schwieriger wird, herauszufinden, welche Funktionen diese Variablen tatsächlich lesen und schreiben. 

Um zu verstehen, wie die Anwendung funktioniert, müssen Sie praktisch jede Funktion berücksichtigen, die den globalen Zustand verändert. Das ist möglich, aber mit zunehmender Anwendung wird es schwieriger, praktisch unmöglich zu sein (oder zumindest eine komplette Zeitverschwendung). 

Wenn Sie sich nicht auf globale Variablen verlassen, können Sie den Status nach Bedarf zwischen verschiedenen Funktionen übergeben. Auf diese Weise haben Sie eine viel bessere Chance zu verstehen, was jede Funktion bewirkt, da Sie den globalen Zustand nicht berücksichtigen müssen.

226
Brian Rasmussen

Wichtig ist, sich an das Gesamtziel zu erinnern: Klarheit

Die Regel "Keine globalen Variablen" ist vorhanden, da globale Variablen die Bedeutung von Code meistens weniger klar machen.

Wie viele Regeln erinnern sich die Leute an die Regel und nicht daran, was die Regel tun sollte. 

Ich habe Programme gesehen, die die Größe des Codes zu verdoppeln scheinen, indem sie eine enorme Anzahl von Parametern herumgeben, um das Übel globaler Variablen zu vermeiden. Am Ende hätte die Verwendung von Globals das Programm klarer für diejenigen, die es lesen, gemacht. Der ursprüngliche Programmierer hatte sich an das Wort der Regel gehalten und damit die Absicht der Regel verfehlt.

Also ja, Globals sind oft schlecht. Wenn Sie jedoch das Gefühl haben, dass am Ende die Absicht des Programmierers durch die Verwendung globaler Variablen klarer wird, dann fahren Sie fort. Denken Sie jedoch an die Abnahme der Klarheit, die automatisch eintritt, wenn Sie jemanden dazu zwingen, auf einen zweiten Code (die Globals) zuzugreifen, um zu verstehen, wie der erste Code funktioniert.

68
Tom West

Mein Professor sagte immer etwas wie: Die Verwendung von globalen Variablen ist in Ordnung, wenn Sie sie richtig verwenden. Ich glaube nicht, dass ich sie je richtig verstanden habe, also habe ich sie selten benutzt.

56
barneytron

Globale Variablen sollten nur verwendet werden, wenn Sie keine Alternative haben. Und ja, dazu gehören auch Singletons. In 90% der Fälle werden globale Variablen eingeführt, um die Kosten für das Weitergeben eines Parameters zu sparen. Und dann passiert Multithreading/Unit Testing/Maintenance-Codierung, und Sie haben ein Problem.

Ja, in 90% der Situationen sind globale Variablen schlecht. Die Ausnahmen werden von Ihnen wahrscheinlich nicht in Ihren College-Jahren gesehen. Eine Ausnahme, die ich von Kopf bis Fuß denken kann, ist der Umgang mit inhärent globalen Objekten wie Interrupt-Tabellen. Dinge wie die DB-Verbindung scheinen, um global zu sein, sind es aber nicht.

34
Arkadiy

Das Problem, das globale Variablen für den Programmierer erzeugen, besteht darin, dass sie die Oberfläche Inter-Components Coupling zwischen den verschiedenen Komponenten, die die globalen Variablen verwenden, erweitert. Dies bedeutet, dass mit zunehmender Anzahl von Komponenten, die eine globale Variable verwenden, auch die Komplexität der Interaktionen zunehmen kann. Diese erhöhte Kopplung macht es normalerweise einfacher, Fehler in das System einzuspritzen, wenn Änderungen vorgenommen werden, und es wird außerdem schwieriger, Fehler zu diagnostizieren und zu korrigieren. Diese zunehmende Kopplung kann auch die Anzahl der verfügbaren Optionen beim Durchführen von Änderungen reduzieren und den Aufwand für Änderungen erhöhen, da häufig die verschiedenen Module nachverfolgt werden müssen, die auch die globale Variable verwenden, um die Folgen von Änderungen zu ermitteln.

Der Zweck von encapsulation , das im Grunde das Gegenteil der Verwendung globaler Variablen ist, besteht darin, die Kopplung zu verringern, um das Verständnis und das Ändern der Quelle einfacher, sicherer und einfacher zu testen. Es ist viel einfacher, Unit Testing zu verwenden, wenn keine globalen Variablen verwendet werden. 

Wenn Sie beispielsweise über eine einfache globale Ganzzahlvariable verfügen, die als Aufzählungsindikator für verschiedene Komponenten als Zustandsmaschine verwendet wird, und Sie eine Änderung vornehmen, indem Sie einen neuen Status für eine neue Komponente hinzufügen, müssen Sie alle anderen durchlaufen Komponenten, um sicherzustellen, dass die Änderung sie nicht beeinflusst. Ein mögliches Problem wäre beispielsweise, wenn eine switch -Anweisung zum Testen des Werts der globalen Enumerationsvariablen mit case -Anweisungen für jeden der aktuellen Werte an verschiedenen Stellen verwendet wird der switch -Anweisungen haben keine default -Anweisung, um einen unerwarteten Wert für das Globale zu behandeln, und plötzlich haben Sie undefiniertes Verhalten, soweit die Anwendung betroffen ist.

Andererseits kann die Verwendung eines gemeinsam genutzten Datenbereichs dazu verwendet werden, einen Satz globaler Parameter zu enthalten, auf die in der gesamten Anwendung verwiesen wird. Dieser Ansatz wird häufig bei eingebetteten Anwendungen mit kleinen Speicherabdrücken verwendet.

Bei der Verwendung globaler Variablen in dieser Art von Anwendungen wird normalerweise die Verantwortung für das Schreiben in den Datenbereich einer einzelnen Komponente zugewiesen, und alle anderen Komponenten sehen den Bereich als --VARIABLE - und lesen diesen, lesen jedoch niemals in den Bereich. Durch diesen Ansatz werden die Probleme begrenzt, die sich entwickeln können.

Einige Probleme mit globalen Variablen, die umgangen werden müssen

Wenn die Quelle für eine globale Variable wie eine Struktur geändert wird, muss alles, was sie verwendet, neu kompiliert werden, damit alle Benutzer, die die Variable verwenden, ihre tatsächliche Größe und Speichervorlage kennen.

Wenn mehr als eine Komponente die globale Variable ändern kann, kann es zu Problemen mit inkonsistenten Daten in der globalen Variablen kommen. Bei einer Multithreading-Anwendung müssen Sie wahrscheinlich eine Art Sperren oder einen kritischen Bereich hinzufügen, um eine Möglichkeit bereitzustellen, dass jeweils nur ein Thread die globale Variable ändern kann. Wenn ein Thread die Variable ändert, sind alle Änderungen abgeschlossen und festgeschrieben, bevor andere Threads die Variable abfragen oder ändern können.

Das Debuggen einer Multithread-Anwendung, die eine globale Variable verwendet, kann schwieriger sein. Sie können auf Race-Bedingungen stoßen, die Fehler erzeugen können, die schwer zu replizieren sind. Mit mehreren Komponenten, die über eine globale Variable kommunizieren, insbesondere in einer Multithread-Anwendung, kann es sehr schwer zu verstehen sein, welche Komponente die Variable ändert, wann und wie sie die Variable ändert.

Namenskonflikte können ein Problem bei der Verwendung globaler Variablen sein. Eine lokale Variable, die denselben Namen wie eine globale Variable hat, kann die globale Variable ausblenden. Wenn Sie die Programmiersprache C verwenden, stoßen Sie auch auf das Problem mit der Namenskonvention. Um dies zu umgehen, teilen Sie das System in Subsysteme auf, wobei die globalen Variablen für ein bestimmtes Subsystem alle mit den ersten drei Buchstaben beginnen (siehe hierzu Auflösen von Namensraumkollisionen in Objective C ). C++ stellt Namespaces bereit, und mit C können Sie dies umgehen, indem Sie eine global sichtbare Struktur erstellen, deren Mitglieder verschiedene Datenelemente und Zeiger auf Daten und Funktionen sind, die in einer Datei als statisch bereitgestellt werden die global sichtbare Struktur.In einigen Fällen wird die ursprüngliche Anwendungsabsicht so geändert, dass globale Variablen, die den Status für einen einzelnen Thread angegeben haben, so geändert werden, dass mehrere doppelte Threads ausgeführt werden können. Ein Beispiel wäre eine einfache Anwendung, die für einen einzelnen Benutzer entwickelt wurde, der globale Variablen für den Status verwendet, und dann wird eine Anforderung vom Management herabgesetzt, um eine REST Schnittstelle hinzuzufügen, damit entfernte Anwendungen als virtuelle Benutzer fungieren können. Nun müssen Sie also die globalen Variablen und ihre Statusinformationen duplizieren, damit sowohl der Einzelbenutzer als auch jeder virtuelle Benutzer aus Remote-Anwendungen einen eigenen, eindeutigen Satz globaler Variablen hat.

Verwenden von C++ const und der namespace Technik für C.

Für die Programmiersprache C++ ist die Direktive struct eine große Hilfe, um die Wahrscheinlichkeit eines Namenskonflikts zu verringern. namespace zusammen mit namespace und den verschiedenen Zugriffsschlüsselwörtern (class, private und protected) stellen die meisten Werkzeuge bereit, die Sie zum Einkapseln von Variablen benötigen. Die Programmiersprache C enthält diese Anweisung jedoch nicht. Dieses stackoverflow-Posting, Namespaces in C , bietet einige Techniken für C.

Eine nützliche Technik besteht darin, einen einzigen speicherinternen Datenbereich zu haben, der als public definiert ist, der globale Sichtbarkeit hat, und innerhalb dieses --VARIABLE- sind Zeiger auf die verschiedenen globalen Variablen und Funktionen, die verfügbar sind. Die tatsächlichen Definitionen der globalen Variablen erhalten den Dateibereich mit dem Schlüsselwort struct. Wenn Sie dann mit dem Schlüsselwort struct angeben, welche schreibgeschützt sind, kann der Compiler Ihnen helfen, den schreibgeschützten Zugriff zu erzwingen.

Durch die Verwendung der static - Technik kann das Globale auch gekapselt werden, sodass es zu einer Art Paket oder Komponente wird, die zufällig ein globales Element ist. Mit einer solchen Komponente wird es einfacher, Änderungen zu verwalten, die sich auf das Globale und die Funktionalität auswirken.

Während die const oder die struct Technik dazu beitragen kann, Namenskonflikte zu bewältigen, bestehen die zugrunde liegenden Probleme der Kopplung von Komponenten, die die Verwendung von Globals insbesondere in einer modernen Multithread-Anwendung mit sich bringt, immer noch.

However while namespace or the struct technique can help manage name clashes, the underlying problems of inter-component coupling which the use of globals introduces especially in a modern multi-threaded application, still exist.

22

Ja, aber Sie verursachen keine Kosten für globale Variablen, bis Sie nicht mehr in dem Code arbeiten, der globale Variablen verwendet, und mit dem Schreiben von etwas anderem beginnen, der den Code verwendet, der globale Variablen verwendet. Aber die Kosten sind immer noch da.

Mit anderen Worten, es handelt sich um langfristige indirekte Kosten, und daher glauben die meisten Menschen, dass es nicht schlecht ist.

19
MSN

Wenn es möglich ist, dass Ihr Code während einer Supreme Court-Studie unter intensive Überprüfung landet, möchten Sie unbedingt globale Variablen vermeiden.

Siehe diesen Artikel: Fehlerhafter Alkoholtester-Code spiegelt die Wichtigkeit der Quellenüberprüfung wider

Es gab einige Probleme mit der Stil des identifizierten Codes von beiden Studien. Eine der stilistischen Fragen, die die Rezensenten betrafen. war die umfassende Verwendung von ungeschützt globale Variablen. Dies wird als .__ betrachtet. schlechte Form, weil es die .__ erhöht. Gefahr, dass der Programmzustand inkonsistent werden oder diese Werte wird versehentlich geändert oder überschrieben Die Forscher auch äußerte sich besorgt über die Tatsache diese Dezimalgenauigkeit ist nicht konsistent im gesamten Code.

Mann, ich wette, die Entwickler wünschen, sie hätten keine globalen Variablen verwendet!

18
Casey

Ich würde diese Frage mit einer anderen Frage beantworten: Verwenden Sie Singletons / Sind Singletons schlecht? 

Weil (fast alle) Singelton-Verwendung eine verherrlichte globale Variable ist.

18
Gavin Miller

Globale Variablen sind genauso schlecht wie Sie, nicht weniger.

Wenn Sie ein vollständig gekapseltes Programm erstellen, können Sie Globals verwenden. Es ist eine "Sünde", Globals zu verwenden, aber das Programmieren von Sünden ist größtenteils philosophisch.

Wenn Sie L.in.oleum auschecken, sehen Sie eine Sprache, deren Variablen ausschließlich global sind. Es ist nicht skalierbar, weil Bibliotheken keine andere Wahl haben, als globale Werte zu verwenden.

Wenn Sie jedoch die Wahl haben und die Programmierer-Philosophie ignorieren können, sind Globals nicht allzu schlecht.

Gotos auch nicht, wenn Sie sie richtig verwenden.

Das große "schlechte" Problem ist, dass, wenn man sie falsch verwendet, die Leute schreien, der Marslander abstürzt und die Welt explodiert ... oder so ähnlich.

17
user54650

Wie jemand sagte (ich paraphrasiere) in einem anderen Thread: "Regeln wie diese sollten nicht gebrochen werden, bis Sie die Konsequenzen davon vollständig verstanden haben." 

Es gibt Zeiten, in denen globale Variablen notwendig oder zumindest sehr hilfreich sind (z. B. mit systemdefinierten Rückrufen). Andererseits sind sie aus allen Gründen, die Ihnen gesagt wurden, sehr gefährlich. 

Es gibt viele Aspekte der Programmierung, die wahrscheinlich den Experten überlassen werden sollten. Manchmal BRAUCHT man ein sehr scharfes Messer. Aber du kannst nicht eins benutzen, bis du bereit bist ...

11
Brian Postow

Das Problem ist weniger, dass es sich um schlecht handelt, sondern eher um gefährlich. Sie haben ihre eigenen Vor- und Nachteile, und es gibt Situationen, in denen sie entweder die effizienteste sind oder nur eine bestimmte Aufgabe lösen können. Sie sind jedoch sehr leicht zu missbrauchen, auch wenn Sie Schritte unternehmen, um sie immer ordnungsgemäß zu verwenden.

Ein paar Profis:

  • Kann von jeder Funktion aus aufgerufen werden.
  • Kann von mehreren Threads aus aufgerufen werden.
  • Wird niemals den Bereich verlassen, bis das Programm endet.

Ein paar Nachteile:

  • Zugriff von jeder Funktion aus, ohne explizit als Parameter eingezogen und/oder dokumentiert zu werden.
  • Nicht fadensicher.
  • Verschmutzt den globalen Namensraum und führt möglicherweise zu Namenskollisionen, sofern dies nicht verhindert wird.

Wenn Sie so wollen, beachten Sie, dass die ersten beiden Profis und die ersten beiden Nachteile, die ich aufgeführt habe, genau dasselbe sind, nur mit einem anderen Wortlaut. Dies liegt daran, dass die Features einer globalen Variablen zwar nützlich sein können, aber genau die Features, die sie nützlich machen, sind die Ursache all ihrer Probleme.

Einige mögliche Lösungen für einige Probleme:

  • Überlegen Sie, ob sie tatsächlich die beste oder effizienteste Lösung für das Problem sind. Wenn es beliebige bessere Lösungen gibt, verwenden Sie diese stattdessen.
  • Setzen Sie sie in einen Namespace [C++] oder in eine Singleton-Struktur [C, C++] mit einem eindeutigen Namen (ein gutes Beispiel wäre Globals oder GlobalVars), oder verwenden Sie eine standardisierte Namenskonvention für globale Variablen (wie global_[name] oder g_module_varNameStyle (wie von Underscore_d in den Kommentaren)). Dies wird sowohl ihre Verwendung dokumentieren (Sie können Code finden, der globale Variablen verwendet, indem Sie nach dem Namensraum-/Strukturnamen suchen) und die Auswirkungen auf den globalen Namensraum minimieren.
  • Für jede Funktion, die auf globale Variablen zugreift, dokumentieren Sie explizit, welche Variablen sie lesen und welche sie schreiben. Dies erleichtert die Fehlerbehebung.
  • Legen Sie sie in einer eigenen Quelldatei ab und deklarieren Sie sie im zugehörigen Header als extern, sodass sie nur für Kompilierungseinheiten verwendet werden können, die auf sie zugreifen müssen. Wenn Ihr Code von vielen globalen Variablen abhängt, aber jede Kompilierungseinheit nur Zugriff auf eine Handvoll von ihnen benötigt, können Sie sie in mehrere Quelldateien sortieren. So können Sie den Zugriff jeder Datei auf globale Variablen einfacher einschränken.
  • Richten Sie einen Mechanismus ein, um sie zu sperren und zu entsperren, und/oder entwerfen Sie Ihren Code so, dass möglichst wenige Funktionen tatsächlich modify globale Variablen benötigen. Das Lesen ist viel sicherer als das Schreiben, obwohl Thread-Races in Multithread-Programmen immer noch Probleme verursachen können.
  • Minimieren Sie im Grunde den Zugriff auf sie und maximieren Sie die Eindeutigkeit der Namen. Sie möchten Namenskollisionen vermeiden und haben so wenige Funktionen wie möglich, die eine bestimmte Variable möglicherweise ändern können.

Ob sie gut oder schlecht sind, hängt davon ab, wie Sie sie verwenden. Die Mehrheit neigt dazu, sie schlecht zu gebrauchen, daher die allgemeine Vorsicht gegenüber ihnen. Bei richtiger Anwendung können sie ein großer Segen sein. Wenn sie schlecht eingesetzt werden, können sie und will zurückkommen, um Sie zu beißen, wann und wie Sie es am wenigsten erwarten.

Eine gute Sichtweise ist, dass sie selbst nicht schlecht sind, aber sie ermöglichen schlechtes Design und können die Auswirkungen von schlechtem Design exponentiell vervielfachen.


Selbst wenn Sie nicht beabsichtigen, sie zu verwenden, ist es besser zu wissen, wie man sie sicher verwendet, und entscheiden Sie sich dafür, sie nicht zu verwenden, als sie nicht zu verwenden, weil Sie nicht wissen, wie sie sicher verwendet werden sollen. Wenn Sie sich jemals in einer Situation befinden, in der Sie bereits vorhandenen Code, der auf globalen Variablen basiert, verwalten müssen, kann es zu Schwierigkeiten kommen, wenn Sie nicht wissen, wie er sie richtig verwendet.

9
Justin Time

Globale Variablen sind im Allgemeinen schlecht, insbesondere wenn andere Personen mit demselben Code arbeiten und nicht 20 Minuten lang nach allen Stellen suchen möchten, auf die die Variable referenziert wird. Durch das Hinzufügen von Threads, die die Variablen ändern, entstehen neue Kopfschmerzen.

Globale Konstanten in einem anonymen Namespace, die in einer einzigen Übersetzungseinheit verwendet werden, sind in professionellen Apps und Bibliotheken allgegenwärtig und allgegenwärtig. Wenn die Daten jedoch veränderbar sind und/oder sie von mehreren TUs gemeinsam genutzt werden müssen, möchten Sie sie möglicherweise kapseln. Wenn dies nicht aus Designgründen der Fall ist, sollte dies aus Gründen des Debugging oder der Arbeit mit Ihrem Code erfolgen.

9
Michel

Die Verwendung globaler Variablen ist wie eine Art Schmutzfeger unter einem Teppich. Es ist eine schnelle Lösung und kurzfristig viel einfacher als eine Staubwanne oder einen Staubsauger, um sie zu reinigen. Wenn Sie den Teppich jedoch später einmal bewegen, wird eine Überraschung durcheinander geraten.

8
gnovice

Globale Variablen sind fehlerhaft, wenn Sie damit Aspekte eines Programms manipulieren können, die nur lokal geändert werden sollten. In OOP stehen Globals häufig in Konflikt mit der Einkapselungsidee.

7
Leonidas

Absolut nicht. Sie missbrauchen, aber das ist schlimm.

Unbeabsichtigtes Entfernen um der willen ist nur das ... geistlos. Wenn Sie nicht die Vor- und Nachteile kennen, ist es am besten, klar zu steuern und das zu tun, was Sie gelernt/gelernt haben, aber mit globalen Variablen ist nichts implizit falsch. Wenn Sie die Vor- und Nachteile verstehen, sollten Sie Ihre eigene Entscheidung treffen.

7
jheriko

Ich glaube, Ihr Professor versucht, eine schlechte Angewohnheit aufzuhalten, bevor sie überhaupt beginnt. 

Globale Variablen haben ihren Platz und wie viele Leute sagten, zu wissen, wo und wann sie verwendet werden, kann kompliziert sein. Ich denke also, anstatt sich auf das Warum, Wie, Wann und Wo der globalen Variablen zu konzentrieren, die Ihr Professor beschlossen hat, einfach zu verbieten. Wer weiß, er könnte sie in Zukunft aufheben.

7
bong

Globale Variablen sind in kleinen Programmen gut, aber schrecklich, wenn sie in großen Programmen gleich verwendet werden.

Dies bedeutet, dass Sie sich leicht daran gewöhnen können, sie während des Lernens zu verwenden. Davor versucht Ihr Professor Sie zu schützen.

Wenn Sie mehr Erfahrung haben, ist es einfacher zu lernen, wenn es ihnen gut geht.

4
Darron

Ja, denn wenn Sie inkompetente Programmierer verwenden lassen (lesen Sie 90%, vor allem Wissenschaftler), erhalten Sie 600 globale Variablen, die sich auf über 20 Dateien verteilen, und ein Projekt mit 12.000 Zeilen, in dem 80% der Funktionen ungültig werden, zurückkehren und funktionieren ganz auf den globalen Staat. 

Es ist schnell unmöglich zu verstehen, was an einem bestimmten Punkt passiert, wenn Sie nicht das gesamte Projekt kennen.

3
wezzman

Nein, sie sind überhaupt nicht schlecht. Sie müssen sich den vom Compiler erzeugten (Maschinen-) Code ansehen, um diese Feststellung zu treffen. Manchmal ist die Verwendung eines lokalen Codes weitaus schlechter als ein globaler Code. Beachten Sie auch, dass das Setzen von "statisch" für eine lokale Variable im Grunde genommen ein globales Element ist (und andere hässliche Probleme verursacht, die ein reales globales Problem lösen würde). "local globals" sind besonders schlecht.

Globals geben Ihnen auch die Kontrolle über Ihre Speichernutzung, was bei Einheimischen weitaus schwieriger ist. Heutzutage ist dies nur in eingebetteten Umgebungen von Bedeutung, in denen der Speicher ziemlich begrenzt ist. Bevor Sie davon ausgehen, dass Embedded dasselbe ist wie in anderen Umgebungen, gehen Sie davon aus, dass die Programmierregeln überall gleich sind.

Es ist gut, dass Sie die Regeln, die unterrichtet werden, in Frage stellen, die meisten sind nicht aus den Gründen, die Ihnen gesagt werden. Die wichtigste Lektion ist jedoch nicht, dass dies eine Regel ist, die Sie für immer bei sich tragen müssen, aber dies ist eine Regel, die erforderlich ist, um diese Klasse zu bestehen und vorwärts zu kommen. Im Leben werden Sie feststellen, dass Sie für die Firma XYZ andere Programmierregeln haben, die Sie am Ende einhalten müssen, um einen Gehaltsscheck zu erhalten. In beiden Situationen können Sie die Regel bestreiten, aber ich denke, Sie werden an einem Arbeitsplatz viel mehr Glück haben als in der Schule. Sie sind nur einer von vielen Studenten, Ihr Platz wird bald ersetzt, die Professoren nicht, bei einem Job gehören Sie zu einem kleinen Team von Spielern, die dieses Produkt bis zum Ende sehen müssen, und in diesem Umfeld sind die entwickelten Regeln für die Nutzen Sie die Teammitglieder sowie das Produkt und das Unternehmen. Wenn also alle gleichgesinnt sind oder wenn für das jeweilige Produkt ein guter Grund besteht, etwas zu verletzen, das Sie in der Schule gelernt haben, oder ein Buch über generische Programmierung, dann verkaufen Sie Ihre Idee das Team und notieren Sie es als eine gültige, wenn nicht die bevorzugte Methode. Alles ist faires Spiel in der realen Welt.

Wenn Sie alle Programmierregeln befolgen, die Ihnen in der Schule oder in Büchern vermittelt werden, ist Ihre Programmierlaufbahn äußerst begrenzt. Sie können wahrscheinlich überleben und eine erfolgreiche Karriere machen, aber die Breite und Breite der für Sie verfügbaren Umgebungen wird äußerst begrenzt sein. Wenn Sie wissen, wie und warum die Regel vorhanden ist und sie verteidigen kann, ist das gut, wenn Sie nur einen Grund dafür haben, "weil mein Lehrer das gesagt hat". Nun, das ist nicht so gut. 

Beachten Sie, dass Themen wie diese häufig am Arbeitsplatz diskutiert werden und auch in Zukunft so sein werden. Wenn Compiler und Prozessoren (und Sprachen) sich weiterentwickeln, müssen Sie diese Art von Regeln anwenden, ohne Ihre Position zu verteidigen und möglicherweise eine Lektion von jemandem mit einer anderen Meinung zu lernen vorwärts gehen 

In der Zwischenzeit tun Sie einfach das, was am lautesten spricht oder den größten Stock trägt (bis zu dem Zeitpunkt, an dem Sie derjenige sind, der am lautesten schreit und den größten Stick trägt).

3
old_timer

Die Verwendung von Globale Variablen hängt tatsächlich von den Anforderungen ab. Sein Vorteil ist, dass der Aufwand für die wiederholte Übergabe der Werte reduziert wird.

Ihr Professor hat jedoch Recht, weil er Sicherheitsprobleme auslöst, sodass die Verwendung globaler Variablen so weit wie möglich vermieden werden sollte. Globale Variablen verursachen auch Probleme, die manchmal schwer zu debuggen sind. 

Zum Beispiel:- 

Situationen, in denen die Variablenwerte geändert auf Laufzeit abgerufen werden. In diesem Moment ist es schwer zu erkennen, welcher Teil des Codes ihn unter welchen Bedingungen modifiziert.

2
Mufaddal Kagda

Ich möchte gegen den Punkt, der in diesem Thread gemacht wird, argumentieren, dass Multi-Threading per se schwieriger oder unmöglicher wird. Globale Variablen sind gemeinsame Zustände, aber die Alternativen zu Globalen (z. B. Weitergeben von Zeigern) können auch den Zustand teilen. Das Problem beim Multithreading ist, wie der gemeinsam genutzte Status richtig verwendet wird, und nicht, ob dieser Status durch eine globale Variable oder etwas anderes gemeinsam genutzt wird.

Meistens müssen Sie beim Multithreading etwas teilen. In einem Produzenten-Consumer-Muster können Sie beispielsweise eine Thread-sichere Warteschlange mit den Arbeitseinheiten gemeinsam nutzen. Sie dürfen es freigeben, da diese Datenstruktur Thread-sicher ist. Ob diese Warteschlange global ist oder nicht, ist für die Thread-Sicherheit völlig unerheblich.

Die implizierte Hoffnung, die in diesem Thread zum Ausdruck gebracht wird, ist, dass die Umwandlung eines Programms von Single-Threaded zu Multi-Threading einfacher ist, wenn keine Globals verwendet werden. Ja, Globals machen es einfacher, sich in den Fuß zu schießen, aber es gibt viele Möglichkeiten, sich selbst zu erschießen.

Ich befürworte keine globalen Variablen, da die anderen Punkte immer noch bestehen. Mein Punkt ist lediglich, dass die Anzahl der Threads in einem Programm nichts mit dem Gültigkeitsbereich der Variablen zu tun hat.

2

Normalerweise verwende ich Globals für Werte, die selten geändert werden, wie z. B. Singletons oder Funktionszeiger auf Funktionen in dynamisch geladenen Bibliotheken. Die Verwendung von veränderlichen Globals in Multithread-Anwendungen führt dazu, dass der Fehler schwer zu verfolgen ist. Ich versuche daher, dies in der Regel zu vermeiden.

Die Verwendung eines globalen Befehls anstelle eines Argumentes ist häufig schneller. Wenn Sie jedoch eine Multithread-Anwendung schreiben, die Sie heutzutage häufig verwenden, funktioniert sie normalerweise nicht sehr gut (Sie können Thread-Statik verwenden, aber der Leistungsgewinn ist fraglich) .

1
Erik Ohlsson

Am Ende des Tages kann Ihr Programm oder Ihre App immer noch funktionieren, aber es ist eine Frage des Ordens und des vollständigen Verständnisses der Vorgänge. Wenn Sie einen variablen Wert unter allen Funktionen teilen, kann es schwierig werden, zu verfolgen, welche Funktion den Wert ändert (wenn die Funktion dies tut) und das Debuggen eine Million Mal schwieriger macht

1
alaboudi

Global sind gut, wenn es um Konfiguration geht . Wenn wir möchten, dass unsereconfiguration/changeseinen globalen Einfluss auf das gesamte Projekt haben. 

Wir können also one configuration ändern und die changes werden an gesamtes Projekt gerichtet. Aber ich muss warnen, dass Sie sehr klug sein müssen, um Globals zu verwenden. 

1
Maaz Rehman

Früher oder später müssen Sie ändern, wie diese Variable festgelegt wird oder was geschieht, wenn auf sie zugegriffen wird, oder Sie müssen nur nachsehen, wo sie geändert wird.

Es ist praktisch immer besser, keine globalen Variablen zu haben. Schreiben Sie einfach die Methoden für die Mutter und holen Sie sie ab, und seien Sie Sie dran, wenn Sie sie einen Tag, eine Woche oder einen Monat später brauchen.

1
Bloodboiler

In Webanwendungen innerhalb eines Unternehmens können aus Optimierungsgründen sitzungs-/fenster-/thread-/benutzerspezifische Daten auf dem Server abgelegt werden, um bei Arbeitsstörungen vor instabilen Verbindungen zu schützen. Wie erwähnt, müssen Rennbedingungen behandelt werden. Wir verwenden für diese Informationen eine einzige Instanz einer Klasse, die sorgfältig verwaltet wird. 

0
xxyzzy

sicherheit bedeutet weniger, dass jeder die Variablen manipulieren kann, wenn sie als global deklariert sind. Um dies zu erläutern, nehmen Sie dieses Beispiel, wenn Sie ein Guthaben als globale Variable in Ihrem Bankprogramm haben. Die Benutzerfunktion kann dies ebenso wie der Bankangestellte manipulieren Dies ist also ein Problem. Nur dem Benutzer sollte die Funktion "Nur lesen" und "Abheben" zugewiesen werden. Der Bankangestellte kann jedoch den Betrag addieren, wenn der Benutzer das Bargeld persönlich an den Schreibtisch gibt. Dies ist die Funktionsweise

0