I metodi statici privati ​​in C # fanno male a qualcosa?


10

Ho creato un metodo di convalida privato per una certa convalida che si verifica più volte nella mia classe (non posso archiviare i dati convalidati per vari motivi). Ora, ReSharper suggerisce che la funzione potrebbe essere resa statica. Sono un po 'riluttante a farlo a causa di problemi noti con metodi statici. Sarebbe un metodo statico privato . La mia domanda è: i metodi statici privati ​​possono causare problemi simili di accoppiamento e test come i metodi statici pubblici? È una cattiva pratica? Immagino di no, ma non sono sicuro che ci sia una trappola qui.


10
Quali sono i "problemi noti" con i metodi statici?
Robert Harvey,

3
@Ed: giusto. I metodi statici scritti correttamente non devono toccare API esterne o dichiarare comunque. Manipolare lo stato interno incapsulato in una classe mi sembra perfettamente OK e il metodo non avrebbe bisogno di essere testato dall'unità, poiché il test unitario verifica il comportamento esterno della classe.
Robert Harvey,

1
I metodi statici sono inclini a modificare lo stato globale e uccidono anche l'ereditarietà (ogni volta che si desidera estendere la funzionalità, è necessario modificare il codice chiamante perché non è possibile ignorare il metodo in una classe derivata). Sei legato a quell'unica implementazione. I metodi statici non possono essere derisi, il che li rende molto difficili da testare. Nascondono la dipendenza . Sono sicuro che c'è di più. Non solo per evitarli alla cieca, sto chiedendo di prendere una decisione informata.
Tamás Szelei,

2
@ Tamás I metodi statici modificano lo stato globale solo se li scrivi in ​​questo modo, cosa che non faccio mai. In generale, utilizzo solo metodi statici nelle classi di utilità, metodi che accettano uno o più oggetti e restituiscono un oggetto senza effetti collaterali. Questi tipi di metodi non hanno nessuno dei problemi che descrivi.
Robert Harvey,

1
@ TamásSzelei Come sono inclini a modificare lo stato globale? Non riescono nemmeno a trovare lo stato globale se non lo si passa in un parametro.
CodesInChaos,

Risposte:


16

Penserei: "Devo testarlo?"

Se il tuo metodo è privato, il che significa che non vuoi testare l'unità la logica nel metodo stesso, quindi per quanto riguarda la testabilità e la manutenibilità la tua classe è una scatola nera in entrambi i casi, i meccanismi interni della tua classe sono i suoi affari ed è solo. Neanche il refactoring sarà interessato, il che è anche qualcosa da considerare.

Quindi, secondo me: No, rendere un metodo "privato" "statico privato" non avrà ramificazioni a lungo termine.


17

I metodi statici privati ​​sono la cosa più semplice possibile, dal mio punto di vista.

DataIn -> Metodo -> DataOut

Non ci sono dipendenze da oggetti esterni, nessun effetto collaterale. Perché li consideri cattivi?


Grazie. Ho spiegato le mie preoccupazioni nei commenti sotto la domanda.
Tamás Szelei,

2
Quello che descrivi è corretto solo per i metodi statici che non dipendono dalle variabili dei membri statici - questo è ciò che può fare la differenza tra un metodo statico "buono" e uno "cattivo".
Doc Brown,

2

Testare le classi che usano metodi statici pubblici può essere difficile, poiché non è (particolarmente) facile stub / falsificare / deridere i metodi statici. I metodi di istanza, d'altra parte, possono essere derisi facilmente, specialmente se sono virtuali o soddisfano un'interfaccia.

Tuttavia, non vedo alcun motivo per non utilizzare metodi statici privati. In effetti, c'è un leggero vantaggio in termini di prestazioni, poiché non è necessaria un'istanza della classe per occupare memoria.

D'altra parte, qualsiasi cosa statica è un po 'di odore di codice. È davvero una "classe di supporto"? Potrebbe essere che il metodo possa risiedere in modo più utile su una delle classi passate come parametro? La risposta a queste domande è spesso "va bene come statica" ma vale la pena ricordare.


La classe contenente il metodo statico sta già occupando comunque memoria. La tua paura della staticparola chiave sembra infondata.
Robert Harvey,
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.