Déjeme darle un ejemplo del uso de clases anidadas que podrían aclarar cuándo este tipo de arquitectura es apropiada. Hace poco tuve que generar una tabla HTML tirando de columnas seleccionadas de una tabla de datos y "pivotándolas" para que las filas se convirtieran en columnas y viceversa.En mi caso, hubo dos operaciones esenciales: pivotar los datos y generar un resultado bastante complejo (no solo estaba mostrando los datos: cada fila de columna/tabla de datos estaba sujeta a operaciones para extraer el título, generar etiquetas de imagen, configurar enlaces, etc. por lo tanto, usar un Pivot de SQL tampoco era realmente correcto).
Después de un intento inicial de crear una clase para hacer todo, reconocí que gran parte de los datos/métodos caía en tres particiones distintas: procesamiento de encabezado, procesamiento de fila y pivoteo. Por lo tanto, decidí que un mejor enfoque sería encapsular la lógica para "encabezado" y "fila" en clases separadas, anidadas. Esto me permitió separar los datos contenidos en cada fila y programar las operaciones de pivote de forma muy limpia (llamando a un objeto de fila separado para cada columna en su tabla de datos). Al final de las operaciones de pivote, generé la salida llamando al objeto de encabezado y luego a cada objeto de fila para generar su salida de vuelta a la clase principal.
Las clases separadas no eran apropiadas porque A) las clases anidadas necesitaban algunos datos de la clase maestra y B) el procesamiento era muy específico y no era útil en ninguna otra parte. Solo programar una clase grande era simplemente más complicado debido a la confusión que rodeaba a los términos como "columna" y "fila", que diferían dependiendo de si hablabas de datos o de salida de HTML. Además, este fue un trabajo inusual en el sentido de que estaba generando HTML en mi clase de negocios, así que quería separar la lógica empresarial pura de la generación de IU. Al final, las clases anidadas proporcionaron el equilibrio perfecto, entonces, de la encapsulación y el intercambio de datos.
¿Es esto verdad? De mi prueba, la clase Y no puede acceder a los detalles de la clase X. ¿Cómo sería eso posible? – Nitax
No importa, acaba de encontrar http://blogs.msdn.com/b/oldnewthing/archive/2006/08/01/685248.aspx – Nitax