Wie behalte ich Daten ohne globale Variablen?

8

Ich bin an Skriptsprachen gewöhnt. PHP, Javascript usw. und ich habe ein paar relativ einfache Java und C # -Apps geschrieben. Dies ist eine Frage, für die ich immer wieder eine Antwort brauchte, und ich stelle mir vor, dass ich nicht die Einzige bin.

Sagen wir, ich bin in Javascript.

Ich habe die Funktion A (), aufgerufen von der GUI, die einen Wert abruft.

Die Funktion B (), die auch von der GUI aufgerufen wird, benötigt diesen Wert, aber die Funktion B () wird beliebig oft aufgerufen, eine willkürliche Zeitspanne nach A ().

Ich möchte nicht, dass A () den Wert jedes Mal neu berechnet.

Ein Beispiel sind Anmeldeinformationen. A () fragt nach einem Benutzernamen, und B () verwendet diesen Wert, um ihn bei jedem Aufruf an ein Protokoll anzuhängen.

Dafür würde ich wahrscheinlich nur eine globale Variable verwenden.

Jetzt, C #. Keine globalen Variablen! Wie soll ich das machen?

Bearbeiten: Genießt die Antworten, aber es gibt viele "Versuche, keine globalen Kommentare zu verwenden". Was ich verstehe, aber ich würde gerne die alternativen Muster für diese Anforderung hören.

    
ChristianLinnell 21.05.2009, 22:32
quelle

5 Antworten

4

Zuerst fragen Sie sich immer, ob Sie wirklich global sein müssen, oft werden Sie es nicht tun. Aber wenn du wirklich einen haben musst ...

Der beste Weg, dies zu tun, ist eine statische Eigenschaft für eine sinnvoll benannte Klasse zu haben, die effektiv zu Ihrer globalen Variable wird.

%Vor%

BEARBEITEN:

Einige Leute hier haben die pauschale Aussage, dass globale Variablen schlecht sind, gesagt, und ich stimme dieser Meinung zu, und es scheint, dass die Entwickler von C # auch zustimmen, da sie einfach nicht verfügbar sind.

Wir sollten jedoch die Gründe betrachten, warum Globals schlecht sind, und sie werden meistens als schlecht angesehen, weil Sie die Regeln der Kapselung brechen. Statische Daten sind jedoch nicht unbedingt schlecht, das Gute an statischen Daten ist, dass Sie sie einkapseln können, mein Beispiel oben ist ein sehr einfaches Beispiel dafür, wahrscheinlich würden Sie in einem realen Szenario Ihre statischen Daten in die gleiche Klasse aufnehmen Andere arbeiten mit den Anmeldeinformationen, vielleicht einer Login-Klasse oder einer User-Klasse oder was auch immer für Ihre App sinnvoll ist.

    
Tim Jarvis 21.05.2009, 22:40
quelle
5

Dies ist keine gute Übung, aber wenn Sie es wirklich brauchen, gibt es eine Reihe von Möglichkeiten:

  1. Web-Apps: Sie können Ihre Variable in einen Kontext stellen, z. B. in die Sitzung oder in den Anwendungsbereich der Anwendung.
  2. Desktop-Apps: Sie können ein Objekt erstellen und als Eigenschaft einer Klasse speichern, in der immer ein Objekt aktiv ist.
  3. Jede Art von App: Verwenden Sie eine öffentliche statische Eigenschaft. Es ist für jeden sichtbar.
fbinder 21.05.2009 22:41
quelle
1

Ich würde sagen, dass Sie wahrscheinlich ein Singleton-Muster verwenden sollten.

Wenn Sie eine Multithread-Anwendung verwenden, müssen Sie auch sicherstellen, dass die Zugriffe auf die Eigenschaften der Instanz des Singletons threadsafe sind.

Wie immer bitte denken Sie sorgfältig darüber nach, irgendeine Art von Global in Ihrer Anwendung einzuführen, aber haben Sie keine Angst, sie zu benutzen. Viele Dinge sind in der Tat global, wie die App.Settings zum Beispiel ohne etwas "schlechtes" darin zu haben.

Dieser Artikel zu MSDN erläutert, wie Sie in c # einen Singleton erstellen.

>     
Jorge Córdoba 21.05.2009 22:45
quelle
0

In C # besteht eine der Möglichkeiten, ein Verhalten ähnlich wie bei globalen Variablen zu erhalten, darin, statische Klassenmethoden und Klassenvariablen zu verwenden. Statische Klassenmethoden und -variablen haben in C # eine einzige Instanz und ähneln in anderen Sprachen globalen Variablen.

Für Ihr Problem klingt das eher nach einem Designproblem. C # konzentriert sich sehr auf objektorientiertes Design; Ich vermute für das Problem, das Sie gegeben haben, dass eine bessere OOD Ihr Problem lösen würde.

    
Paul Sonier 21.05.2009 22:40
quelle
0

Die Funktion A wäre Teil einer Klasse (nenne sie C). Funktion A könnte dann die Anmeldeinformationen speichern und eine Funktion (oder in C #, eine Eigenschaft) bereitstellen, um die Anmeldeinformationen zu erhalten. Wenn sie benötigt werden, können Sie einfach die Eigenschaft verwenden, um die gespeicherten Anmeldeinformationen zu erhalten und sie in Funktion B (in einer anderen Klasse) zu übergeben.

%Vor%     
workmad3 21.05.2009 22:42
quelle

Tags und Links