Quali problemi potrebbero sorgere se non facessi un metodo statico quando potrei?

4

Ho un metodo stateless che accetta un input e sulla base di tale input restituisce un output. Questo metodo non ha stato quindi, in teoria, potrebbe essere reso statico. Ma diciamo che non lo faccio. Quali problemi potrebbero sorgere da questo?

    
posta John Demetriou 11.04.2016 - 09:36
fonte

3 risposte

10

È concettualmente statico? Il chiamante supponeva che il metodo si riferisca a un'istanza e non a una classe nel suo complesso? Il chiamante solitamente ha un'istanza della classe disponibile al momento della chiamata?

Diciamo che ho una classe per i pulsanti dell'interfaccia utente. E questi pulsanti possono avere un titolo, un colore e un carattere per quel titolo. Ma per alcuni motivi, il carattere è dettato dal sistema operativo e quindi indipendente dal pulsante. Questo non è un motivo per rendere il metodo che restituisce il carattere di un pulsante statico, anche se non accede a nessuno stato di quel pulsante.

Quindi basare la tua decisione su ciò che il chiamante si aspetta, non sui dettagli puramente implementativi.

I problemi che potrebbero sorgere se rendete il metodo statico: 1. Ad un certo punto cambia e richiede lo stato, quindi non può essere più statico e dovete cambiare codice dappertutto. 2. Crei una sottoclasse della tua classe originale e il metodo dovrebbe comportarsi diversamente per la sottoclasse. Questo è banalmente fatto creando un metodo di istanza virtuale; con il tuo metodo statico hai un problema.

    
risposta data 11.04.2016 - 10:16
fonte
5

L'unico inconveniente di non rendere statico un metodo se può essere statico è che devi istanziare la classe prima di chiamare il metodo.

Se fai al volo in un ciclo (< = > new MyClass (). method () in a for), questo può danneggiare le prestazioni e usare la memoria per niente.

Modifica: vedere la risposta @ gnasher729 per l'inconveniente di progettazione. Ho risposto considerando che la parte del design era già a posto.

    
risposta data 11.04.2016 - 10:10
fonte
1

Quando hai un'istanza (cioè il metodo non è statico), possiamo fare riferimento a quell'istanza. Poiché possiamo fare riferimento all'istanza, possiamo utilizzare un'istanza diversa in una posizione diversa: possiamo passare l'istanza come parametro, possiamo usare l'integrazione della dipendenza, colleghiamo diverse istanze a grafici di oggetti diversi nello stesso momento o in momenti diversi. Quindi, anche quando il metodo è funzionale (ovvero non mantiene lo stato tra le chiamate), puoi ottenere il valore orientato agli oggetti dalle istanze.

Se rendi il metodo statico, ti perdi il riferimento (di un'istanza), perché non c'è un'istanza da referenziare.

Tuttavia, inserisci i puntatori funzione o Lambda (ovvero chiusure, C # li ha), e puoi sostituire uno di quelli per un oggetto. Quindi, con questo, recuperiamo la possibilità di fare riferimento e passare come parametro, un puntatore a funzione, un delegato o una lambda / chiusura. Naturalmente, ad esempio i delegati, c'è già un'istanza (direttamente) coinvolta, e per lambdas (che sono le chiusure) il compilatore creerà una classe e un'istanza sotto le copertine (nonostante l'ottimizzazione). Quindi, per la maggior parte, in C # i delegati di istanza e lambda coinvolgono istanze di classi. (I delegati dai metodi statici non richiedono un'istanza, sebbene AFAIK.)

    
risposta data 11.04.2016 - 18:08
fonte

Leggi altre domande sui tag