2011-02-08 16 views
8

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().

Respuesta

3

Actualmente no hay solución al problema cuando se llaman las postcondiciones fuera del bloqueo en un método seguro para subprocesos excepto por no los usa.

No es realmente un problema: si hace un control usted mismo fuera de una instrucción de bloqueo en el método de ejecución de subprocesos también puede encontrarse con un problema. Ajuste su implementación para esta pequeña 'limitación'. La pregunta es cómo va a saber el reescritor de código que debe bloquear un recurso. Creo que esta limitación permanecerá por mucho tiempo.

.NET se basa en un reescritor binario haciendo que la compilación sea más lenta.

Sí, algunos IL deben evaluarse, generarse y guardarse para inyectar algunas dependencias IL build new = más tiempo, por supuesto.

El uso de contratos de código también puede generar un golpe de rendimiento en el tiempo de ejecución.

También no es inusual o es un problema, más código (generado para los contratos de código) = más lento. Simplemente tiene más código básicamente y lo que puede estar ejecutando a través de una clase de proxy, así que hay más código + posible proxy.

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.

Sí, no hagas eso. Ni siquiera tiene que deshabilitar/volver a montar el conjunto para omitir una posible verificación de seguridad. Mantenga los flujos de control relacionados con la seguridad en el servidor (ya sea en la web o en la base de datos), si es posible, o intente ocultar su código a su mejor capacidad, si es local.

8

Parece que confunde "escribir aplicaciones de subprocesos múltiples" con "hacer que cada clase sea segura para subprocesos". Dejando de lado el tricky question of defining the term "thread safety" sugeriría que muy pocas de sus clases deberían usar el bloqueo en la mayoría de las aplicaciones.

Generalmente escribo muchas clases que no intentan ser explícitamente seguras para subprocesos, pero igualmente no tienen ninguna dependencia de subprocesos. Suponen que si va a usarlos de varios subprocesos, solo lo hará de un subproceso a la vez, con barreras de memoria adecuadas para asegurarse de que los cambios realizados en un subproceso sean visibles en cualquier subproceso que los use.

Existen entonces relativamente pocas clases que realizan la coordinación necesaria.

Ahora, es posible que los problemas con los Contratos de Código hagan que esas pocas clases sean lo suficientemente débiles como para hacer que todo el pensamiento se derrumbe ... pero no lo asumiría para empezar.

Soy un poco más cauteloso con los problemas que enfrentará Code Concts con el compilador de C# haciendo más y más trabajo reescribiendo su código ... No sé si el equipo de Contracts ha tratado los problemas de los bloques de iteradores aún, pero incluso si lo tienen, tendrán que hacerlo nuevamente cuando C# 5 salga con métodos asíncronos ...

+0

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

+1

@ 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í. –

+0

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

Cuestiones relacionadas