Mejores prácticas: Cuando no / usar clases parciales


He estado usando el modificador de clase parcial durante algún tiempo para poner clases auxiliares en su propio archivo.

Hoy tenemos un nuevo tipo y dijo que el último equipo con el que trabajó no permitía clases parciales para esto porque modificar una clase auxiliar que está en un archivo separado causaría que el archivo de clase parcial principal se saliera de control con los cambios. Además, solo se les permitía poner clases auxiliares dentro de la clase principal como último recurso para que todo permaneciera disociar.

¿Qué piensas? ¿Hay algún problema usando clases parciales como esta o se reduce a preferencia?

Por ejemplo, normalmente tengo algo como esto:

  • Clase principal.cs
  • Clase principal.Helper1.cs
  • Clase principal.Helper2.cs

...

// Inside of MainClass.cs I have code like this:

public abstract partial class MainClass
{
    // ...
}

// Then in the MainClass.Helper1.cs I have:

partial class MainClass
{
   private class Helper1
   {
       // ...
   }
}
Author: Wayne Bloss, 2008-12-09

10 answers

Las clases parciales son principalmente para el uso de generadores de código, como los diseñadores, pero utilizo el enfoque que ha citado, en particular cuando un objeto implementa múltiples interfaces (no triviales), me parece útil dividirlo 1 archivo por implementación de interfaz. También comúnmente tengo un archivo para los métodos estáticos, que generalmente son lo suficientemente diferentes de los métodos de instancia para garantizar la separación.

 25
Author: Marc Gravell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-08 23:50:17

Personalmente no puedo ver nada malo en usar clases parciales como esta, pero esa es solo mi propia opinión. Lo único que podría parecer una "mala práctica" es nombrar a sus clases "Helper1" y "Helper2" (pero eso podría ser un ejemplo solo para aclarar).

Si estás usando clases parciales como esta, echa un vistazo a la (gratis) addin VSCommands (para Visual Studio 2008) que hace que sea muy fácil agrupar archivos en el explorador de soluciones (al igual que los archivos de diseñador) sin edición del archivo de proyecto.

 7
Author: Patrik Svensson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-08 23:10:29

Respuesta Corta: Si todas las clases son su código, realmente no necesita clases auxiliares, lo que invalida su necesidad de parciales.

Respuesta Larga: No estoy seguro de que haya algo que diga que su práctica está explícitamente equivocada. Desde mi experiencia, si tienes varios archivos diferentes que componen toda la clase, necesitas una buena razón para hacerlo, porque:

  1. Las clases parciales reducen un poco la legibilidad
  2. Si sus clases tienen varias clases auxiliares dentro de ellos, puede ser un síntoma de un diseño pobre, no creo que nunca me haya encontrado con una situación en la que me vi obligado a escribir clases de ayuda para las clases que creé.

Sin embargo, creo que la mejor razón para usar clases parciales es la generación de código, donde desea poder volver a generar un archivo sin perder el trabajo personalizado.

 4
Author: Zachary Yates,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-08 23:10:36

En realidad he hecho lo mismo. Como se ha dicho, hay un ligero golpe de legibilidad al descifrar las clases parciales.

El desacoplamiento es la razón principal por la que me gusta esta solución. Una clase interna privada está mucho menos acoplada a todo lo demás, porque nada más puede verla o usarla (aunque pueden estar hablando del potencial para que acceda a los datos privados de la clase padre, lo que generalmente sería una mala idea).

 2
Author: Neil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-09 00:10:51

En mi experiencia, no hay diferencia entre la clase noramal y la clase parcial.Si su diseño requiere una estructura grande de clase o implementar más interfaces, opte por la clase parcial. Como sea, ambos son iguales.

 2
Author: Pitambar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-28 02:19:14

No soy un gran fan de las clases parciales y no las uso yo mismo.

La única vez que los encuentro útiles y está bien usarlos es cuando desea agregar algo al código de LINQ to SQL designer, pero aparte de eso encuentro que si está distribuyendo el código en diferentes archivos solo por el bien de él, puede hacer que sea muy difícil de leer y administrar.

Tal vez si usted tiene clases divididas en muchos archivos tal vez sus clases están haciendo mucho... solo un pensamiento:)

 1
Author: Nathan W,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-08 23:09:49

Creo que si las clases anidadas son lo suficientemente grandes como para sentir la necesidad de dividirlas en sus propios archivos, probablemente no deberían ser clases anidadas. Conviértelos en miembros internos del mismo espacio de nombres que MainClass.

Las clases parciales realmente solo existen para soportar generadores de código y usarlas para dividir el código escrito por el programador en trozos manejables es un indicador de diseño deficiente.

Ver este artículo para un ejemplo hilarante de lo que no debe hacer con clases parciales.

 1
Author: Andrew Kennan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-08 23:42:23

Normalmente nunca uso clases parciales por razones similares mencionadas anteriormente.

Pero! Aunque no es frecuente, a veces he encontrado que las pruebas unitarias extensivas de una clase (generalmente clases externas) conducen a clases gigantes de prueba unitaria. Dividir la clase de prueba unitaria en clases parciales hace que sea un poco más fácil para los ojos y para entender.

Similar a la idea de agrupación cuando se hereda de múltiples interfaces, la prueba unitaria se puede agrupar para funciones.

 1
Author: Choco Smith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-18 10:39:45

Creo que es bueno recordar que el comportamiento predeterminado de su herramienta es crear una forma de Acoplamiento de bajo nivel, no Cohesión; y verlo con escepticismo, y anularlo a menos que tenga sentido por algunas de las razones específicas enumeradas anteriormente. Pero no es un buen comportamiento predeterminado.

 0
Author: dkretz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-09 00:36:16

La mayoría de las veces uso clases parciales solo con generación de código, por lo que puedo extender los comportamientos de mis clases en clases separadas que necesitan cierta personalización y no incluyen en la generación de código.

 0
Author: Samnang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-09 04:33:58