2010-06-29 24 views
10

Estoy pensando que si una clase será instanciada solo en otra clase, entonces es correcto usarla anidada en esa clase. Creo que esto nos ayudará con un buen diseño. Cuando miro mi proyecto, casi nunca lo he visto anidado estructura.Pero si trato de clases anidadas así que esta vez otras preguntas aparecen en mi mente.Por ejemplo¿Dónde y cómo usar clases anidadas?

Tengo clase de la Junta, Clases de movimiento como ShortCastle, LongCastle, EnPassant, Promote y Piezas como Peón, Reina, Torre, Knight, etc. Por lo tanto, es claro que las clases de la Junta crearán instancias de las clases de las piezas y las clases de las piezas crearán instancias de las clases de Mover. Para un buen diseño, la clase Promover movimiento debe estar anidada de Peón ya que solo el peón puede promoverse a sí mismo. Los Castillos cortos y largos deben ser anidados de Rey porque solo rey puede tener tales movimientos de tipo.

Tratando de poner todas las clases de Piece en la clase Board no está buscando un buen diseño porque la clase 8-9 estará dentro de la clase Board y realmente molesto será un archivo de clase Board demasiado grande y difícil de leer. Prefiero mantener cada clase de pieza en otro archivo. Es bueno que podamos crear una clase parcial de la Junta, pero aún así no es molesto. 8-9 ¿Los archivos de la clase de la Junta Parcial contendrán cada clase de pieza? ¿Es mejor no anidar? Lo mismo ocurre con las Piezas. ¿Crea otro archivo de Pieza parcial solo para otra clase de Tipo de movimiento? Si la clase anidada solo ocupa un espacio pequeño para que no haya ningún problema, pero si toma muchos métodos?

Respuesta

11

Creo que eres demasiado generoso con las clases anidadas. Eche un vistazo a la guía de diseño this para tipos anidados.

No utilice tipos anidados si lo siguiente es cierto:

  • El tipo debe ser instanciado por código de cliente. Si un tipo tiene un constructor público , probablemente no se debe anidar . El razonamiento detrás de esta guía es que si se puede instanciar un tipo anidado , indica que el tipo tiene un lugar en la biblioteca por sí mismo. Puede crearlo , usarlo y destruirlo sin usando el tipo externo. Por lo tanto, no debe estar anidado. Un tipo interno no debe reutilizarse ampliamente fuera de del tipo externo sin una relación con el tipo externo.
  • Las referencias al tipo son comúnmente declaradas en el código del cliente.

Las piezas pueden pertenecer a un tablero (¿Piece-collection as a member?) Pero podrían coexistir sin él. Usted podría, por ejemplo, quiere reutilizar tableros sin piezas (temas, etc.) y también reutilizar piezas sin una tabla (posiciones, etc.).

2

Los miembros privados de la clase principal son accesibles a los métodos de Clase Nexted.

La clase Nexted permite reducir la complejidad sin un alcance amplio.

0

Si realmente cree que las clases anidadas tienen sentido para su diseño (consulte las advertencias de Tim Schmelter) pero siente que el tamaño del archivo es demasiado grande, el uso de clases parciales es bueno para dividir las definiciones de clase anidadas en sus propios archivos. O si las clases anidadas son lo suficientemente pequeñas por sí mismas, pero tiene un gran número de ellas, coloque todas las clases anidadas en un solo archivo parcial.

Padre.CS:

public partial class Parent 
{ 
    void SomeMethod() 
    { 
     Nested1 n1 = new Nested1(); 
     Nested2 n2 = new Nested2(); 
    } 
} 

Nested.cs:

public partial class Parent 
{ 
    private class Nested1 
    { 

    } 
    private class Nested2 
    { 

    } 
} 
1

Para un buen diseño, Promueven la clase de movimiento debe estar anidada de Hipoteca porque sólo peón puede promocionarse.

Realmente no estoy de acuerdo. El hecho de que puede clases de nidos no significa que deba hacerlo. Pregúntese qué beneficio obtiene al anidar estas clases.

+0

Usted restringe las posibilidades de errores con este diseño. Ninguna de las otras piezas puede crear tal movimiento, incluso erróneamente. Este diseño no lo permite. ¿Estoy equivocado? – Freshblood

+0

Las clases profundamente anidadas limitan su alcance (lo que podría ser una restricción arquitectónica útil en ciertos escenarios), pero está adquiriendo una gran complejidad al principio de su proyecto. Yo recomendaría hacer "lo más simple que podría funcionar" y luego refactorizar a un diseño más complejo cuando surja la necesidad. Más tarde, si desea restringir desde dónde se pueden crear instancias de ciertas clases, podría dividir la solución en diferentes ensamblajes (creando proyectos de "Biblioteca de clases"). ¡Buena suerte! =) –

0

Las clases anidadas tienen su lugar, pero pueden ser confusas de trabajar. Encontré una página web que muestra cómo usar algunas clases .Net para obtener la salida JSON de Facebook de las publicaciones en el muro al http://www.virtualsecrets.com/graph-api-json-facebook-handler.html Lo que es interesante aquí es que las clases están anidadas dentro de las clases, dentro de otras clases, así que se puede hacer, solo una poco complejo. :)

+0

Por lo que entiendo que este artículo no trata sobre clases anidadas, solo se trata de objetos anidados. Es totalmente diferente. – Freshblood

Cuestiones relacionadas