2011-09-14 3 views
6

Attualmente sono un framework di gioco interessante perché questo framework promette uno sviluppo più rapido.Ci sono effetti collaterali dell'utilizzo di molte funzioni statiche?

Quando vedo il codice, ci sono così tanti codici statici. anche il controller ha dichiarato come funzione statica. Quindi tutto il codice che viene chiamato all'interno della funzione statica deve essere statico, giusto?

La mia domanda è: questo approccio è giusto? ci sono effetti collaterali dell'uso di molte funzioni statiche?

+0

I metodi statici possono chiamare metodi non statici di istanza che vengono passati come argomenti o in campi statici o oggetti che creano. Non può chiamare il metodo non statico della stessa classe senza un'istanza. –

+0

@Peter: Potresti elaborare di più per favore – indrap

risposta

7

Un paio di cose sui metodi statici in un linguaggio orientato agli oggetti: vorrei provare a spiegare i problemi se si sceglie di avere tutti i metodi statici.

L'utilizzo di tutte le funzioni statiche potrebbe non essere idiomatico in un linguaggio orientato agli oggetti. Non è possibile sovrascrivere le funzioni statiche in una sottoclasse. Pertanto si perde la capacità di eseguire il polimorfismo di runtime ignorando.

Le variabili definite dall'utente diventano automaticamente variabili di classe (poiché tutti i metodi sono statici), quindi in sostanza non si dispone di alcun stato associato all'istanza.

I metodi statici sono difficili da deridere. Potresti aver bisogno di framework come PowerMock per fare il beffardo per te. Quindi il test diventa difficile.

Il design diventa un po 'complesso in quanto non sarà possibile creare classi immutabili in quanto solo la classe e nessuna istanza. Quindi progettare classi thread-safe diventa difficile.

+0

Per i test, Play Framework usa JUNIT4 e Selenium.Penso che sia sufficiente creare test di unità e test di regressione – indrap

+0

"Quindi progettare classi thread-safe diventa difficile" in base al tuo commento, non è bene usare il framework di gioco nell'applicazione enterprise? – indrap

+0

Mi permetta di chiarire. Progettare una classe per l'immutabilità è un modo di progettare una classe thread-safe senza dover introdurre la sincronizzazione. Ovviamente, quando hai bisogno di un cambiamento di stato nell'oggetto, devi creare una nuova istanza della classe. Per un esempio guarda la classe String. Ma se i tuoi metodi sono tutti statici e tutto ciò che hai sono variabili di classe, allora una classe immutabile è fuori questione, in quanto non esiste un'istanza. Non volevo dire che una classe con solo metodi statici non può essere infallibile. – Aneesh

-3

Sì, c'è un effetto collaterale sull'uso di troppe funzioni o variabili statiche. È necessario evitare dichiarazioni statiche non necessarie.

Poiché i membri statici creano sempre uno spazio di memoria una volta caricata la classe nel JRE. Anche se non crei l'oggetto della classe, occuperà la memoria.

+0

Dato che il controllore usa la classe statica, tutte le funzioni o le classi chiamate all'interno del controller devono essere statiche. In questo caso, l'utilizzo statico è abbastanza necessario. – indrap

+3

Questa risposta non è corretta. Un metodo statico non utilizza più o meno spazio di un metodo di istanza. E non fa differenza se un'istanza della classe è stata creata o meno. –

+0

L'OP chiede informazioni su _functions_ statici, non _fields_ statici. I campi statici assegneranno lo spazio non appena la classe viene caricata, mentre i campi di istanza non verranno allocati fino a quando non viene creata un'istanza (tuttavia, la memoria allocata per un campo statico viene assegnata una sola volta, ma i campi di istanza allocano memoria aggiuntiva per l'istanza _every_). Come note @stephenc, non fa alcuna differenza per i metodi. – Chadwick

1

Per elaborare il mio commento.

I metodi statici possono chiamare metodi non statici purché si abbia un'istanza di qualcosa.

class A { 
    public void nonStaticMethod() { } 

    public static void staticMethod(String text) { 
     // calls non-static method on text 
     text.length(); 
     // calls non-static method on new Object 
     new Object().hashCode(); 
     // calls non static method on a instance of A 
     new A().nonStaticMethod(); 
    } 
} 
+1

ti vedo punto, grazie. Posso usare google guice per creare istanze di oggetti quindi utilizzare la funzione non statica nel controller – indrap

17

Questa domanda è stata posta in modo simile in precedenza. La semplice risposta è che Play usa la statica dove è ragionevole.

Il modello HTTP non è un modello OO. Le richieste HTTP stesse sono stateless e, pertanto, i metodi statici consentono l'accesso ai controller come richieste funzionali dal codice client.

Le classi del modello invece sono OO puro e di conseguenza non sono statiche. Alcuni dei metodi di utilità, come findAll o findById, sono statici, ma di nuovo non sono statefull e sono metodi di utilità sulla classe. Mi aspetterei comunque in un modello OO standard.

Pertanto, non penso ci sia alcun rischio nel fare le cose nel modo in cui Play si aspetta. Può sembrare strano, perché sfida la norma, ma lo fa per ragioni valide.

+4

Questa è la risposta corretta in quanto riguarda specificamente il framework di gioco. – Ryan

+1

Dal libro di ricette di Play Framework pagina 15, mostra che il creatore ha risolto questo problema molto bene vedere (play.classloading. enhancers.ControllerEnhancer) – indrap

+1

Effettivamente lo ha fatto. Guillaume è un ragazzo molto intelligente, e il team di Play ha progettato la struttura di Play molto bene. – Codemwnci