Was soll ich meinem Chef sagen, wenn er möchte, dass Sie eine globale Variable verwenden?

13

Ich bin derzeit 4 Monate in einem Praktikum und als ich meinen Code überprüfte, mochte mein Chef nicht, dass ich ein bestimmtes Objekt für eine Reihe von Methoden in einigen separaten Klassen innerhalb einer Assembly lokal gehalten hatte. Es gefiel ihm nicht, dass ich jedes Mal ein neues Objekt erstellt habe, und er sagte mir stattdessen, ich solle ein einzelnes Objekt erstellen, auf das von überall aus zugegriffen werden kann. Ich musste es daher als statisches Objekt innerhalb einer statischen Klasse erstellen und von hier aus einfach darauf verweisen, ich möchte es verwenden!

Wie würden Sie damit umgehen, da ich erst seit 4 Monaten professionell programmiere?

Darren Young
quelle
4
Ist Ihr Chef eine technische Person oder eine nicht technische Person? Wenn er technisch ist, hat er "Clean Code" von Robert C. Martin gelesen?
George Stocker
5
Also hat Ihr Chef Sie beauftragt, zu codieren, und sagt Ihnen jetzt, wie Sie codieren sollen?
Jeremy Heiler
8
Sie haben in einem Kommentar unten gesagt, dass "das Objekt abgesehen von vielen Konstanten keinen Status hat". In diesem Fall scheint mir eine statische Klasse eine gute Lösung zu sein.
Justin
5
"Yes Boss"
2
"Ich sollte ein einzelnes Objekt erstellen, auf das von überall aus zugegriffen werden kann. Ich musste es daher als statisches Objekt erstellen." Dies ist keine gültige Begründung. Sie haben den Eindruck, dass ein einzelnes Objekt, auf das von einer gesamten Anwendung aus zugegriffen werden kann, ein Singleton enthält. Warum erstellen Sie es nicht einfach im Aggregationsstamm und übergeben den Verweis an die abhängigen Klassen?
verschlang Elysium

Antworten:

33

Wenn ein Objekt ausreicht, ist es eine Verschwendung, jedes Mal ein Objekt zu erstellen, und hier könnte Ihr Chef Recht haben.

Das Problem ist der ordnungsgemäße Zugriff auf dieses Objekt. Eine fabrikähnliche Methode mit korrekter Sichtbarkeit, die immer das statische Objekt zurückgibt, ist die erste Lösung, die in den Sinn kommt. Andere existieren sicherlich.

9000
quelle
3
+1: So sehr ich keine "GoF said so" -Antwort mag, richtig ist richtig.
Javier
1
Ich habe über Singletons nachgedacht, aber ich habe es nur als Wrapper um eine globale Variable gesehen, also habe ich es nicht weiterverfolgt. Ich werde es jetzt versuchen, da das Objekt keinen Status hat, abgesehen von vielen Konstanten, die in Ordnung sein sollten. Vielen Dank.
Darren Young
9
Ich vermutete, dass dies der Fall sein könnte ("Objekt hat keinen Zustand ... viele Konstanten"). Dein Chef hat recht. Es macht keinen Sinn, künstlichen Druck auf den Müllsammler auszuüben, um Werte zu erhalten, die sich nie ändern.
Berin Loritsch
3
@ darren-young: Nebenbei bemerkt ist es interessant, keinen Staat zu haben, und erlaubt einige mächtige Ansätze; Werfen Sie einen Blick auf die sogenannte "funktionale Programmierung", wenn Sie dies noch nicht getan haben.
9000,
8

Ich kann Ihren speziellen Fall nicht kommentieren, aber die Verwendung globaler Variablen ist manchmal eine gute Lösung. Java - System - Klasse voll von statischen, globalen Variablen.

Aber im Allgemeinen, wenn Sie denken, dass Sie Recht haben und Ihr Chef Unrecht hat, warum fragen Sie dann Ihren Chef nicht, warum er eine globale Variable für eine bessere Lösung hält? Ein einfaches "Ich mag es nicht" ist so vage wie "globale Variablen sind böse". Sie müssen mehr von Ihrem Chef verlangen!

Wenn er seine Haltung nicht begründen kann und Sie Ihre Haltung begründen können oder umgekehrt, ist dies eine gute Gelegenheit zum Lernen. Wenn ihr beide eure Standpunkte rechtfertigen könnt, dann ist es wahrscheinlich eine Geschmackssache - oder eine Frage der Erfahrung: Euer Chef muss mehr als 4 Monate professionell programmiert haben, denke ich?

Joonas Pulakka
quelle
1
Siehe, java.lang.Systementhält genau drei globale Variablen und für jede gibt es eine Methode, um sie richtig einzustellen. Aber Systemes steckt voller statischer Methoden, die globale Objekte zurückgeben, und daran ist genau nichts auszusetzen.
9000,
2
Ja; Ich betrachte globale Variablen ziemlich genau als statische Methoden, die globale Objekte zurückgeben.
Joonas Pulakka
Java macht das also. Es ist eine ganz andere Frage, ob das eine gute Idee ist. Der Standard-Zufallszahlengenerator von C behält den globalen Status bei. Es wird jedoch allgemein anerkannt, dass dies schrecklich ist und der Zufallszahlengenerator daher in bestimmten Anwendungen unbrauchbar ist (siehe z. B. Bentley et al., Engineering einer Sortierfunktion ). Insbesondere Java weist eine Reihe von Designproblemen auf (die teilweise in C # verbessert wurden), so dass ich nicht sehr vorsichtig bin, wenn ich es als solches Argument verwende.
Konrad Rudolph
@Konrald Rudolph: Am Ende ist es eine Designentscheidung. Jede Entscheidung hat Vor- und Nachteile. Wenn Sie beispielsweise den globalen Status Systemaufrechterhalten, werden 99,9% der Anwendungsfälle vereinfacht, während die verbleibenden 0,1% Probleme verursachen. Es gibt keine "richtige" Antwort darauf, ob 0,1% die zusätzliche Komplexität wert sind oder nicht.
Joonas Pulakka
5

Als jemand in Ihrer Position können Sie nur lernen. Wenn es sich bei dem Objekt im Wesentlichen um eine Konstante handelt (dh es kann sich nicht ändern und behält den Status nicht bei), hat Ihr Chef möglicherweise Recht. Es schadet nicht, ein statisch konstantes Objekt zu haben. Wie viele Definitionen von PI gibt es schließlich?

Einige Leute verteidigen die Denkweise "keine globalen Objekte" bis zum religiösen Fieber. Dies hat einen von zwei Gründen: Sie waren aufgrund übermäßiger Nutzung globaler Variablen / Objekte nicht in der Lage, Fehler oder die Fragilität des Systems nachzuvollziehen, oder sie haben gehört, dass dies schlecht ist, und sie können nicht selbst nachdenken. Ich persönlich gehöre zu der Gruppe von Menschen, die von Zerbrechlichkeit und der Suche nach Fehlern schwer getroffen wurden - aber ich habe auch hier ein gewisses Gleichgewicht gelernt.

Wenn ich in deinen Schuhen stecke, würde ich weitermachen und tun, was der Chef sagt - es ist schließlich sein Hintern in der Leitung. Dann würde ich die Auswirkungen dieser Wahl im Laufe der Zeit beobachten und sehen. Dies ist ein effektives Lernwerkzeug.

Berin Loritsch
quelle
Es ist ein Praktikum. Du solltest lernen. Blind tun, was dein Chef sagt, lernt nicht.
David Thornley
5
Es geht auch nicht blindlings gegen deinen Chef. Mein Rat lautete, die Auswirkungen der Wahl des Chefs zu beobachten. Wir (bei StackExchange) können keine Werteinschätzung der Situation vornehmen, da uns wichtige Informationen fehlen. Dies ist ein Fall, um ein wenig wissenschaftliche Methode zu tun. Das OP hat eine Hypothese, der Chef hat sie in Frage gestellt. Jetzt ist es Zeit, das Experiment durchzuführen.
Berin Loritsch
2

Abhängig von der jeweiligen Situation ist eine globale Variable möglicherweise die beste Lösung. In der eingebetteten Programmierung belegen Globals keinen Stapelspeicher und sind daher eine gute Wahl.

Globals oder nicht, ich habe es als gute Praxis empfunden, Globals ein Präfix zu geben. Dadurch werden andere Programmierer, die Ihren Code googeln, auf die Auswirkungen aufmerksam, wenn sie damit in Konflikt geraten.

Max Kielland
quelle
1

Vielleicht wollte Ihr Chef, dass Sie das Singleton-Muster verwenden. Dies ist eine sehr gute Vorgehensweise, wenn Sie von mehreren Instanzen aus auf ein bestimmtes Objekt zugreifen müssen.

Hier ist ein Link zur Erklärung der Wikipedias

Guiman
quelle
Ich denke das good practicewäre, en.wikipedia.org/wiki/Dependency_injection
Oliver Weiler