2010-05-04 19 views
6

Here's una spiegazione della regola che sto cercando di capire. Ecco il codice semplificato che il Codice Analyzer si lamentava:CA1034: I tipi annidati non dovrebbero essere visibili

Public Class CustomerSpeed 

    Public Enum ProfitTypeEnum As Integer 
     NotSpecified = 0 
     FlatAmount = 1 
     PercentOfProfit = 2 
    End Enum 

    Private _ProfitTypeEnum As ProfitTypeEnum 

    Public Sub New(ByVal profitType As ProfitTypeEnum) 

     _ProfitTypeEnum = profitType 

    End Sub 

End Class 

Se l'enumerazione riguarda solo la classe, perché è una brutta cosa per renderlo un tipo contenuto all'interno della classe? Sembra più ordinato a me ...

Qualcuno sa che cosa si intende con la seguente riga ?:

tipi nidificati includono la nozione di membro di accessibilità, che alcuni programmatori non capiscono chiaramente

Utilizzando I namespace per raggruppare Class ed Enum non sembrano un modo utile per risolvere questo avvertimento, dal momento che vorrei che l'enum appartenesse allo stesso livello genitore del nome della classe.

risposta

4

Oltre ai problemi di usabilità e rilevabilità già trattati in altre risposte, esiste anche un potenziale problema di manutenibilità. Cosa succede nel giorno in cui scopri che il tuo enum è potenzialmente utile anche altrove? Spostarlo fuori dalla sua classe genitore sarebbe un cambiamento irrisorio, copiarlo introdurrebbe i suoi problemi di manutenibilità, e richiedere ai consumatori API di usarlo con un'altra classe inizia a diventare brutto. Perché non evitare questi potenziali problemi evitando sistematicamente enumerazioni annidate?

+0

Come sapete se avete letto abbastanza di ciò che ho scritto, non ho acquistato l'argomento di scoperta-abilità o usabilità, perché con Intellisense che funziona come in VS2005 piuttosto che nel 2010, non pensavo che fosse un problema.Ma il tuo nuovo pt, sono assolutamente d'accordo. L'ho considerato brevemente da solo, ma ho perso la concentrazione poiché non è stato portato da nessuno. Devo ammettere che non ho una difesa per questo argomento e non mi aspetto di averne uno dopo, quindi ... sono convinto solo su questa base. Mi sembra una ragione sufficiente per non incorporare le enumerazioni nelle lezioni. Grazie! – ChadD

1

Suppongo che indichi che il tipo annidato può essere confuso con la variabile statica perché entrambi appariranno in intellisense (completamento automatico) dopo ".".

Anche se si vede BCL (Base Class Library) di .NET, tutte le enumerazioni, anche se sono utilizzate solo in una classe, non sono nidificate, la ragione è, quando si desidera confrontare o creare un'istanza, la classe nomi + "." + i nomi enumerati saranno confusi come mostrato di seguito, anche Microsoft ha ragione che confonderà le persone.

- Esempio

class RootClass 
{ 
    enum NestedEnum 
    { 
     StaticItem = 0  
    } 

    static string NestedString = ""; 
} 


RootClass.NestedEnum <-- represents enum, 
RootClass.NestedString <-- represents static variable 

Uno è un tipo e l'altro è variabile, la maggior parte delle avvertenze MS Codice Analyzer sono per una migliore progettazione, però ha un grande eccezione per @George, se non vi piace, non lo usalo, vai avanti e disabilita gli avvertimenti. Puoi certamente usare grandi nomi di classi invece di spazi dei nomi, è semplicemente la tua scelta. Ma le buone capacità di programmazione riguardano il modo in cui gli altri considerano il tuo codice piuttosto che ciò che ti piace !!!

E gli spazi dei nomi sono lì per organizzare e con l'organizzazione scriviamo di meno, questo è tutto ciò che serve per fare più lavoro con meno sforzi. Ma se ti piacciono i grandi nomi, nessuno ti fermerà.

+0

Più grande per digitare? Man, il framework .NET è un enorme albero di namespace. Perché utilizzare gli spazi dei nomi quando questo ne causa uno per digitare di più?La risposta è, penserei, "Organizzarli in modo da poter trovare le cose!" Perché le enumerazioni in una classe sono diverse? La loro soluzione raccomandata è usare Namespace per organizzare. Questo approccio non riduce l'amt della digitazione richiesta ma per qualche motivo è "preferito". Quindi, sul punto di battitura che stai facendo, non lo compro. Per quanto riguarda confondere il tipo annidato con un tipo statico - non sono sicuro di aver capito. Con ttype statico, vuoi dire, ad esempio, una costante? L'enum è una costante! – ChadD

+0

Sì, mi rendo conto che posso disabilitarlo e sto mettendo in dubbio questo e usando l'analizzatore di codice in modo da poter migliorare le mie capacità di programmazione. Hai visto il mio cast dello schermo? In VS2005 intellisense ha fatto la digitazione per te. Non ti capisco di enum vs. static var. Come con qualsiasi metodo, devi guardare il tipo di ritorno della funzione, che viene visualizzato nel suggerimento. È possibile avere una funzione della classe RootClass che restituisce ancora un tipo di oggetto anotehr, sarebbe confusa e dovremmo avvisarci? Diamine no. La SM ha solo bisogno di far funzionare l'intellisense come ha fatto in, il mio cast dello schermo pubblicato. È utile .. – ChadD

+0

..funzione da incorporare. E la soluzione della soluzione è utilizzare gli spazi dei nomi, quindi il tuo punto di non digitare troppo spesso non è valido. Sospetto che abbia ragione probabilmente (solo perché qui sono in minoranza) ma non penso che tu abbia fatto una buona causa o che io sia frainteso. – ChadD

6

enumerazioni non sono in genere collocati nella classe che li utilizza, così la gente non sono abituati ad avere specificare dove l'enumerazione è:

Dim speed As New CustomerSpeed(CustomerSpeed.ProfitTypeEnum.FlatAmount) 

Posizionando l'enumerazione di fuori della classe rende più facile da usare:

Dim speed As New CustomerSpeed(ProfitTypeEnum.FlatAmount) 

L'enumerazione è ancora contenuta nello stesso spazio dei nomi della classe. Come indica la spiegazione dell'analisi, dovresti utilizzare gli spazi dei nomi per raggruppare i membri pubblici piuttosto che annidarli l'uno nell'altro.

+0

Bene, mi piace la tua risposta meglio, ma suppongo che non sono d'accordo con te e MS che questo include le enumerazioni in una classe è cattivo perché confonderà le persone che non sono abituate ad avere enumerazioni incorporate nelle classi. Penso che la soluzione sia rendere ovvio che l'enum sia incorporato (se così è) piuttosto che avventurarsi contro di esso. Mi sembra che quegli intellettuali per le enumerazioni non siano più automatici. Ad esempio, nella prima riga di codice che hai digitato dove installi un nuovo oggetto CustomerSpeed, indipendentemente dal fatto che l'enum sia incorporato o meno, intellisense non presenta una lista ristretta – ChadD

+0

.. di soli valori enum. Sebbene l'intellisense mostri la gerarchia di namespace qualificata del param prevista, potrebbe anche aiutarti fornendo un elenco di soli valori di tipo ProfitTypeEnum. Mi sembra che Intellisense abbia fatto un passo indietro con VS2010 (in questo caso, generalmente migliorato) – ChadD

+0

Il buon intellisense (oltre alle informazioni del tooltip param già fornite) risolverebbe il problema con l'utente che non si aspettava di qualificare l'enum. HEY ... Prova solo questo 2008. Sono abbastanza sicuro che funzionerà nel 2008, come ho descritto dovrebbe nel 2010. – ChadD

Problemi correlati