Me quedé realmente cautivado por los contratos de código introducidos en .NET 4 (aunque con la ayuda de DevLabs). Pero una letra pequeña me refrescó un poco. Esto es lo que dice:Contratos de código: agradable, al límite, pero no está listo para el horario de máxima audiencia.
- Actualmente no hay solución al problema cuando se llaman a las postcondiciones fuera del bloqueo en un método seguro para subprocesos a excepción de no usarlos.
- .NET se basa en un reescritor binario haciendo que la compilación sea más lenta.
- El uso de contratos de código también puede generar un golpe de rendimiento en el tiempo de ejecución.
- No se puede utilizar para comprobaciones sensibles a la seguridad porque se pueden eludir en tiempo de ejecución mediante el manejo del evento ContractFailed.
Lo más grande para mí es el primero. No sé si alguien escribe aplicaciones de subproceso único. Entonces, si los contratos de código no pueden admitir multi-threading, no veo mucho uso de ellos. O tal vez no debería enfatizar demasiado sobre eso porque las postcondiciones son para afirmar los aspectos internos del método en sí, que pueden ser probados en unidades.
Por cierto, no he encontrado nada y no intenté desmontar mi código para ver dónde se inyectan las condiciones previas. Supongo que en un método simple cuando lock() va primero, es fácil inyectar cheques inmediatamente después, pero en un método bastante complicado, cuando el bloqueo ocurre en algún punto intermedio, puede ser un problema. O si se usan otros mecanismos distintos de lock().
Estoy de acuerdo cuando se trata de clases sin estado. Pero cuando se trata de manejar el estado, las clases deben ser seguras para subprocesos. Sin embargo, hago todo lo posible para minimizar el número de ellos. En la nota lateral, podría estar pensando más en el enfoque en blanco y negro o más bien todo o nada: por qué usar contratos de código en algunos lugares y no en otros debido a sus limitaciones. – Schultz9999
@ Schultz9999: No, solo las clases con estado * que se usan de varios subprocesos al mismo tiempo * necesitan ocuparse de eso. Está bien si * cualquiera * una clase solo se usa de un hilo para una solicitud completa (p. Ej., Los StringBuilders generalmente no se utilizan en los subprocesos) * o * solo se usan por subprocesos a la vez, con barreras de memoria adecuadas para consistencia. En cuanto a su segunda pregunta: use contratos de código solo por * algunos * de su código si hacerlo hace que su código sea más claro o más confiable, básicamente. Algunos códigos son difíciles/imposibles de probar por unidad, pero aún escribo pruebas donde puedo ... es lo mismo aquí. –
Estoy de acuerdo con sus respuestas sobre cómo escribir el código. Tal vez el objeto de estado en sí mismo pueda proporcionar una forma de mantener las capas internas seguras para hilos, mientras que a los manipuladores puede no importarles el bloqueo, permitiendo así que el reescritura reorganice el código como se esperaba. Esto ayuda a evitar el problema, pero aún permanece. Aceptaré la otra respuesta a pesar de que me gustan ambas publicaciones pero tienes infinitamente más puntos :) – Schultz9999