El equipo en el que estoy crea componentes que pueden ser utilizados por los socios de la compañía para integrarse con nuestra plataforma.
Como tal, estoy de acuerdo en que debemos tener mucho cuidado al introducir dependencias (de terceros). Actualmente no tenemos dependencias de terceros y tenemos que permanecer en el nivel API más bajo del marco.
Algunos ejemplos:
- Nos vemos obligados a permanecer en el nivel API más bajo del marco (.NET Standard). El razonamiento detrás de esto es que podría llegar un día una nueva plataforma que solo admita ese nivel API muy bajo.
- Hemos implementado nuestros propios componentes para (des) serializar JSON y estamos en el proceso de hacer lo mismo para JWT. Está disponible en un nivel superior de la API de marco.
- Hemos implementado un contenedor alrededor del marco HTTP de la biblioteca estándar, porque no queremos depender de la implementación HTTP de la biblioteca estándar.
- Todo el código para mapear a / desde XML está escrito "a mano", nuevamente por la misma razón.
Siento que lo estamos llevando demasiado lejos. Me pregunto cómo lidiar con esto, ya que creo que esto tiene un gran impacto en nuestra velocidad.
Respuestas:
Esto para mí resalta el hecho de que, no solo se están restringiendo demasiado, sino que también se dirigen hacia una desagradable caída con su enfoque.
.NET Standard no es, y nunca será " el nivel API más bajo del marco ". El conjunto más restrictivo de API para .NET se logra mediante la creación de una biblioteca de clases portátil que se dirige a Windows Phone y Silverlight.
Dependiendo de la versión de .NET Standard a la que se dirija, puede terminar con un conjunto muy rico de API que son compatibles con .NET Framework, .NET Core , Mono y Xamarin . Y hay muchas bibliotecas de terceros que son compatibles con .NET Standard que, por lo tanto, funcionarán en todas estas plataformas.
Luego está .NET Standard 2.1, que probablemente se lanzará en el otoño de 2019. Será compatible con .NET Core, Mono y Xamarin. No será compatible con ninguna versión de .NET Framework , al menos en el futuro previsible, y muy probablemente siempre. Entonces, en un futuro cercano, lejos de ser " el nivel API más bajo del marco ", .NET Standard reemplazará al marco y tendrá API que no son compatibles con este último.
Por lo tanto, tenga mucho cuidado con " El razonamiento detrás de esto es que podría llegar un día una nueva plataforma que solo admita ese nivel API muy bajo ", ya que es muy probable que las nuevas plataformas admitan un API de nivel más alto que el marco anterior.
Luego está el problema de las bibliotecas de terceros. JSON.NET, por ejemplo, es compatible con .NET Standard. Cualquier biblioteca compatible con .NET Standard está garantizada, API-sabia, para trabajar con todas las implementaciones de .NET que sean compatibles con esa versión de .NET Standard. Por lo tanto, no logra una compatibilidad adicional al no usarla y crear su biblioteca JSON. Simplemente crean más trabajo para ustedes e incurren en costos innecesarios para su empresa.
Entonces sí, definitivamente estás llevando esto demasiado lejos en mi opinión.
fuente
eval
envoltura con algunos controles de cordura que se pueden pasar por alto fácilmente?El razonamiento aquí es bastante al revés. Los niveles de API más antiguos y más bajos tienen más probabilidades de volverse obsoletos y no admitidos que los más nuevos. Si bien estoy de acuerdo en que mantener una posición cómoda detrás de la "vanguardia" es razonable para garantizar un nivel razonable de compatibilidad en el escenario que menciona, nunca avanzar es más que extremo.
Esto es una locura . Incluso si no desea utilizar las funciones de biblioteca estándar por cualquier razón, existen bibliotecas de código abierto con licencias comercialmente compatibles que hacen todo lo anterior. Ya han sido escritos, ampliamente probados desde un punto de vista de funcionalidad, seguridad y diseño de API, y se han utilizado ampliamente en muchos otros proyectos.
Si sucede lo peor y ese proyecto desaparece, o deja de mantenerse, entonces tiene el código para construir la biblioteca de todos modos, y asigna a alguien para que lo mantenga. Y es probable que todavía esté en una posición mucho mejor que si hubiera creado el suyo, ya que en realidad tendrá un código más probado, más limpio y más fácil de mantener.
En el escenario mucho más probable de que el proyecto se mantenga y se encuentren errores o vulnerabilidades en esas bibliotecas, usted sabrá sobre ellas, por lo que puede hacer algo al respecto, como actualizar a una versión más nueva de forma gratuita o parchear su versión con la solución si ha tomado una copia.
fuente
En general, estas cosas son buenas para sus clientes. Incluso una biblioteca de código abierto popular podría ser imposible de usar por alguna razón.
Por ejemplo, pueden haber firmado un contrato con sus clientes prometiendo no usar productos de código abierto.
Sin embargo, como usted señala, estas características no están exentas de costo.
Plantearía estos inconvenientes y hablaría con los clientes para saber si realmente necesitan los niveles súper de compatibilidad que están ofreciendo.
Si todos los clientes ya usan Json.NET, por ejemplo, usarlo en su producto en lugar de su propio código de deserialización, reduce su tamaño y lo mejora.
Si presenta una segunda versión de su producto, una que utiliza bibliotecas de terceros, así como una compatible, puede juzgar la aceptación de ambas. ¿Los clientes utilizarán a terceros para obtener las últimas funciones un poco antes o se quedarán con la versión 'compatible'?
fuente
La respuesta corta es que debe comenzar a introducir dependencias de terceros. Durante su próxima reunión, dígales a todos que la próxima semana en el trabajo será la más divertida que hayan tenido en años: reemplazarán los componentes JSON y XML con soluciones de bibliotecas estándar de código abierto. Dígales a todos que tienen tres días para reemplazar el componente JSON. Celebra después de que esté hecho. Tener una fiesta. Vale la pena celebrarlo.
fuente
Básicamente todo se reduce a esfuerzo vs. riesgo.
Al agregar una dependencia adicional o actualizar su marco o utilizar una API de nivel superior, reduce su esfuerzo pero asume riesgos. Por lo tanto, sugeriría hacer un análisis FODA .
Como puede ver, el esfuerzo adicional para desarrollar una solución artesanal es una inversión para reducir sus amenazas. Ahora puedes tomar una decisión estratégica.
fuente
Divida sus bibliotecas de componentes en un conjunto "Core", que no tiene dependencias (esencialmente lo que está haciendo ahora) y un conjunto "Común", que tiene dependencias en sus bibliotecas "Core" y de terceros.
De esa manera, si alguien solo quiere la funcionalidad "Core", puede tenerla.
Si alguien quiere la funcionalidad "Común", puede tenerla.
Y puede administrar lo que es "Core" versus "Common". Puede agregar funcionalidad más rápidamente a "Común", y moverla a su propia implementación "Principal" si / cuando tiene sentido proporcionar su propia implementación.
fuente