una sharp que parciales parcial metodo ejemplo definicion classes clases clase c# .net vb.net design

sharp - ¿Las clases parciales de C#son malas?



public partial class definicion (15)

¿Puede explicarme cuándo habría una razón legítima para usar alguna vez una clase parcial?

Las versiones recientes de Visual Studio usan clases parciales para separar el código del diseñador generado automáticamente de su propio código.

Un ejemplo de ASP.NET:

  • Page.aspx
  • Page.aspx.cs <- Su código
  • Page.aspx.Designer.cs <- Una clase parcial que contiene el código generado automáticamente.

Un ejemplo de WinForms:

  • Form1.resx
  • Form1.cs <- Su código
  • Form1.Designer.cs <- Una clase parcial que contiene código generado automáticamente

Me pregunto por qué el concepto de "clase parcial" existe incluso en C # / VB.NET. Estoy trabajando en una aplicación y estamos leyendo un libro (realmente muy bueno) relacionado con la plataforma de desarrollo que estamos implementando en el trabajo. En el libro, el autor proporciona una gran base de código / envoltorio alrededor de la API de la plataforma y explica cómo lo desarrolló, ya que enseña diferentes temas sobre el desarrollo de la plataforma.

De todos modos, para abreviar, usa clases parciales, en todas partes, como una manera de falsificar herencia múltiple en C # (IMO). Por qué él no dividió las clases en múltiples y usó composición, me supera. Tendrá 3 archivos de "clase parcial" para componer su clase base, cada uno con 3-500 líneas de código ... Y lo hace varias veces en su API.

¿Encuentras esto justificable? Si fuera yo, habría seguido el SRP y creado varias clases para manejar diferentes comportamientos requeridos, luego creé una clase base que tiene instancias de estas clases como miembros (por ejemplo, composición). ¿Por qué MS incluso incluyó una clase parcial en el marco? Quitaron la capacidad de expandir / colapsar todo el código en cada nivel de alcance en C # (esto se permitió en C ++) porque obviamente solo permitía malos hábitos: la clase parcial es, IMO, la misma cosa. Supongo que mi pregunta es: ¿me pueden explicar cuándo habría una razón legítima para usar una clase parcial?

EDITAR: Soy consciente de que para Web / WinForms no hay otra opción. Pero fuera de esto? ¿Por qué MS no acaba de poner una palabra clave diferente para pegar clases combinadas de código genérico? ¿O hay realmente un escenario de diseño de fiar que lo amerite?

No me refiero a que esto sea un hilo de broma / guerra. Sinceramente, estoy buscando aprender algo aquí. ¿Cuándo deberían usarse las clases parciales en el diseño del código? Pregunta simple, no hay necesidad de cerrar

Gracias


¿Puede explicarme cuándo habría una razón legítima para usar alguna vez una clase parcial?

Una de las razones más legítimas y útiles es fomentar la separación del código generado automáticamente y sus propias extensiones personalizadas. Por ejemplo, es común tener un código de formulario generado automáticamente de algún tipo de diseñador, pero generalmente quiere agregarle su propio comportamiento específico. De esta forma, si regenera la parte de código automático, no está tocando la parte que tiene sus extensiones específicas.

Dicho esto, es muy posible tener demasiado de algo bueno. Algunos consejos:

  • No hagas tus clases partial por el simple hecho de ser partial .

  • No coloque clases parciales en ningún lado, excepto uno al lado del otro. Si tiene que saltar a una sección del proyecto sin relación alguna para ver la otra mitad de la clase, probablemente lo esté haciendo mal.

  • No use partial como técnica para oscurecer el tamaño de la clase. Si estás dividiendo tus clases con partial porque son demasiado grandes, debes revisar el Principio de Responsabilidad Individual .

  • Si tiene tres o más fragmentos partial para la misma clase, es casi una garantía de que está abusando parcialmente. Dos es el límite superior típico de razonabilidad, y generalmente se usa para segmentar el código generado automáticamente a partir del código escrito a mano.

De todos modos, para abreviar, usa clases parciales, en todas partes, como una manera de falsificar herencia múltiple en C # (IMO). Por qué él no dividió las clases en múltiples y usa la composición me supera. Tendrá 3 archivos de "clase parcial" para componer su clase base, cada uno con 3-500 líneas de código ... Y lo hace varias veces en su API.

Sí, eso es definitivamente un claro abuso de partial .


Acabo de tropezar con este hilo al buscar en Google los beneficios de la clase parcial. Estoy en el proceso de convertir una aplicación Java EE en una versión .NET de Silverlight. Encontré el siguiente código en la capa de vista:

//------------------------------------------------------------------------------ // <auto-generated> // This code was generated by a tool. // Runtime Version:4.0.30319.225 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // </auto-generated> //------------------------------------------------------------------------------ ... public partial class Wwcusts04d : System.Windows.Controls.Page {

Ahora, si la página parcial en sí misma se autogenera, ¿para qué sirve mantenerla? Además, el código dentro solo vincula varios controles a sus nombres. No confieso que tengo conocimiento de Silverlight, pero ¿no es mejor esto en xaml?


Estoy totalmente de acuerdo con John''s respuesta John''s . Pero daría un paso más.

  • No hagas tus clases parciales.

El único uso de clases parciales que puedo pensar que consideraría "buen diseño" es con código generado automáticamente. Cualquier otro uso es casi seguro que divide innecesariamente tu clase. (De hecho, puedo ver que Jeff''s segundo punto de Jeff''s sobre las clases anidadas es posiblemente un uso válido)

Personalmente, creo que este libro que estás leyendo suena como un mal diseño, sin embargo, considero que puede estar usando clases parciales para poder mostrar una pequeña parte del código a la vez en lugar de simplemente presentar toda la clase de una vez.


Hay dos razones por las que usaría (y haré) clases parciales.

  1. Para separar partes generadas automáticamente del código (como el código del diseñador de WinForms o la salida T4).
  2. Para permitir que los tipos anidados tengan su propio archivo mientras logran la encapsulación requerida por su diseño.

Actualizar
Puedo ver que algunos no están convencidos acerca de mi segundo punto, así que déjenme darles un ejemplo; ListViewItemCollection en el marco. Está muy bien anidado bajo ListView porque es solo para uso de ListView , pero para facilitar el mantenimiento, le daría su propio archivo usando clases parciales. No veo esto como un mal diseño o un mal uso de la palabra clave partial .

Para obtener más información, revise la pregunta que este duplica: Clases parciales en C #


Hay mucha discusión sobre este tema, y ​​mucha gente dice que 1) es un mal diseño usar clases parciales, 2) que se usa para código autogenerado, y 3) que no debería tomar el lugar de la herencia.

Sin embargo, tengo una situación en la que parece que las clases parciales serán muy útiles: estoy creando una serie de aplicaciones que eventualmente se integrarán en un conjunto. Todos ellos tendrán un formulario principal que proporcionará cierta funcionalidad y varios componentes compartidos (por ejemplo, un formulario para mostrar informes). Si bien podría definir una clase base y heredar de ella, eso significaría una gran cantidad de reelaboración cuando llegue el momento de combinar todas las aplicaciones en la versión "empresarial" del producto.

Por lo tanto, las clases parciales son bastante útiles, porque puedo simplemente incluir las diversas clases parciales en la versión combinada, al mismo tiempo que me permite construir las versiones individuales e independientes del producto. Si tuviera que tratar de lograr esto utilizando la herencia, terminaría con cada componente llamando a su propia versión de los componentes comunes (por ejemplo, InvoiceReportViewer, PurchasingReportsViewer, etc.) en lugar de simplemente llamar a ReportsViewer y sabiendo que Visual Studio habrá integrado todos los bits para mi


He usado clases parciales de muchas maneras diferentes en el pasado. A medida que aprendo más sobre la programación y, en particular, sobre el concepto de "favorecer la composición sobre la herencia", puedo ver fácilmente la necesidad de disminuir tanto la herencia vertical como el uso excesivo de clases parciales.

Aparte del código autogenerado, no puedo pensar en un buen uso de las clases parciales. Incluso si usa EF y necesita metadatos diferentes, ni siquiera recomiendan usar parciales para metadatos. De hecho, si intentas duplicar cualquier propiedad en otro parcial (solo para agregar metadatos) obtendrás un error de compilación.

Cuanto más aprendemos sobre la refactorización y el SOC (Separation of Concerns), más pequeñas y centradas se vuelven nuestras clases. Por defecto, se vuelven a utilizar, lo que con el tiempo los hace a prueba de balas y de fácil comprobación. Solo di NO a los programas gigantescos. Henry Ford aprendió este concepto a principios de los años 1900, los programadores comenzaron a aprenderlo 100 años después.

Usa la composición cuando puedas ...


He usado una clase parcial dos veces en VB.Net, y las dos veces fueron para la rara ocasión en que necesité el enlace tardío. Simplemente crea una clase parcial y desactiva Option Strict Off en la parte superior.


La clase parcial existe en el marco .Net únicamente para permitir que los diseñadores de Visual Studio (por ejemplo, el diseñador de Asp.Net y el diseñador de Windows Forms) generen código / desorden con sus clases, manteniendo el código generado en un archivo separado.

(Ver .NET Partial Classes vs. Herencia )

Si haces algo similar (generar código que necesita coexistir con el código escrito por el usuario), también podrías considerar que las clases parciales son útiles, pero no creo que Microsoft alguna vez haya tenido la intención de utilizar clases parciales como concepto de lenguaje para ser útil para nadie más que el equipo de Visual Studio.

No es tanto que usar clases parciales sea un mal diseño, es probable que no encuentres un uso para ellos.


Otra cosa a considerar, las clases parciales te obliga a crear diferentes nombres de archivos que contengan el mismo nombre de clase . Por ejemplo, tiene FactoryClass y está creando versiones parciales de este; Factory.designer.cs, Factory.data.cs y todos esos archivos tienen una clase llamada FactoryClass.

Si navegas a this pregunta; hay una this definida como:

La mejor práctica, sin embargo, es definir una clase por archivo y darle al archivo el mismo nombre que la clase (o estructura, etc.) que se está definiendo.


Otro buen uso para las clases parciales sería cuando se implementa el patrón abstracto de fábrica . Haga que el objeto raíz de fábrica sea parcial y luego coloque los métodos reales de fábrica en el mismo archivo que la clase que crea la fábrica.

EDITAR: las clases parciales también funcionan bien para las clases que interactúan con un archivo de configuración. Coloque el código que contiene los parámetros de configuración cerca del código que realmente usa el parámetro de configuración.


Otro uso legítimo de las clases parciales es ayudar a reducir el desorden del "servicio web monolítico" en WCF. Desea dividirlo en grupos lógicos de funcionalidad, pero no desea tener que crear una resma de instancias de servicio individuales / puntos finales (presumiblemente porque comparten estado, recursos, etc.).

¿La solución? Haga que el servicio implemente múltiples interfaces e implemente cada interfaz en su propia clase parcial. A continuación, asigne diferentes puntos finales en la configuración a la misma implementación física. Hace que el proyecto sea mucho más fácil de mantener, pero aún así solo tienes un punto final físico.

En algunos casos, señalaría este tipo de enfoque como una práctica deficiente a causa del SRP, pero cuando se trabaja con servicios de WCF o servicios web en general, no es tan simple. Debe equilibrar los requisitos de diseño interno con los requisitos de consumo externo.


Solo para agregar a las respuestas anteriores que mencionaban la separación del código generado del código personalizado, encontré que las clases parciales son útiles para extender conjuntos de datos fuertemente tipados.


Un uso menos común podría ser dividir una gran clase en archivos físicos separados para facilitar la vida desde el punto de vista del control de fuente. Acabo de unirme a un proyecto que contiene algunas clases de servicios web enormemente infladas que se ejecutan en miles de líneas de código y con métodos relacionados con varias funciones comerciales diferentes.

La fusión de varias ramas de características es una pesadilla debido a que diferentes equipos realizan cambios simultáneos no relacionados en el mismo archivo. No puedo dividir el servicio web sin hacer algunos cambios importantes, pero dividir la clase en clases parciales conserva el comportamiento exactamente y elimina un montón de problemas de fusión.

Definitivamente no estoy fomentando lo anterior como una opción de diseño, pero fue una buena victoria rápida para nosotros, y demuestra que los parciales no son malvados todo el tiempo ...


Utilicé clases parciales para separar físicamente los métodos de acceso a datos estáticos de las propiedades y métodos de la clase de negocios en una arquitectura de registro activa. Por ejemplo, teníamos clases parciales Company y CompanyData una al lado de la otra. La ventaja era que un archivo era el POCO y el otro contenía solo métodos de acceso a datos. Este fue un trampolín para eliminar el acceso a los datos a las clases de repositorio en una aplicación heredada. Creo que fue un uso legítimo, ciertamente hizo que el proceso de reorganización fuera más sensato.