Pregunta

En C # 3.0, Microsoft presentó soporte para algo llamado métodos parciales .

¿Los usas? ¿Puedes describir cómo y por qué?

¿Considera que el uso de métodos parciales es una buena práctica de programación o no?

¿Fue útil?

Solución

Los métodos parciales son principalmente útiles para la extensión del comportamiento del código generado por la herramienta sin costo, ya sea en la evaluación en tiempo de ejecución o en el código visible del usuario donde no se usa tal extensibilidad.

Como tal, su uso es sensato y se recomienda cuando sea necesario, pero tales ocasiones serán relativamente poco comunes para la mayoría de los usuarios (que no están escribiendo herramientas para generar código). Si está escribiendo una herramienta de este tipo, se debe tener en cuenta dónde pueden interactuar las personas con el flujo de su código generado, y si dicho uso no se puede manejar fácilmente a través de mecanismos similares a eventos mientras se alcanzan sus objetivos de rendimiento y usabilidad previstos. Los eventos son intrínsecamente multicast y dicha estructura puede ser inherentemente contra el diseño previsto de la API. Alternativamente, podría ser necesario un valor de retorno complejo, o interacción con los parámetros de ref / out, finalmente, la extensión puede ser compleja / frágil a pesar de su utilidad y, como tal, solo el implementador de clase parcial puede estar en una posición para manejar esto adecuadamente. Todas estas razones tienen su nicho, si no son comunes y los métodos parciales pueden resolverlos de manera efectiva.

Los consumidores que implementan métodos parciales deben usarlos según lo que dicte la herramienta (si se proporciona un punto de extensión y lo necesita, utilícelo). Para evitar hacer esto porque uno siente que la característica es confusa sería un mal uso del lenguaje y la API, ya que este es claramente el punto de extensión deseado.

Otros consejos

Al igual que las clases parciales, son útiles solo en combinación con el código generado por la herramienta (diseñador). Y allí brindan una alternativa simple, ligera, a los eventos.

Tuve ocasión de usar un método parcial en una biblioteca de clases que escribí. Era posible compilar la biblioteca en una de varias versiones diferentes, con el uso de constantes definidas, que compilarían o compilarían varios bloques de funciones.

Pero ensuciar el código con #if / #endif para todas las combinaciones de opciones, cruzar con Compact Framework así como con el marco de escritorio, condujo a algunas cosas confusas.

Utilicé métodos parciales para simplificar la clase de esa pieza, como una especie de invisible o implícita # if / # endif. Esto es similar a la forma en que se usan en LINQ, tal como lo entiendo.

Por otra parte, en tiempo de ejecución, no añado estos métodos, como lo haría LINQ, o lo hace. En lugar del modelo linq, donde hay ensamblajes separables, y cuando se combinan obtienes una función adicional, en mi clase lib, hay una única DLL creada para cada combinación de opciones. Esto es para facilitar la implementación y el consumo.

Las clases parciales hacen que C # y VB funcionen más como C y C ++, donde puede dispersar el código que implementa una clase en diferentes archivos como mejor le parezca. Su principal objetivo es apoyar de forma limpia a los diseñadores visuales para cosas como WPF. Considero que este es un buen uso para clases parciales.

Otro uso que he visto es dividir un archivo de origen grande en partes lógicas. Por ejemplo, clase BigForm puede abarcar los archivos BigForm-BillingInfo.cs, BigForm-ShippingInfo.cs y BigForm-LineItems.cs. Por lo general, este es un uso deficiente de las clases parciales, ya que la refactorización en múltiples clases o controles es un mejor diseño de POO (para reutilización, etc.).

Las clases parciales son una característica muy útil, por ejemplo, cuando tiene un cliente y un servidor y ambos necesitan compartir tipos de datos para la persistencia de objetos de negocios. Tiene el lado del servidor de su clase regular, lo expone del lado del cliente con su servicio web y, si desea decorar el lado del cliente, puede hacer una versión parcial de su clase (en el lado del cliente tiene una versión del código generada por el código). versión del servidor a través de la generación de proxy, etc.).

Solo quería decir este ejemplo, ya que hago un uso extendido de la función parcial, hoy en día, trabajando en un proyecto de Silverlight, persistiendo objetos desconectados :)

// Lo siento por no darse cuenta de que la pregunta se refiere explícitamente a los métodos. Los métodos parciales son muy útiles para tejer la funcionalidad de código en los controladores de eventos, generados automáticamente en ciertos escenarios

La cultura de programación de Microsoft siempre ha favorecido una cinta de cinta " enfoque. Esto se remonta al menos en cuanto a las guerras Quick BASIC vs. Turbo Pascal. Los lenguajes de Microsoft permiten atajos. Tomemos, por ejemplo, los delegados: un delegado es básicamente una interfaz que se olvidó de diseñar. Los métodos parciales son más de lo mismo.

El título de su pregunta se refiere a la infame carta de Edsger Dijkstra a CACM y esto es muy apropiado. La carta de Dijkstra fue el arma oficial de inicio para las guerras de programación estructurada. Personalmente, no creo que encuentre sabiduría al abogar por un camino estructurado o no estructurado en todas las situaciones.

Siempre he pensado que este conflicto era producto de las diferencias en las perspectivas de ingeniería frente a informática. Los programadores de Microsoft Eary estaban programando el bare metal todo el día. Después de que hayas escrito suficiente ensamblador, los dictados de la programación estructurada parecen un poco tontos.

El intercambio se reduce a: ¿te gustaría tener suficiente cuerda para colgarte, o te gustaría que te obligaran a reescribir partes de tu arquitectura para satisfacer la inflexibilidad del lenguaje? Un equipo disipado puede escribir un buen código en cualquiera de los entornos, y no hay una respuesta universal correcta.

Volviendo a la pregunta en cuestión: no creo que los métodos parciales sean una gran característica del lenguaje, pero si fueran necesarios para hacer que LINQ funcione, definitivamente vale la pena tolerarlos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top