Warum sind globale Variablen in einer eingebetteten Anwendung ohne Betriebssystem schlecht?

Lesezeit: 8 Minuten

Benutzeravatar von loneRanger
einsamRanger

Die meisten Einwände, die ich gegen die Verwendung globaler Variablen sehe, sind sinnvoll, da sie sich auf Probleme mit mehreren Threads, Threadsicherheit usw. beziehen.

Aber welche Einwände haben Sie in einem kleinen Fall ohne Betriebssystem mit einem einzelnen Thread? In meinem Fall schreibe ich mein eingebettetes System in “C”, falls es darauf ankommt. Ich bin auch der einzige Entwickler des Produkts.

Warum würde das Eliminieren globaler Variablen meinen Code verbessern?

(Nachdem ich mehrere Antworten gelesen habe, ist mir klar, dass ich auch hätte darauf hinweisen sollen, dass dieses System keine dynamische Speicherzuweisung hat (z. B. malloc). Der gesamte Speicher wird zur Kompilierzeit statisch zugewiesen.)

Es würde nicht.

Die beiden grundlegenden Probleme mit globalen Variablen sind einfach das Überladen des Namensraums und die Tatsache, dass “niemand” die “Kontrolle” über sie hat (daher die möglichen Kollisionen und Konflikte mit mehreren Threads).

Das „Globals are bad“ ist wie so ziemlich jede andere Computerprogrammiersprache eine Richtlinie, keine feste Regel. Wenn diese Art von “Regeln” erstellt wird, ist es am besten, die Regel nicht einfach auswendig zu übernehmen, um die Umstände und Motivationen hinter der Erstellung der Regel zu verstehen. Nimm sie nicht einfach blind.

In Ihrem Fall scheinen Sie die Art Ihres Systems und die Argumente rund um die Regel zu verstehen und haben entschieden, dass sie in diesem Fall nicht zutrifft. Du hast recht, das tut es nicht.

Machen Sie sich also keine Sorgen.

  • Ich freue mich über die vielen Kommentare und Antworten. Ich habe dies als meine Antwort ausgewählt, weil es meine Begründung am deutlichsten zusammenfasst. Ich fühle mich „lustig“, eine Antwort zu wählen, die meine Designentscheidungen bestätigt, aber hey, ich denke, ich werde es trotzdem tun.

    – einsamerRanger

    20. Mai 2009 um 1:53 Uhr

  • Dies ist eine der besten Antworten, die ich je auf dieser Seite gelesen habe.

    – Elli

    30. Juli 2015 um 17:11 Uhr

Globale Variablen sind nicht unbedingt schlecht, genauso wie Makros nicht unbedingt schlecht sind und angereichertes Uran nicht unbedingt schlecht ist. Solange Sie eine bewusste Entscheidung über die Vor- und Nachteile einer bestimmten Designwahl treffen, sollten Sie in Ordnung sein.

Einige der Argumente gegen globale Variablen sind:

  1. Sie verstoßen gegen gutes objektorientiertes Design
  2. Sie erschweren das Unit-Testen Ihres Codes, da Sie einzelne Codeblöcke nicht testen können, ohne alle globalen Variablen einzurichten, die der Code erwartet
  3. Sie erhöhen die Kopplung in Ihrem Code: Aktionen in einem Codeblock können sich über eine gemeinsam genutzte globale Variable auf unvorhersehbare Weise auf Dinge in einem anderen Codeblock auswirken

Einige der Argumentanten zum globale Variablen:

  1. Sie erleichtern die gemeinsame Nutzung einer einzelnen Ressource durch viele Funktionen
  2. Sie können Code leichter lesbar machen

Wenn in Ihrem Design globale Variablen sinnvoll sind und verwendet werden können, um Ihren Code einfacher lesbar oder wartungsfreundlicher zu machen, ohne sich auf zufällige Fehler und Kopfschmerzen beim Testen einzulassen, dann verwenden Sie sie auf jeden Fall.

Ich schreibe viel C-Code für eingebettete Mikrocontroller und verwende ständig globale Variablen. In solch einem starren System machen globale Variablen Sinn. Ich bin mir der möglichen Nachteile bewusst, aber ich habe die Vor- und Nachteile analysiert und schreibe meinen Code so, dass er sich vor den größten Fallstricken schützt.

Fazit: Es gibt keine feste Regel. Treffen Sie einfach die beste Entscheidung für Ihr spezielles Projekt oder Ihre Plattform, basierend auf den besten Informationen, die Sie haben.

  • Einverstanden. Wie so viele “Regeln” in Software (insbesondere C) gibt es Zeiten, in denen die Situation es erfordert, dass sie verbogen oder gebrochen werden. Ich versuche, Globals so weit wie möglich zu vermeiden, aber es gibt eine kleine Anzahl von Gelegenheiten, in denen sie die beste Lösung für ein Problem sind.

    – Steve Melnikoff

    17. Mai 2009 um 15:33 Uhr

  • globale Variablen können den Code auch schwieriger lesbar machen … und meiner Meinung nach ist das wahrscheinlicher.

    – Smerlin

    18. Juli 2010 um 12:57 Uhr

Hier ist ein guter Artikel, der Grund gibt Warum globale Variablen schlecht sind

Warum sollten globale Variablen vermieden werden, wenn sie unnötig sind?

Nicht-Lokalität – Der Quellcode ist am einfachsten zu verstehen, wenn der Umfang seiner einzelnen Elemente begrenzt ist. Globale Variablen können von jedem Teil des Programms gelesen oder geändert werden, was es schwierig macht, sich an jede mögliche Verwendung zu erinnern oder darüber nachzudenken. Keine Zugriffskontrolle oder Einschränkungsprüfung – Eine globale Variable kann von jedem Teil des Programms abgerufen oder gesetzt werden, und alle Regeln bezüglich ihrer Verwendung können leicht gebrochen oder vergessen werden.

Implizite Kopplung – Ein Programm mit vielen globalen Variablen hat oft enge Kopplungen zwischen einigen dieser Variablen und Kopplungen zwischen Variablen und Funktionen. Das Gruppieren gekoppelter Elemente zu zusammenhängenden Einheiten führt normalerweise zu besseren Programmen.

Probleme bei der Speicherzuweisung — Einige Umgebungen haben Speicherzuweisungsschemata, die die Zuweisung von Globals schwierig machen. Dies gilt insbesondere für Sprachen, in denen “Konstruktoren” andere Nebeneffekte als die Zuordnung haben (weil Sie in diesem Fall unsichere Situationen ausdrücken können, in denen zwei globale Werte voneinander abhängen). Außerdem kann es beim dynamischen Linken von Modulen unklar sein, ob verschiedene Bibliotheken ihre eigenen Instanzen von Globals haben oder ob die Globals gemeinsam genutzt werden.

Testen und Confinement – Quelle, die Globals verwendet, ist etwas schwieriger zu testen, da man zwischen den Läufen nicht ohne weiteres eine “saubere” Umgebung einrichten kann. Allgemeiner gesagt ist es aus dem gleichen Grund schwierig, eine Quelle zu testen, die globale Dienste jeglicher Art verwendet, die dieser Quelle nicht explizit bereitgestellt werden.

Das Hinzufügen von Globals ist wirklich einfach. Es ist leicht, sich daran zu gewöhnen, sie zu deklarieren. Das geht viel schneller, als an ein gutes Design zu denken.

Globale Variablen sind nicht so schlimm, wie Sie vielleicht denken, sie sollten nur vermieden werden, wenn sie unnötig sind. Globale Variablen können eine gute Verwendung für eine Variable haben, die im gesamten Programm verwendet wird. Denken Sie daran, dass Sie immer im Auge behalten müssen, wo diese Variable Änderungen vornimmt. aber für Variablen, die dazu neigen, nur in begrenzten Teilen des Programms verwendet zu werden, ist es ein guter Grund, es nicht global zu haben.

  • Globale Werte können nur von Modulen gesehen werden, die das Modul enthalten, in dem sie definiert sind. Nach dieser Logik könnte man öffentliche und geschützte Felder verbieten, da jeder durch Vererbung Zugriff darauf erhalten kann.

    – Marco van de Voort

    17. Mai 2009 um 22:01 Uhr

Weil es die Kopplung minimiert. Ihr System mag jetzt klein sein, aber wenn Sie weiterarbeiten, kann es sich herausstellen, dass es das nicht ist.

Globale Variablen sind in einer kleinen eingebetteten Anwendung, die in C geschrieben ist, erforderlich. Beispielsweise müssen Sie eine globale Variable verwenden, um Informationen zwischen einer Interrupt-Service-Routine und einem anderen Modul zu übertragen. Dies sind einige Tipps, die Ihnen helfen werden, globale Variablen in eingebetteten Anwendungen effektiv zu nutzen:

  • Unterscheiden Sie zwischen statischen Variablen und globalen Variablen. Statische Variablen können von allen Funktionen in derselben C-Datei verwendet werden. Sie sind das Äquivalent zu privaten Membern in einer C++-Klasse. In C müssen Sie die Arbeit des Compilers selbst erledigen. Verwenden Sie das Schlüsselwort static, um eine versehentliche Verwendung der Variablen außerhalb des Moduls zu vermeiden und ihren Geltungsbereich deutlich zu machen. Möglicherweise möchten Sie der Variablen den Namen des Moduls voranstellen.

  • Befolgen Sie eine Namenskonvention für globale Variablen (die von vielen C-Dateien verwendet werden). Machen Sie deutlich, dass sie global sind.

  • Wenn Sie viele globale Variablen benötigen, ziehen Sie in Betracht, sie in einer Struktur zu bündeln.

  • Verwenden Sie bei Bedarf das Schlüsselwort volatile. Dies wird benötigt, wenn eine globale Variable von einem ISR modifiziert wird.

  • Tolle Ergänzung zur Hauptantwort!

    – Für immer Lernen

    23. August 2018 um 17:59 Uhr

Code, der globale Variablen verwendet, ist schwieriger zu warten. Da der Betreuer jede Verwendung der Variablen im System finden muss, bevor er genau wissen kann, was die Variable tut. Da dies die Wartung verlangsamt, sollte dies so weit wie möglich vermieden werden. Das ist es`

  • Tolle Ergänzung zur Hauptantwort!

    – Für immer Lernen

    23. August 2018 um 17:59 Uhr

Benutzeravatar von John Christman
Johannes Christmann

Es ist eine Frage des Umfangs. Wir haben Entwickler, die es lieben, globale Variablen zu erstellen, um lokale Konzepte umzusetzen. Es macht die Verwendung dieser Variablen viel schwieriger, den Überblick zu behalten, sodass es einfacher ist, Fehler bei der Verwendung zu machen.

Sie können Ihre Brieftasche auch auf Ihrer Veranda aufbewahren, aber dann haben Sie weitaus weniger Kontrolle darüber, wer darauf zugreift.

Abgesehen davon gibt es einige gültige Verwendungen für globale Variablen, aber wie jede andere Regel, die es wert ist, befolgt zu werden. Dies ist die Ausnahme, nicht der Normalfall. Ihre sehr vorhandenen weist darauf hin, dass sie einen Nutzen haben.

Wenn Sie sich entscheiden, eine globale Variable zu verwenden, versuchen Sie, sie gut zu kommentieren und ihnen gute Namen zu geben. Es stört mich wirklich, wenn Leute globale Variablen wie “bool bIsFound;” erstellen.

Wir legen Wert darauf, jede neue globale Variable in der Codeüberprüfung zu bewerten und zu prüfen, ob es einen besseren Ansatz gibt.

1388480cookie-checkWarum sind globale Variablen in einer eingebetteten Anwendung ohne Betriebssystem schlecht?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy