Cosa dire al tuo capo se vogliono che tu usi una variabile globale


13

Sono attualmente 4 mesi in uno stage, e durante la revisione del mio codice, il mio capo non mi è piaciuto che avevo tenuto un oggetto specifico locale a un numero di metodi attraverso alcune classi separate all'interno di un assembly. Non gli piaceva che mi venisse creato un nuovo oggetto ogni volta, e invece mi disse di creare un singolo oggetto a cui si potesse accedere da qualsiasi luogo. Ho quindi dovuto crearlo come oggetto statico all'interno di una classe statica, e semplicemente fare riferimento da qui voglio usarlo!

Come ti occuperesti di questo, poiché ho programmato professionalmente solo per 4 mesi!


4
Il tuo capo è una persona tecnica o non tecnica? Se è tecnico, ha letto "Clean Code" di Robert C. Martin?
George Stocker,

5
Quindi, il tuo capo ti ha assunto per programmare e ora ti sta dicendo come programmare?
Jeremy Heiler,

8
In un commento sotto hai detto che "l'oggetto non ha alcuno stato, a parte molte costanti". In tal caso, una classe statica mi sembra una buona soluzione.
Justin,

5
"Sì Boss" mi viene in mente ...

2
"mi ha detto di creare un singolo oggetto a cui è possibile accedere da qualsiasi luogo. Ho quindi dovuto crearlo come un oggetto statico" Questo non è un ragionamento valido. Parli come se avere un singolo oggetto accessibile da un'intera applicazione implicasse che tu avessi un Singleton - perché non lo crei semplicemente nella radice di aggregazione e poi passi il suo riferimento alle classi dipendenti?
divorò elisio il

Risposte:


33

Se un oggetto è abbastanza, creare un oggetto ogni volta è uno spreco, e qui il tuo capo potrebbe avere ragione.

Il problema è l'accesso corretto a quell'oggetto. Un metodo simile a una fabbrica con adeguata visibilità che restituisce sempre quell'oggetto statico è la prima soluzione che mi viene in mente. Altri certamente esistono.


3
+1: per quanto non mi piaccia qualsiasi risposta "GoF detto così", giusto è giusto.
Javier,

1
Ho pensato a Singletons, tuttavia l'ho visto come un involucro attorno a una variabile globale, quindi non l'ho seguito. Lo proverò ora, poiché l'oggetto non ha alcuno stato, a parte molte costanti, quindi dovrebbe andare bene. Grazie.
Darren Young,

9
Sospettavo che potesse essere così ("l'oggetto non ha alcuno stato ... molte costanti"). Il tuo capo ha ragione. Non ha senso esercitare pressioni artificiali sul garbage collector per valori che non cambiano mai.
Berin Loritsch,

3
@ darren-young: da un lato, non avere uno stato è interessante e consente alcuni approcci potenti; dai un'occhiata alla cosiddetta "programmazione funzionale" se non l'hai ancora fatto.
9000

8

Non posso commentare il tuo caso specifico, ma l'uso di variabili globali a volte è una buona soluzione. La classe System di Java è piena di variabili statiche e globali.

Ma in generale, se pensi di avere ragione e il tuo capo ha torto, allora perché non chiedi al tuo capo di spiegare perché pensa che una variabile globale sia una soluzione migliore? Un semplice "Non mi piace" è vago quanto "le variabili globali sono malvagie". Devi chiedere di più al tuo capo!

Se non è in grado di motivare la sua posizione, e tu puoi dare ragioni alla tua posizione, o viceversa, allora è una buona opportunità di apprendimento. Se entrambi potete giustificare le vostre posizioni, allora è probabilmente una questione di gusti - o di esperienza: il vostro capo deve aver programmato professionalmente per più di 4 mesi, penso?


1
Vedi, java.lang.Systemcontiene esattamente tre variabili globali e per ognuna di esse esiste un metodo per impostarlo correttamente. Ma Systemè pieno di metodi statici che restituiscono oggetti globali, e non c'è esattamente nulla di sbagliato in questo, non posso discutere.
9000

2
Sì; Considero le variabili globali praticamente uguali ai metodi statici che restituiscono oggetti globali.
Joonas Pulakka,

Quindi Java fa questo. È una domanda completamente diversa se è una buona idea. Il generatore di numeri casuali standard di C mantiene lo stato globale. Ma è generalmente riconosciuto che questo è orribile e che il generatore di numeri casuali è quindi inutilizzabile in alcune applicazioni (vedi ad esempio Bentley et al., Engineering una funzione di ordinamento ). Java in particolare ha una serie di problemi di progettazione (che sono stati parzialmente migliorati in C #), quindi non sono molto diffidente nell'usarlo come argomento come questo.
Konrad Rudolph,

@Konrald Rudolph: Alla fine è una decisione di progettazione. Ogni decisione ha pro e contro. Ad esempio, mantenere lo stato globale Systemsemplifica, diciamo, il 99,9% dei casi d'uso a costo di causare problemi nel restante 0,1%. Non esiste una risposta "giusta" al fatto che lo 0,1% valga o meno la complessità aggiuntiva.
Joonas Pulakka,

5

Come qualcuno nella tua posizione, il massimo che puoi fare è imparare. Se l'oggetto è essenzialmente una costante (cioè non può cambiare e non mantiene lo stato), allora il tuo capo potrebbe avere ragione. Non vi è alcun danno nell'avere un oggetto statico costante. Dopo tutto, quante definizioni di PI ci sono?

Alcune persone difendono la mentalità "nessun oggetto globale" fino al punto di ferire la religione. Questo per uno dei due motivi: sono stati un po 'difficili da rintracciare i bug o la fragilità del sistema a causa dell'uso eccessivo di variabili / oggetti globali, o hanno sentito dire che è male e non possono pensare da soli. Personalmente rientro nel gruppo di persone che sono state colpite duramente dalla fragilità e dai bug difficili da rintracciare, ma ho anche imparato un po 'di equilibrio qui.

Se fossi nei tuoi panni, andrei avanti e farei quello che dice il capo - dopo tutto è il suo culo. Poi guarderei e vedrei gli effetti di quella scelta nel tempo. Questo è uno strumento di apprendimento efficace.


È uno stage. Dovresti imparare. Fare ciecamente ciò che dice il tuo capo non sta imparando.
David Thornley,

5
Né sta andando ciecamente contro il tuo capo. Il mio consiglio, come è stato scritto, era di osservare gli effetti della scelta del capo. Noi (su stackexchange) non possiamo dare un giudizio di valore sulla situazione perché ci mancano informazioni vitali. Questo è un caso per fare un piccolo metodo scientifico. L'OP ha un'ipotesi, il capo l'ha sfidata. Ora è il momento di eseguire l'esperimento.
Berin Loritsch,

2

A seconda della situazione specifica, una variabile globale potrebbe essere la soluzione migliore. Nella programmazione integrata, i globi non occupano spazio nello stack e per questo motivo sono una buona scelta.

Globali o no, ho trovato una buona prassi mettere un prefisso su globali. Questo renderà gli altri programmatori googling del tuo codice consapevole dell'impatto se il pasticcio con esso.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.