2010-07-09 5 views
16

Mi prefisso dicendo che capisco che sia Code Analysis che StyleCop sono intesi come linee guida, e molte persone hanno scelto di ignorarli comunque. Ma detto questo, mi piacerebbe vedere quale sia il consenso generale riguardo a queste due regole.CA1500 vs. SA1309 - Quale si vince?

Rule CA1500 dice non rendere i nomi dei parametri e i nomi di campi privati ​​uguali.

Rule SA1309, d'altra parte, non anteporre prefissi ai membri con trattino basso o "m_".

Questo ci lascia poche opzioni per distinguere i campi di backing privati ​​dai parametri corrispondenti. Prendi questi esempi.

SA1309 si lamenta:

class SomeClass 
{ 
    int _someField; 

    public SomeClass(int someField) 
    { 
     this._someField = someField; 
    } 
} 

CA1500 si lamenta:

class SomeClass 
{ 
    int someField; 

    public SomeClass(int someField) 
    { 
     this.someField = someField; 
    } 
} 

Quali opzioni ho? Non voglio rendere il campo di supporto privato PascalCase, perché questa è la convenzione (credo abbastanza universale) per campi/proprietà pubblici. E non voglio rinominare l'uno o l'altro, solo per il gusto di risolvere l'ambiguità.

Quindi mi rimane uno dei due precedenti, il che richiederebbe la soppressione di una delle regole SA/CA.

Cosa fate tipicamente voi ragazzi? E, cosa più importante, cosa pensano che dovresti fare gli autori di queste regole (dato che non forniscono soluzioni alternative nella loro documentazione)?

+0

il tuo primo esempio non verrà compilato, i nomi sono incasinati :) –

+0

Normalmente violare CA1500. Ma ho solo Pro, senza TFS, quindi non vedo mai l'avviso. :) –

+0

Violare CA1500 continuamente ma non ho mai ricevuto un avviso fino a quando è abilitato CA1500. C'è qualcosa di magico in questa regola? – Albic

risposta

20

Noi spegnere SA1309. Il ragionamento dietro è abbastanza debole.

Il nostro team ritiene che la pratica ben accettata dei membri privati ​​che iniziano con i trattini bassi superi di gran lunga l'idea che qualcuno possa utilizzare un editor diverso nel codice, che comunque non accade mai nel nostro negozio. Per quanto riguarda la "differenziazione immediata", anche il trattino basso lo fa.

Se davvero gli sviluppatori usano ancora "m_" e se è ancora necessario verificarlo, è possibile scrivere una regola rapida per questo.

+0

Grazie, questo sembra essere l'approccio più logico. –

2

Sulla base di ciò che ho visto da Microsoft, dico che vince CA1500.

Se si guarda il BCL, la maggior parte del codice prefigura i campi locali con un trattino basso.

+1

Ma è quel vecchio codice? Le convenzioni venivano * inventate * mentre era scritto il BCL. –

+0

@Stephen Cleary - L'ho visto in codice come nuovo come 3.5. –

+1

e ho letto il codice nel BCL che vorrei castigare i programmatori per scrivere ... :) Solo dire, solo perché qualcuno all'interno di Microsoft non significa che sia giusto - o addirittura raccomandato da Microsoft nel suo complesso. –

3

Qui è la mia solita soluzione:

class SomeClass 
{ 
    int SomeField{get;set;} 

    public SomeClass(int someField) 
    { 
     SomeField = someField; 
    } 
} 
+0

Uso anche le proprietà auto-implementate quando possibile (che è la maggior parte del tempo), ma ci sono casi in cui ho campi privati ​​senza esporli come proprietà pubbliche. –

+0

Per i casi in cui non è possibile utilizzare una proprietà auto-implementata, potrebbe essere utile una variabile membro più descrittiva, evitando così lo scontro CA con il nome del parametro. –

-1

L'unica alternativa che riesco a pensare sembra che soddisfi entrambe le regole e che in realtà ho visto usato ovunque sia qualcosa di simile al seguente. Non seguo personalmente questa convenzione, perché mi sembra goffo.

public class Class1 
{ 
    // prefix private fields with "m" 
    private int mValue1; 

    public int Value1 
    { 
     get { return mValue1; } 
     set { mValue1 = value; } 
    } 

    private string mValue2; 

    public string Value2 
    { 
     get { return mValue2; } 
     set { mValue2 = value; } 
    } 

    // prefix parameters with "p" 
    public bool PerformAction(int pValue1, string pValue2) 
    { 
     if (pValue1 > mValue1) 
     { 
      mValue2 = pValue2; 
      return true; 
     } 
     else 
     { 
      return (mValue2 == pValue2); 
     } 
    } 
} 
+1

Ciò interromperà SA1305 "FieldNamesMustNotUseHungarianNotation". Questo [collegamento] (http://blogs.msdn.com/b/sourceanalysis/archive/2008/05/25/configuring-hungarian-notation-rules.aspx) mostra come modificare StyleCop per consentire determinati prefissi. Il contenuto è anche nella guida di StyleCop. – AllenSanborn

+0

Ibid. Usare una 'm' è altrettanto tribale quanto '_'. Smetti di provare a definire la tua lingua. –

-2

Non c'è conflitto. Cambia il nome del parametro.

public class SomeClass 
{ 
    private int namedField { get; set; } 

    public SomeClass(int differentlyNamedField) 
    { 
     this.namedField = differentlyNamedField; 
    } 
} 
+0

Non so perché i downvotes. Le due regole nella domanda non sono affatto in conflitto. Qualsiasi altra risposta sarebbe "basata principalmente sull'opinione pubblica" - il che richiederebbe la chiusura della domanda a causa di tale circostanza. – frattaro

0

semplice, utilizzare il suffisso 'campo' per i campi privati ​​quando c'è una classe:

private Int32 counterField; 

public Int32 Field 
{ 
    get 
    { 
      return this.counterField; 
    } 

    set 
    { 
      if (this.counterField != value) 
      { 
       this.counterField = value; 
       this.OnPropertyChanged("Counter"); 
      } 
     } 

e si può soddisfare entrambe le regole. Decorare le tue variabili con qualsiasi carattere o prefisso ungherese è tribale. Tutti possono trovare una regola che non gli piace in StyleCop o FXCop, ma uno standard funziona solo quando tutti lo usano. I vantaggi di uno scrubber automatico di codice superano di gran lunga i tuoi personali contributi "artistici" alla lingua.

Problemi correlati