Laden...

Zähler als Variable Klassenübergreifend

Erstellt von cncandi vor 7 Jahren Letzter Beitrag vor 7 Jahren 4.065 Views
C
cncandi Themenstarter:in
8 Beiträge seit 2012
vor 7 Jahren
Zähler als Variable Klassenübergreifend

wie kann ich einen Zähler in einer Klasse KLASSENÜBERGREIFEND hochzählen lassen?
Globale Variablen sollen ja nicht verwendet werden. Die Variante über die Settings kenne
ich.

Beispiel:

Klasse Main
AUFRUF KLASSE ZÄHLER
Ergebnis 1

Klasse2
AUFRUF KLASSE ZÄHLER
Ergebnis 2

Klasse3
AUFRUF KLASSE ZÄHLER
Ergebnis 3

Klasse Zähler
zahl=zahl+1

3.003 Beiträge seit 2006
vor 7 Jahren

C# kennt keine globale Variablen, insofern wird's schwer, die zu benutzen 😉. Wenn du einen Wert instanzübergreifend und -unabhängig abrufen und manipulieren können musst, bietet sich ein Singleton an. AppSettings/Configuration arbeitet übrigens ähnlich.

Dazu folgende Anmerkungen:

  1. In den meisten Fällen ist der Einsatz eines Singletons die Lösung eines Problems, das durch einen Architekturfehler entstanden ist. Du tust sehr gut daran, genau zu prüfen, ob du das wirklich brauchst, oder ob da nicht ein Denkfehler vorliegt.

  2. Singleton-Implementierungen in C# haben ihre Eigenheiten, die es zu beachten gilt.

  3. Singletons sind schlecht bis gar nicht testbar, wartbar und erweiterbar. Insofern kontern sie Bemühungen in der objektorientierten Programmierung. Manche betrachten sie daher als Antipattern.

Grüße,

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

C
cncandi Themenstarter:in
8 Beiträge seit 2012
vor 7 Jahren

danke für die Antwort.

Ich habe schon verstanden, dass jeder C# Programmierer sehr empfindlich auf globale Variablen reagiert. Es geht mir hier auch gar nicht um eine globale Variable. Ich will nicht
von überall darauf zugreifen können. Aber die Variable soll Ihren Wert behalten, auch wenn
ich die Klasse verlasse.

Sowas muss doch einfach möglich sein. Ansonsten habe ich wirklich einen Denkfehler.
Ich kann doch nicht jede Variable immer zwischen den Klassen hin und herschieben müssen,
wenn der Wert gespeichert werden soll.

Spricht irgend etwas gegen die Möglichkeit über die Settings?

771 Beiträge seit 2009
vor 7 Jahren

Suchst du "static"?


class MyClass
{
  public static int Counter { get; set; }
}

3.003 Beiträge seit 2006
vor 7 Jahren

Sowas muss doch einfach möglich sein. Ansonsten habe ich wirklich einen Denkfehler.

Davon würde ich ausgehen, ja. Das hat absolut nichts damit zu tun, "dass jeder C# Programmierer sehr empfindlich auf globale Variablen reagiert".

Es gibt einfach keine in der Sprache, weil die Entwickler von C# sich gegen dieses Feature entschieden haben. [1]

Zur zweiten Frage: gegen Settings spräche eventuell der Einwand, dass es ein möglicherweise ein Missbrauch von Einstellungen ist. Kann ich nicht beurteilen, weil ich nicht weiß, wozu deine Anforderung gut sein soll.

Grüße,

LaTino

[1] weil es in aller Regel mehr schadet als nützt und durch Singleton leicht ersetzt werden kann, wenn man es wirklich braucht. Lässt man das Feature weg, verliert man also nichts, sondern gewinnt nur.

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

5.658 Beiträge seit 2006
vor 7 Jahren

Hi cncandi,

Davon würde ich ausgehen, ja.

Ich auch. Eventuell würde es helfen, wenn du mal genauer erklärst, was du eigentlich vor hast. Und warum die Notwendigkeit besteht in unterschiedlichen Klassen auf einen Zähler zuzugreifen. Irgendwo sollte doch die Zählerfunktion gekapselt werden, so daß man das Ganze dann auch (Unit-)testen kann.

Weeks of programming can save you hours of planning

C
cncandi Themenstarter:in
8 Beiträge seit 2012
vor 7 Jahren

ich kann es gerne erklären.

Wir setzen eine CAD Software ein, bei welcher jedem Element Kreis, Linie, Bogen ein eindeutiger ID Verweis nach dem erstellen zugewiesen werden muss. Also haben wir eine Klasse setID erstellt. Diese macht noch einiges mehr, aber letztlich soll Sie dem Element auch eine eindeutige ID zuweisen. Bei jeder Zeichnung kann die ID wieder von vorne anfangen. Aber innerhalb der Zeichnung muss jedes neu erstellt Element ID=ID+1 sein.

Ich rufe also von einer beliebigen anderen Klasse auf setID zu und sende das Geometrieelement an die Klasse setID. In der Klasse selbst wird dann die ID zugewiesen. Klappt alles super. Aber natürlich ist der Wert der ID immer wieder 1 wenn ich die Klasse neu aufrufe.

2.207 Beiträge seit 2011
vor 7 Jahren

Hallo cncandi,

kannst keine GUID nehmen?

Gruss

Coffeebean

C
cncandi Themenstarter:in
8 Beiträge seit 2012
vor 7 Jahren

leider nein. Ich möchte einen logischen Zusammenhang haben. Es würde zu weit führen das zu erklären aber bei einer GUID habe ich diesen einfach nicht mehr.

3.003 Beiträge seit 2006
vor 7 Jahren

Dann eine winzige Klasse, die ähnlich einer Datenbanksequenz funktioniert, und die du einfach reinreichst. Wenn es unbedingt sein muss, kann die auch statisch sein - muss es aber aus meiner Sicht nicht, man kann den Sequenzgenerator auch jeder Klasse mitgeben, und über die Laufzeit der App am Leben halten.


//nur beispielhaft!
public class SequenceGenerator
{
    private int _counter;
    public int GetNextId() => ++_counter;
}

public class Circle
{
   public Circle(SequenceGenerator sqGen) 
   {
       this.Id = sqGen.GetNextId();
   }
}
//usw, und dann:

public void Main()
{
   var sqGen = new SequenceGenerator();
   var circle = new Circle(sqGen);
   var poly = new Poly(sqGen);

   DoSomething();

   var square = new Square(sqGen);

   //usw usf.   
}

Das mag etwas umständlicher sein als zB in PHP einfach eine globale Vraible zu erstellen, dafür ist es besser gekapselt und entspricht (meiner Meinung nach) eher den Grundsätzen der OOP. Und du hast eine Möglichkeit, die erstellten IDs zentral an einer Stelle abzufragen, weil es eine Klasse gibt, deren einziger Sinn darin besteht, anderen Klassen eine ID zu verpassen. (EIne Klasse <=> eine Verantwortlichkeit)

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

C
cncandi Themenstarter:in
8 Beiträge seit 2012
vor 7 Jahren

ok danke. Werde ich so versuchen.

5.658 Beiträge seit 2006
vor 7 Jahren

Bei jeder Zeichnung kann die ID wieder von vorne anfangen. Aber innerhalb der Zeichnung muss jedes neu erstellt Element ID=ID+1 sein.

Dann gehört die Generierung der Nummer eigentlich in die Klasse, die für die Zeichnung zuständig ist.

Weeks of programming can save you hours of planning