Wie speichere ich Daten die jederzeit benötige? Warum soll man keine Public Variablen nutzen?

  • Allgemein

Es gibt 31 Antworten in diesem Thema. Der letzte Beitrag () ist von Artentus.

    Wie speichere ich Daten die jederzeit benötige? Warum soll man keine Public Variablen nutzen?

    Hallo zusammen,
    Ich bin kein Profi Programmierer.
    Bis jetzt habe ich in VB sehr gerne Globale (VB Public) Variablen benutzt.
    Ich habe Sensoren die ich auslese. Diese Daten habe ich gerne in ein Public Array gespeichert.
    Da ich die Daten später an anderer Stelle benötige um Sie grafisch darzustellen zu können.
    Ich habe mich immer für eine Public Variable entschieden.
    Doch das ist ja anscheinend sehr verpönt. Aber warum eigentlich?
    Wenn ich Daten habe auf die ich immer zugreifen will ist das für mich logisch sie Public zu speichern.
    Jetzt wollte mit einer neuen Sprache (C#) anfangen.
    Im C# Buch steht da schon wieder das man das nicht machen soll. Es steht wie immer keine Begründung da.
    Eine alternative steht da auch nicht.
    Wie speichere ich Daten die jederzeit benötige?

    Sara
    Ich würde eine zentrale static (in VB wäre das Shared) Klasse machen:

    C#-Quellcode

    1. public static class GlobalValues
    2. {
    3. public static int SomeValue { get; set; }
    4. //...
    5. }


    Da kannst du dann jederzeit mit ​GlobalValues.SomeValue drauf zugreifen.
    Dieses Codebeispiel ist der Inbegriff einer globalen Variablen, globaler gehts in C# gar nicht. Solche Konstrukte sind nur in den seltensten Fällen wirklich notwendig und weisen auf eine Architektur hin, die lediglich eine bessere Lösung nicht tragen kann.
    Globale Variablen sind ein Verstoß gegen das Kapslungsprinzip der objektorientierten Programmierung. In einer Sprache wie C# sollten keine Variablen zusammenhangslos im Programm rumfliegen, sie werden durch Eigenschaften von Objekten ersetzt, und diese Objekte müssen so miteinander kommunizieren, dass alle Informationen dort landen, wie sie gebraucht werden. Ja nachdem, um was für eine Anwendung es sich handelt, gibt es unterschiedliche Modelle, dies umzusetzen.

    Edit: Global heißt übrigens nicht public, public ist eine mehr als valide Zugriffsstufe auch für die Interobjektkommunikation, ohne public gehts gar nichts. Der Zugriff von public-Membern wird auf anderer Ebene, nämlich durch die Abhängigkeit der einzelnen Objekte voneinander, indirekt geregelt.
    @Artentus
    In einem simplen WinForms-Programm find ich das akzeptabel: Anstatt dass man sich extra eine ganze Architektur drumherum bauen muss, kann man einfach alles zentral regeln.
    Hallo Counterbug,
    das man Aufgaben trennt leuchtet mir ein.
    Was ist aber mit Daten. Die will ich ja nicht trennen.
    Nehmen wir an ich möchte über einen bestimmten Zeitraum Temperatur, Luftdruck u.s.w. in regelmäßigen Abständen messen.
    Dann habe ich jede Menge Daten. Wie speichere ich diese dann in meinem Programm? Nach meinem logischen Verständnis Global.
    Bis jetzt war es bei mir so, egal was für ein Programm ich geschrieben, ich habe immer Daten die ich immer wieder benötige.
    Und dann lese ich immer wieder in Büchern das man das nicht machen soll.

    Grüße Sara
    Kann man, mans kanns aber auch gleich ordentlich angehen und die Übung mitnehmen, auch wenn der Code dann etwas aufgeblasener wirkt.Sich solche Denkweisen anzueignen ist kein Kinderspiel, sich erst damit auseinanderzusetzen, wenn es zwingend notwendig wird, kann einem dann einen Haufen extra Arbeit bescheren.

    Sara schrieb:

    über einen bestimmten Zeitraum Temperatur, Luftdruck u.s.w. in regelmäßigen Abständen messen
    DatasetOnly: DB-Programmierung ohne Datenbank
    Daten laden, speichern, verarbeiten - einfachste Variante
    die vier Views auf Video
    Hallo Artentus,
    also wenn ich meinem Beispiel bleibe.
    Ich speichere die Daten auch auf der Festplatte.
    Dazu nutze ich das XML Format.
    Aufbau
    <Messwerte>
    <ort>
    <zeit>
    <temperatur>
    <luftdruck>
    </zeit>
    <zeit>
    <temperatur>
    <luftdruck>
    </zeit>
    </ort>
    .....
    So wie ich das verstehe soll ich die Daten in einem eigenen Objekt speichern.
    In einem Objekt ähnlich wie die XML Datei aufgebaut ist.
    Ein Messwert hat einen Ort der Messung. Zu einer bestimmten Zeit. Und dann die Werte selber.
    Oder verstehe ich das falsch?

    Grüße Sara
    Schau dir doch mal die Links in Ruhe an. Die Erstellung aller nötigen Klassen wird dir quasi optimal abgenommen, und Speichern und Laden aus XML übernimmt auch eine fertige Lösung.
    Die Sachen sind ja extra da, um den Programmierer vom Entwerfen einer aufwändigen Architektur zu entlasten. Man hat in ein paar Mausklicks auf einer rein graphischen Oberfläche eine bessere Architektur erstellt, als es so mancher "Profi" hier manuell mit viel Aufwand hinbekommen würde.

    Sara schrieb:

    Hallo zusammen,
    Ich bin kein Profi Programmierer.
    Bis jetzt habe ich in VB sehr gerne Globale (VB Public) Variablen benutzt.
    Ich habe Sensoren die ich auslese. Diese Daten habe ich gerne in ein Public Array gespeichert.
    Da ich die Daten später an anderer Stelle benötige um Sie grafisch darzustellen zu können.
    Ich habe mich immer für eine Public Variable entschieden.
    Doch das ist ja anscheinend sehr verpönt. Aber warum eigentlich?
    Wenn ich Daten habe auf die ich immer zugreifen will ist das für mich logisch sie Public zu speichern.
    Sara


    Das hat nichts mit der verwendeten Sprache zu tun, sondern hierbei dreht es sich um Grundlagen der objektorientierten Programmierung. Klar sollst du keine öffentlich sichtbaren Attribute verwenden, denn das widerspricht dem Schema der Kapselung innerhalb der objektorientierten Programmierung.

    Wenn man wirklich sauber programmieren möchte, so setzt man Attribute als private oder protected (abhängig vom Anwendungsfall) und stellt für die notwendigen Attribute Getter und Setter-Methoden zur Verfügung. Weitere Aspekte die zur objektorientierten Programmierung dazu gehören sind desweiteren: Polymorphie und Vererbung.

    Wenn dich das Thema tatsächlich interessiert, fang nicht an ein neues Werkzeug zu lernen (Sprache), sondern die tatsächlichen Grundlagen der objektorientierten Programmierung. 8-) Im übrigen, sollte man im Vorfeld immer eine Anwendung planen ;)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „N3X“ ()

    Sara schrieb:

    Jetzt wollte mit einer neuen Sprache (C#) anfangen.
    Das ist die falsche Herangehensweise, sie baut Hemmnisse auf anstatt sie abzubauen.
    VB.NET und C# sind letzten Endes dieselbe Sprache (IL), die nur in verschiedener Syntax geschrieben wird.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Vielen Dank für die Antworten.
    Ich habe mir das Dataset angesehen und getestet. Ich habe ein kleines Programm geschrieben.
    Ich habe es dann auch mit VB getestet. Das ist wie ihr es ja auch geschrieben habt besser.

    Vielen Dank noch mal.
    Grüße Sara
    Hallo Sara,

    keiner kann dir verbieten, die Möglichkeiten deiner Programmiersprache zu nutzen. Gerade, wenn es darum geht, ein Programm zur Auswertung von Messdaten zu schreiben (du schreibst was von Sensoren) ist es sinnvoll mit wenig Code einfach pragmatisch zum Ziel zu kommen. Die ganze Kapselei hat zwar auch ihren Sinn, aber wenn man schnell zum Ziel kommen will, ist es manchmal besser geradlinig vorzugehen und das zu programmieren, was einen in einer Stunde zum Ziel bringt.

    Die Dotnet-Gurus und Puristen werden das anders sehen und behaupten, dass man keine Public-Variablen verwenden darf, aber warum gibt es sie denn dann?

    Lg, und lass dich nicht unterkriegen ;)

    Klaus
    naja - in dem Punkt neige ich ein bischen vb3-guru zu: Man soll sich nicht von unbegründeten Vorschriften verrückt machen lassen.

    Wenn ich keine Property brauche, dann mach ich auch keine Property hin.

    (Und falls ich sie später doch brauche, mache ich sie halt hin - ist ja kein Act.)

    Aber die Diskussion ist hier glaub Offtopic, odr?

    Edit: Achja - fein - sie stellt ja diese Frage auch.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Aber die Diskussion ist hier glaub Offtopic, odr?


    Find ich nicht. Sie bezieht sich auf das Eingangsposting von Sara, in welchem sie fragt, warum Public-Variablen verpönt sind.

    Ich finde nichts ist verpönt, was zum Ziel führt. Natürlich kann man sich an irgendwelche Regeln halten, die in einem Buch genannt werden, und man kann sein Programm auch immer verbessern. Aber nur stur auf Regeln zu pochen, die es nicht gibt, find ich blöd.
    In einer Diskussion contra globale Variablen stelle ich immer die gleiche Frage:

    Ich habe einen tollen Algorithmus für Seriennummern. Dummerweise ist er recht langsam, er braucht 5 Sekunden zum zerlegen der Seriennummer. DIe Seriennummer schaltet nun das Speichern in eine Datenbank an oder aus. Mit einer globalen Variable habe ich ein simples

    C#-Quellcode

    1. public bool CanSaveToDB;


    Die Globale-Variablen-Ablehner (kurz: GVA) verlangen also tatsächlich von mir, bei jedem einzelnen DB-Zugriff:
    - meine Config-Datei zu öffnen
    - die Seriennummer zu suchen und auszulesen
    - die Datei zu schließen und dann die Seriennummer zu dekodieren
    - zurückzuliefern, ob ich schreiben darf oder nicht

    Wenn das ganze, wie schon beschrieben, 5 Sekunden dauert, haut mir mein Boß das Programm um die Ohren. Was bieten die GVA als Alternative an - denn es muß ja eine geben ?

    Ich habe bisher nie eine Antwort bekommen, außer Floskeln wie "reparier deinen Algorithmus" und solcherlei Unsinn.