2009-06-26 25 views
5

bien, así que tienen una utilidad aquí en el local que genera clases de modelo de negocio de nuestros tablas de bases de datos y puntos de vista, similar a (pero no del todo exactamente como) un ORM. Al mantenerlo, se me ocurrió que los datos en los esquemas probablemente no cambiarán mucho. La funcionalidad, sin embargo, podría. Es posible que deseemos agregar funcionalidad adicional en el futuro. Es posible que deseemos generar parte de esa funcionalidad, y es posible que deseemos ampliarla..NET clases parciales frente a la herencia

Las clases que estamos construyendo residirán en una biblioteca de clases para el consumo de otras bibliotecas y aplicaciones. No es una gran sorpresa allí. Pero el stumper aquí es cómo diseñar las clases generadas de tal manera que interrumpamos el menor código posible cuando regeneramos una clase. Si, por ejemplo, el código se ha agregado a una propiedad (que representa una columna en una tabla de base de datos), no queremos perder eso.

Por lo tanto, hay dos enfoques que saltan a la mente: la herencia

clásico, donde toda la cosa se hace de una sola clase, "monolítico" y los consumidores son libres para anular la implementación base. Sin embargo, esto resulta algo complicado de vez en cuando, y con frecuencia presenta dolores de cabeza de casting. Además, si la clase derivada no tiene cuidado y olvida invocar la funcionalidad de la clase base, las cosas pueden ir mal rápidamente.

clases parciales. En este esquema, separamos el objeto comercial en distintas partes: las propiedades (que se asignan a las columnas) y los comportamientos. Los comportamientos incluso podrían dividirse en conductas generadas y comportamientos personalizados. El problema con este enfoque, como puede ver, es su complejidad inherente. Además, está el problema de denominación.

Aquí está mi pregunta para ustedes: cuando se trata de un escenario como este (si alguna vez lo han hecho), o si se les presenta un escenario como este, ¿qué soluciones considerarían y por qué?

+1

Solo para comentar sobre el problema de nomenclatura: mi experiencia con las herramientas de generación de código es que por lo general solo generan un archivo grande con todas sus clases en él. Esto le permite simplemente poner su código personalizado en los archivos de la clase que llevan el nombre de su clase, y generalmente comentamos el encabezado para que sea más obvio que haya código generado en otro lugar. – womp

+0

No estoy de acuerdo con este enfoque. Los desarrolladores a largo plazo mantendrán el código en dos archivos diferentes y los desarrolladores a corto plazo estarán sujetos a cambios fuera de su control (si limita la recreación a un horario específico sería útil). Buena suerte. – eschneider

Respuesta

11

La razón por la cual Partial Classes se incluye en .Net es facilitar la utilización de herramientas de generación de código.

Si está generando código, use clases parciales. Es realmente así de simple. ¿Por qué tomaría usted el riesgo de que el código tenga que volverse a generar en el futuro y tendrá que trabajar arduamente para volver a actualizarlo con personalizaciones?

no encuentro hay mucha complejidad a los parciales o bien - es simplemente dividir una clase sobre varios archivos. Código generado en un archivo, código personalizado en el otro.

2

Iría a la ruta de las clases parciales. Solo porque es más natural para dividir 1 objeto en muchas partes. Incluso Linq2Sql usa parciales. Lucha con complejidad con patrones y convenciones apropiadas. Y es más fácil realizar una "actualización parcial" (si el código generado está bien estructurado) en clases parciales.

Si usted no está haciendo ninguna generación de código - ir por el camino de herencia de clases (en realidad, se verá obligado a, causa parciales no funcionarán a través de diferentes asambleas).

+0

"Sr. Downvoter", sea tan amable y deje un motivo. Me alegraría aprender algo nuevo ... –

+0

Consulte otra respuesta para comentarios. – eschneider

+0

Gracias por señalar. –

2

Este es exactamente el problema que existen para resolver las clases parciales. Sin embargo, creo que puedes estar desglosándolos un poco demasiado por cuestiones prácticas. Mi reacción instintiva sin conocer los detalles más finos de su aplicación sería usar un archivo de clase parcial para todo el código generado de una clase, y un segundo archivo para todo el código creado a mano. Propón una convención de nombres para las clases parciales generadas y apégate a ella.

+0

Nunca haría esto. Cuando vuelves a crear toda la clase parcial para todos los cambios en la base de datos, es posible que la base de códigos completa se rompa o probablemente se rompa. Los parciales se agregaron principalmente para los diseñadores, y son un truco para un mal diseño de IMO. – eschneider

+6

No estoy de acuerdo por completo. Personalmente, no soy un gran admirador de la generación de código, pero las clases parciales son la única forma de hacerlo. DEBE tener un mecanismo para regenerar el código que desea que se genere automáticamente sin tocar el resto del código de las clases. Las clases parciales son, de lejos, la mejor solución para ese problema. –

+2

También si se hace correctamente, ninguna regeneración de una clase parcial debe romper su base de código. Debido a la magia de la encapsulación. Puede y debe hacer que su código generado automáticamente se ajuste a una interfaz que implementen sus clases. Los cambios más probables (agregar un campo, cambiar un tipo de datos, etc.) no romperán el contrato de su clase. –

0

Si tiene un tipo que se serializará (a xml) y desea agregar alguna funcionalidad, debe usar la clase parcial y no la herencia. Gracias /// M

0

Usted dice:

similar a (pero no del todo exactamente igual) un ORM

Me elaborar algunas figuras forecats alrededor de los costes de mantenimiento de la solución actual (que supongo que es significativo) luego seleccione un ORM, escriba una solución de prueba de concepto y elabore cifras comparativas para mantener eso. No estoy seguro de qué es lo que cuesta este paquete personalizado en cuanto a mantenimiento, rampa y desarrollo, pero por mi parte no llegaría a ningún producto "personalizado" como este. El conocimiento no es transferible, el riesgo de error es alto (siempre es el caso con la generación de código) y está ligado a las intracategorías de la base de datos subyacente.

+2

Te das cuenta de que esta pregunta es de 2009, ¿verdad? En cualquier caso, opté por la ruta de clase parcial, y funcionó maravillosamente bien. La herramienta que desarrollamos estaba extremadamente bien documentada, y no tuvimos problemas serios con ella. (Ni yo, ni ningún desarrollador que vino después de mí). –