Prohibir llamadas a funciones / clases arbitrarias en código externo

12

He experimentado casos en los que sería valioso restringir el acceso a la API de bibliotecas y marcos externos para evitar consecuencias negativas en el sistema.

Por ejemplo, en una aplicación de SharePoint puede parecer natural llamar a spList.Items.GetItemById para obtener un elemento de la lista, incluso tal vez en un bucle, sin darse cuenta de que esto puede dar lugar a enormes problemas de rendimiento.

También podría ser que tengamos que prohibir el uso de SmtpClient para forzar a todos a usar nuestra propia clase para enviar correos electrónicos, para asegurarnos de que podemos enviar un proxy y simular todos los correos electrónicos en el entorno de prueba.

¿Existen formas confiables y razonablemente sencillas de lograr estas restricciones en el código externo, excepto en ciertos lugares específicos de nuestro propio código? No es necesario, absolutamente bajo ninguna circunstancia, evitar el acceso a estos métodos / clases, por ejemplo, por reflexión o simplemente algún tipo de desactivación, sino que debería ser una advertencia estricta de que no deben usarse. Preferiblemente, obligar al programador a tomar medidas activas para anular estas restricciones si es posible / necesario.

    
pregunta Alex 11.10.2017 - 13:26

5 respuestas

8
  

¿Existen formas confiables y razonablemente sencillas de lograr estas restricciones en el código externo, excepto en ciertos lugares específicos de nuestro propio código?

Como la pregunta es específicamente sobre C #, hay una solución basada en compilador que puede usarse aquí para hacer cumplir tales reglas: Analizadores de Roslyn . Puede escribir su propio analizador que informe de acceso a ciertas API como un error de compilación o advertencia.

Un conjunto de analizadores de ejemplo, que proporciona muchos códigos de ejemplo al escribir el suyo, son los StyleCop Analyzers , que son una reemplazo de la antigua característica StyleCop para C #.

Habiendo dicho eso, tales controles automatizados siempre pueden ser resueltos por personas determinadas a "romper las reglas". Por lo tanto, este enfoque no es un sustituto para las revisiones de código como se discute en la respuesta de Karl Bielefeldt. Puede ayudar con dichas revisiones, pero no debe reemplazarlas.

    
respondido por el David Arno 12.10.2017 - 12:17
25

Puede hacer cosas que consumen mucho tiempo, como escribir un envoltorio alrededor de la API externa que omita sus operaciones no deseadas, pero nada supera la capacitación y las revisiones de código, ya que independientemente de las normas o medidas técnicas que establezca, las personas encontrarán formas creativas para esquivarlos.

Por ejemplo, tenemos varios servicios escritos en Scala, y una de las cosas que pedimos en el momento de revisar el código es la inmutabilidad, pero a menudo lo comunicamos como deshacerse de vars . Alguien el otro día usó un val x: ListBuffer [booleano] para mantenga una sola variable mutable como el único elemento en la lista. No puede asignar otro ListBuffer a x, pero puede reemplazar los elementos de la lista en el lugar que desee. Tan malo como usar un var , pero más astuto.

En otras palabras, debe verificar si las personas están revisando sus soluciones técnicas. Si esas soluciones técnicas son costosas y agregan complejidad, también puede verificar que las están codificando correctamente.

    
respondido por el Karl Bielefeldt 11.10.2017 - 14:49
0

La respuesta de Karl es 100% correcta. No hay manera de garantizar la conformidad. Sin embargo, además de la capacitación y las revisiones de códigos, considere el uso de herramientas de análisis estático para garantizar el cumplimiento. (Nota: dije "además de", ya que uno también puede evitarlos de la misma manera que Karl declaró).

La ventaja de usar herramientas de análisis estático es eliminar el tedioso análisis de código humano en busca de casos de "uso múltiple de IEnumerable" o cualquier problema de rendimiento de la semana que esté viendo (o, al menos, que siempre siento Estoy mirando a). Esto permitirá que las revisiones de código y la capacitación se centren en temas más "interesantes".

Para C #, específicamente, he incluido algunas sugerencias a continuación. Conéctalos a tu entorno de construcción y listo. Pero, en general, sin importar el idioma que utilices, hay una herramienta de análisis estático en alguna parte.

Copie / pegue directamente desde la página de Wikipedia, use la página wiki para obtener la información y los enlaces más recientes: enlace

  • .NET Compiler Platform (nombre en clave Roslyn): marco de compilación de código abierto para C # y Visual Basic .NET desarrollado por Microsoft .NET. Proporciona una API para analizar y manipular la sintaxis.
  • CodeIt.Right: combina el análisis de código estático y la refactorización automática con las mejores prácticas que permiten la corrección automática de errores y violaciones de código; admite C # y VB.NET.
  • CodeRush: un complemento para Visual Studio que alerta a los usuarios sobre violaciones de las mejores prácticas.
  • FxCop: análisis estático gratuito para los programas Microsoft .NET que se compilan en CIL. Independiente e integrado en algunas ediciones de Microsoft Visual Studio; por Microsoft.
  • NDepend: simplifica la administración de una base de código .NET compleja mediante el análisis y la visualización de las dependencias del código, la definición de las reglas de diseño, el análisis de impacto y la comparación de diferentes versiones del código. Se integra en Visual Studio.
  • Parasoft dotTEST: un complemento de análisis estático, pruebas de unidad y revisión de código para Visual Studio; funciona con idiomas para Microsoft .NET Framework y .NET Compact Framework, incluidos C #, VB.NET, ASP.NET y Managed C ++.
  • Sonargraph: admite C #, Java y C / C ++ con un enfoque en el análisis de dependencia, la comprobación automatizada de la arquitectura, las métricas y la capacidad de agregar métricas personalizadas y comprobadores de códigos.
  • StyleCop: analiza el código fuente de C # para imponer un conjunto de reglas de estilo y coherencia. Puede ejecutarse desde Microsoft Visual Studio o integrarse en un proyecto de MSBuild.
respondido por el Reginald Blue 17.10.2017 - 15:34
-1

Para elaborar la sugerencia de "entrenamiento y revisión del código" que se plantea en otra respuesta: dado que el código que desea prohibir es un código legal, no puede contar con que el compilador lo impida, y tendrá que confiar en un Proceso posterior, la revisión.

Esto puede (y debería) incluir pasos de revisión tanto manuales como automáticos:

  • Prepare una lista de verificación de problemas conocidos y revíselos en sus revisiones de códigos manuales, una por una. Tenga una reunión recurrente para revisar y actualizar la lista de verificación. Cuando se detecte y analice un error desagradable, agréguelo a la lista de verificación.

  • Agregue reglas de verificación para buscar patrones conocidos. Esto puede ser complicado de escribir, pero para un proyecto grande, con el tiempo, puede ser útil. TFS le permite escribir reglas en C #, y otros sistemas de compilación tienen sus propios enlaces. Considere usar compilaciones cerradas para rechazar los registros que coincidan con el patrón. Sí, ralentiza el desarrollo, pero después de cierto tamaño y complejidad del proyecto, reducir la velocidad de los desarrolladores puede ser bueno.

respondido por el Avner Shahar-Kashtan 12.10.2017 - 11:04
-1

Tal vez el compilador pueda ayudarte a capturar llamadas no deseadas.

Cambie el nombre de las clases / métodos de código en su propia biblioteca que no deben ser utilizadas por clientes externos de la biblioteca. Alternativamente, haga que las clases / métodos sean internos y agregue elementos internos visibles para aquellas clases que tienen permiso para usarlos.

Los usuarios de la biblioteca externa obtendrán un método / clase de error de compilación no encontrado.

Clases / métodos prohibidos de bibliotecas públicas: crea el mismo espacio de nombres / clase / método en tu biblioteca

Los usuarios de la biblioteca externa obtendrán un error de compilación debido a una clase duplicada encontrada

[actualizar]

  

No es necesario, absolutamente bajo ninguna circunstancia, evitar el acceso a   estos métodos / clases, por ejemplo, por reflexión o simplemente algunos   tipo de deshabilitar, ....

     

obligando al programador (... cliente de la lib ...) a activar   tomar medidas para   anule estas restricciones si es posible / necesario.

    
respondido por el k3b 12.10.2017 - 11:54

Lea otras preguntas en las etiquetas