I tipi di nidificazione sono considerati pratiche scorrette?

7

Come notato dal titolo, i tipi di nidificazione (ad esempio tipi o strutture enumerati in una classe) sono considerati pratiche scorrette o no? Quando si esegue l'analisi del codice in Visual Studio, viene restituito il messaggio seguente che implica:

Warning 34 CA1034 : Microsoft.Design : Do not nest type 'ClassName.StructueName'. Alternatively, change its accessibility so that it is not externally visible.

Tuttavia, quando seguo il consiglio dell'analisi del codice, trovo che ci siano un sacco di strutture e tipi enumerati che fluttuano nell'applicazione che potrebbero applicarsi solo a una singola classe o che verrebbero utilizzati solo con quella classe. In quanto tale, sarebbe opportuno annidare il tipo sin quel caso, oppure esiste un modo migliore di farlo?

    
posta rjzii 11.01.2011 - 15:34
fonte

4 risposte

15

I tipi annidati non sono male. L'avviso che stai ricevendo non sta suggerendo di non avere mai un tipo annidato. Sta semplicemente indicando che il tuo tipo annidato dovrebbe usare un modificatore di accesso e un percorso di codice appropriati.

Se il tipo annidato è realmente usato solo all'interno della classe contenente (cioè è un contenitore di dati interno o indicatore di stato), quindi imposta il suo modificatore di accesso su privato.

Se il tipo annidato fa parte di una o più firme del metodo, allora non è in effetti locale alla classe contenitore. Rappresenta un messaggio passato o proveniente da istanze della classe contenente. In questo caso, è decisamente meglio spostare il tipo nidificato fuori dalla classe contenente e dargli un modificatore di accesso più aperto come interno o pubblico.

In breve, sembra che l'avviso consigli di rendere privati i tipi locali e i tipi condivisi dovrebbero essere indipendenti.

    
risposta data 11.01.2011 - 16:21
fonte
1

Se è usato esclusivamente da quella classe, dovrebbe essere reso privato e questo è esattamente ciò che il messaggio suggerisce.

    
risposta data 11.01.2011 - 15:37
fonte
0

No

Un buon esempio in C # è IEnumerable in cui altre classi non hanno bisogno di conoscere la classe esatta restituita, solo che è un IEnumerator. Quindi ha senso renderlo una classe nidificata altrimenti potresti avere un sacco di piccole classi che fluttuano in intellisense che implementa IEnumerator

    
risposta data 11.01.2011 - 17:28
fonte
-1

L'avvertimento sui tipi di nidificazione era uno dei primi "suggerimenti" che ho ricevuto qualche tempo fa dopo aver abilitato l'analisi del codice. È stato anche il motivo per cui l'ho spento.

Alcuni suggerimenti sono davvero strani come se provenissero da un altro pianeta.

Metto l'enumerazione all'interno delle classi per mantenere logicamente le cose insieme.

Pensa in questo modo: se i tipi di nidificazione fossero stati il male assoluto in tutti i casi, perché i progettisti linguistici l'avrebbero implementato in primo luogo? Perché è utile in molti casi e, a tale proposito, il suddetto avvertimento è semplicemente una precisazione che qualcosa nel tuo codice potrebbe non essere ottimale. Se si applica o meno dipende da te decidere.

    
risposta data 11.01.2011 - 15:39
fonte

Leggi altre domande sui tag