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.