2008-10-02 26 views
14

¿Hay buenos usos de las clases parciales fuera de los escenarios de códigos generados por webforms/winforms? ¿O es esta característica básicamente para apoyar eso?Clases parciales en C#

Respuesta

11

En parte se trata de admitir escenarios (WebForms, WinForms, LINQ-to-SQL, etc.) mezclando código generado con código de programador.

Hay más razones para usarlo. Por ejemplo, si tiene grandes clases en archivos grandes y poco manejables, pero las clases tienen grupos de métodos lógicamente relacionados, las clases parciales pueden ser una opción para hacer que los tamaños de sus archivos sean más manejables.

+17

"si tiene grandes clases en archivos grandes, poco manejables" Entonces realmente necesita reconsiderar su diseño. –

+0

bueno, esto depende de su definición de grande y difícil de manejar, así como de su tolerancia para desplazarse por todo el lugar para ver lo que está tratando de ver, así como también su capacidad para utilizar pantallas/paneles múltiples/divididos para ver su trabajo. análisis muy subjetivo; Tengo que estar en desacuerdo, Fredrik ... –

+1

@sweeney: Si decides que tus clases son grandes y difíciles de manejar para considerar parciales, entonces son probablemente lo suficientemente grandes y poco manejables para considerar tu diseño, sin importar cuál sea tu métrica para "grande" y difícil de manejar "es. –

3

LINQ to SQL hace un buen uso de las clases parciales para extender el código generado por el diseñador. Creo que normalmente encontrará este patrón de clases parciales que utiliza el código creado por el diseñador.

1

Donde estoy tengo un programa que maneja los archivos entrantes de los clientes. Está configurado para que el código de cada cliente esté en su propio proyecto de biblioteca de clase, que sabe cómo manejar cualquier formato que el cliente decida usar.

El código principal utiliza las bibliotecas definiendo una interfaz bastante extensa que debe implementar una clase en la biblioteca (probablemente debería haber algunas interfaces diferentes, pero es demasiado tarde para cambiarla ahora). A veces eso implica mucho más código en la misma clase de lo que normalmente consideramos prudente. Las clases parciales nos permiten dividirlas un poco.

6

Uso las clases parciales como medio para separar los diferentes sub elementos de los controles personalizados que escribo. Además, cuando se utiliza con el software de creación de entidades, permite que productos como LLBLGen creen versiones de clases generadas, así como una versión personalizada editada por el usuario, que no será reemplazada si las entidades necesitan ser regeneradas.

3

Encuentro que las clases parciales son extremadamente útiles. Por lo general, se utilizan para poder extender clases autogeneradas. Los usé en un proyecto con pruebas de unidades pesadas. Mis clases de UT tenían dependencias complejas y no era muy práctico separar el código en varias clases. Por supuesto, es mejor usar la herencia \ composición, pero en algunos casos las clases parciales pueden ser útiles.

1

En UserControls que son relativamente complicados, puse el material de manejo de eventos en un archivo y la pintura y las propiedades en otro archivo. Las clases parciales funcionan muy bien para esto, por lo general, estas partes de la clase son relativamente independientes y es agradable poder editar pintura y manejo de eventos uno al lado del otro.

0

Corrección, como señaló Matt, ambos lados del parcial deben estar en el mismo conjunto. mi mal.

0

Lo uso en una capa de acceso a datos. Las clases generadas como el asignador y las consultas son parciales. Si necesito agregar un método mapper, por ejemplo, para hacer una carga elegante que no se genera, la agrego a la clase personalizada.

Al final, el programador que usa la capa de datos en la capa empresarial solo ve una clase con todas las funcionalidades que necesita. Y si la fuente de datos cambia, las partes genéricas se pueden generar fácilmente sin sobrescribir las cosas personalizadas.

0

Acabo de encontrar un uso para las clases parciales. Tengo una clase [DataContract] que uso para pasar datos al cliente. Quería que el cliente pudiera mostrar la clase de una manera específica (salida de texto). así que creé una clase parcial y anulé el método ToString.

5

A menudo utilizo clases parciales para dar a cada clase anidada su propio archivo.Hubo algunas arquitecturas en las que trabajé, donde la mayoría de la implementación solo era requerida por una clase y entonces anidamos esas clases en esa clase. Tenía sentido mantener los archivos más fáciles de mantener utilizando la capacidad de clase parcial y dividiendo cada uno en su propio archivo.

También los hemos utilizado para agrupar anulaciones de existencias o para ocultar un conjunto de propiedades. Ese tipo de cosas. Es una forma práctica de mezclar en un cambio de stock (simplemente copie el archivo y cambie el nombre de la clase parcial a la clase objetivo, siempre y cuando la clase objetivo también se haga parcial, por supuesto).

7

La generación de código fue la fuerza impulsora detrás de las clases parciales. La necesidad proviene de tener una clase generada por código que cambia constantemente, pero permite a los desarrolladores proporcionar código personalizado como parte de la clase que no se anulará cada vez que se realicen cambios que obliguen a la clase a regenerarse.

Tome WinForms o Typed-DataSets por ejemplo (o cualquier diseñador para el caso). Cada vez que realiza un cambio en el diseñador, serializa el código correspondiente en un archivo. Supongamos que debe proporcionar algunos métodos adicionales sobre los que el generador no sabe nada. Si lo agregó al archivo generado, sus cambios se perderían la próxima vez que se generara.

Un proyecto en el que estoy trabajando actualmente utiliza la generación de código para todas las entidades DAL, BLL y empresariales. Sin embargo, el generador solo nos obtiene el 75% de la información. La porción restante tiene que estar codificada a mano (lógica de negocios personalizada, por ejemplo). Puedo suponer que cada clase BLL tiene un método SelectAll, por lo que es fácil de generar. Sin embargo, mi cliente BLL también necesita tener un método SelectAllByLocation. No puedo poner esto en mi generador porque no es genérico para todas las clases BLL. Por lo tanto, genero todas mis clases como clases parciales, y luego en un archivo separado defino mis métodos personalizados. Ahora, cuando mi estructura cambie, o si necesito regenerar mi BLL por alguna razón, mi código personalizado no se borrará.

0

En ocasiones es posible que encuentre un código terriblemente antiguo en el trabajo que puede hacer casi imposible refactorizarlo en elementos distintos sin romper el código existente.

Cuando no se le da la opción o el tiempo para crear una arquitectura más genuina, las clases parciales hacen que sea increíblemente fácil separar la lógica donde sea necesaria. Esto permite que el código existente continúe usando la misma arquitectura mientras que usted gana un paso más cerca de una arquitectura más concreta.

1

Trabajé en un proyecto hace un par de años donde teníamos una clase de DataSet tipada que tenía un montón de código en ella: Métodos en los DataTables, métodos en TableAdapters, declaraciones de instancias de TableAdapter, lo que sea. Era un punto central masivo del proyecto en el que todos tenían que trabajar a menudo, y había mucha contención de control de fuente sobre el archivo de código de clase parcial.

Así que dividí el archivo de código en archivos fix o seis de clase parcial, agrupados por función, para que pudiéramos trabajar en piezas más pequeñas y no tener que bloquear todo el archivo cada vez que teníamos que cambiar algo pequeño.

(Por supuesto, también podríamos haber resuelto el problema al no utilizar un sistema de control de la fuente exclusiva de bloqueo, pero eso es otro tema.)

0

cualquier lugar que han utilizado #region secciones antes, probablemente tiene más sentido como archivos separados en clases parciales.

Yo personalmente uso clases parciales para clases grandes donde los miembros estáticos van en un archivo y los miembros de la instancia van en el otro.

1

En general, lo considero un olor a código.

Si su clase es tan complicada, probablemente se pueda dividir en componentes reutilizables más pequeños.

O significa que no hay jerarquía de herencia donde debería haber una.

Para los escenarios de generación de código es bueno, pero creo que la generación de código es otro olor a código.

+0

Por curiosidad, ¿qué define como código de olor? –

+0

El uso excesivo del código olor es un olor a código. – Hogan

+0

¿Quiere decir que el uso del diseñador de Windows Forms, el diseñador de Entity Framework, etc. son olores de código? Ciertamente son casos de generación de código en uso. –

0

EDITAR: DSL Tools for Visual Studio utiliza clases parciales.

Por lo tanto, es una característica que utilizan muchos códigos generados automáticamente. En lugar de usar #region, el código generado automáticamente va a un archivo y el código de usuario (también llamado código personalizado) va a otro e incluso en diferentes directorios para que el desarrollador no se confunda con tantos archivos sin sentido.

Es bueno tener esta elección, que se pueden combinar - pero no obligados a utilizar -con la herencia

También, puede ser útil para separar la lógica de algunas clases entre varios directorios. Por supuesto, para las máquinas, es lo mismo, pero mejora la experiencia de legibilidad del usuario.

2

Como se mencionó anteriormente, yo también creo que este es un olor a código.

Si una clase es tan grande que debe dividirse en más archivos, significa que está rompiendo el principio de responsabilidad única y haciendo demasiadas cosas. La clase grande podría dividirse en clases más pequeñas que cooperen juntas.

Si tiene que usar clases o regiones parciales para organizar el código, considere si deberían estar en sus propias clases. Aumenta la legibilidad y obtendrías más reutilización de código.

4

Otro posible uso de las clases parciales sería aprovechar los métodos parciales para hacer que los métodos desaparezcan selectivamente mediante la compilación condicional; esto sería ideal para el código de diagnóstico de modo de depuración o los escenarios de pruebas de unidades especializadas.

Puede declarar un método parcial como un método abstracto, luego en la otra clase parcial, cuando escribe la palabra clave "parcial" puede aprovechar el Intellisense para crear la implementación de ese método.

Si rodea una parte con sentencias de compilación condicionales, puede cortar fácilmente el código de depuración o de prueba. En el ejemplo siguiente, en el modo DEBUG, se llama al método LogSomethingDebugOnly, pero en la compilación de lanzamiento, es como si el método no existiera en absoluto: una buena forma de mantener el código de diagnóstico alejado del código de producción sin una ramificación o múltiples bloques de compilación condicional.

// Main Part 
public partial class Class1 
{ 
    private partial void LogSomethingDebugOnly(); 

    public void SomeMethod() 
    { 
     LogSomethingDebugOnly(); 
     // do the real work 
    } 
} 

// Debug Part - probably in a different file 
public partial class Class1 
{ 

    #if DEBUG 

    private partial void LogSomethingDebugOnly() 
    { 
     // Do the logging or diagnostic work 
    } 

    #endif 
} 
+0

¿Tengo que poner el método LogSomethingDebugOnly() insinde la '// Main Part' o sería suficiente simplemente poner el método en' // Debug Part'? – surfmuggle

1

estoy al final del juego ... pero sólo mis 2 centavos ...

Un uso podría ser refactorizar una clase de dios existente en una base de código heredado existente a varias clases parciales. Podría mejorar la capacidad de detección del código, si se siguen las convenciones de nomenclatura adecuadas para los nombres de archivo que contienen las clases parciales. Esto también podría reducir el repositorio de código fuente: resolver y fusionar hasta cierto punto.

Idealmente, una clase divina debería dividirse en múltiples clases pequeñas, cada una con una sola responsabilidad. A veces es perjudicial realizar refactorizaciones medianas a grandes. En tales casos, las clases parciales podrían proporcionar un alivio temporal.

2

tal vez es demasiado tarde, pero por favor déjame añadir mis 2 centavos también:

* .Cuando trabajando en grandes proyectos, la difusión de una clase sobre archivos separados permite que varios programadores para trabajar en él al mismo tiempo.

*. Puede escribir fácilmente su código (para funcionalidad extendida) para una clase generada VS.NET. Esto le permitirá escribir el código de su propia necesidad sin interferir con el código generado por el sistema

Cuestiones relacionadas