2009-09-19 10 views
8

Ho notato recentemente che quando creo metodi privati ​​che impostano alcuni campi negli oggetti passati a loro, Resharper mostra un suggerimento che indica che il metodo può essere reso statico.La raccomandazione di Resharper è di rendere il mio metodo privato statico una buona raccomandazione?

Ecco un esempio molto semplificato del tipo di metodo che potrei avere.

private void MakeStatusTheSame(MyClass mc, MySecondClass msc) 
{ 
    mc.Status = msc.Status; 
} 

Quando ho un metodo come questo, Resharper fornisce una raccomandazione che il metodo può essere reso statico.

Cerco di evitare di rendere statici i metodi pubblici poiché rovinano il caos sui test unitari ... ma non sono sicuro che lo stesso valga per i metodi privati.

La raccomandazione di Resharper è una procedura valida valida o devo semplicemente disattivarla?

+2

I metodi pubblici sono totalmente testabili, * se non causano effetti collaterali. * –

risposta

11

Penso che sia sicuramente un candidato ideale per un metodo statico. Non è modificare alcuna delle proprietà della classe, campi, ecc

Ecco un esempio:

class MyClass 
{ 
    public static void MakeStatusTheSame(MyClass mc, MySecondClass msc) 
    { 
    mc.status = msc.status; 
    } 

    private void MakeStatusTheSame(MySecondClass msc) 
    { 
    this.status = msc.status; 
    } 

    private int status; 
} 

Inoltre, si potrebbe rendere un metodo di estensione (che sarebbe anche statico):

public static class Extensions 
{ 
    public static MyClass MakeStatusTheSame(this MyClass mc, MySecondClass msc) 
    { 
    mc.status = msc.status 
    return mc; /* make the method chainable */ 
    } 
} 
7

Penso di sì; visto che un metodo è statico è una chiara indicazione che il metodo dovrebbe non interagire con qualsiasi membro di istanza.

Immaginare di eseguire il debug di un metodo non statico e realizzare che l'istanza non viene toccata. Odore istantaneo, e se non c'è un commento che spiega cosa fa la funzione, potresti essere distratto dal vero problema.

+2

+1 per chiarire che il metodo non deve interagire con i membri dell'istanza. Voglio assolutamente che la gente ci pensi due volte prima di modificare quel particolare codice con le chiamate ai metodi sui membri di istanza. Marcando il metodo privato statico se qualcuno ha modificato il codice per usare un membro di istanza, otterrebbe un avviso di compilazione che dovrebbe almeno farli riflettere per qualche secondo. – mezoid

+0

Ho avuto R # consigliare di rendere un metodo statico solo pochi minuti fa, solo per trovare un errore di compilazione cercando di accedere a un campo di istanza. La prima volta che è successo, qualcosa deve averlo confuso. – ProfK

+0

Cosa intendi per interazione? Modifica dei valori? O questo include la lettura dei valori? – guiomie

4

Di solito vado con la raccomandazione di R #. È un metodo privato, quindi (si spera) non si scrivano test unitari contro di esso. Rendendolo statico afferma esplicitamente che non usa alcun membro di istanza, il che rende più facile ispezionare gli effetti collaterali.

8

A rischio di sembrare un contrarian, devo ammettere che non mi piace mescolare metodi statici con metodi di istanza; e non mi piacciono i metodi statici in generale. I metodi statici sono difficili da testare, difficili da sovrascrivere e difficili da mantenere. Preferisco applicare tutti i metodi statici per gestire gli oggetti Foo in una singola classe FooUtils o, meglio ancora, in un'istanza singleton di una classe FooSomethingDoer.

Naturalmente, in alcuni casi i metodi statici hanno perfettamente senso - ad esempio, quando si creano i singleton o le fabbriche, ecc., Non sto dicendo che tutti i metodi statici sono fatti di puro male; Preferisco semplicemente sbagliare dal lato di evitarli quando possibile.

+0

Sono con te. Rendo i metodi statici solo quando ha senso, non solo perché "posso". – Josh

+1

Sarei d'accordo per il pubblico, protetto e interno - ma non per i metodi privati. C'è qualche discussione in rete se le classi Utils sono un odore di codice; Suggerirei di usarli con cura. – TrueWill

+0

concordato. Rendere statico un metodo è un tentativo di comunicare informazioni relative all'utilizzo di quel metodo. Rendere statico tutto non ha senso. –

Problemi correlati