Código de Python débilmente acoplado con inyección de dependencia
El software tiene que ser flexible para responder al cambio. La inyección de dependencia es una técnica para gestionar las dependencias entre componentes de software. Es un patrón de diseño que utiliza la inversión de control para brindar la capacidad de intercambiar componentes para realizar pruebas u otros fines sin cambiar ninguna otra parte del sistema.
La idea principal detrás de la inyección de dependencia es pasar la responsabilidad de proporcionar servicios desde funciones de constructor o métodos de instanciación directos a otros objetos. En otras palabras, a un objeto se le dan sus dependencias en lugar de crearlas. De esta manera, si queremos agregar nuevas funciones, no tenemos que cambiar el código existente, sino pasarle nuevas dependencias.
Crear abstracciones con interfaces
Hay tres pasos para escribir código Python débilmente acoplado con inyección de dependencia. El primer paso es identificar qué dependencias necesita el código, el segundo paso es crear interfaces para cada dependencia y el tercer paso es pasarlas al objeto dependiente a través de su constructor o parámetros de método.
Recientemente, implementé una funcionalidad que requería un codificador y decodificador de bytes para manipular los datos comerciales ( he simplificado su implementación con fines de legibilidad ). Abstraí sus responsabilidades con las interfaces. Python no tiene una palabra clave de interfaz como Golang, pero puede replicar la funcionalidad de la interfaz con la biblioteca ABC .
Centrándonos en la IPacketEncoderinterfaz, una clase codificadora concreta debe implementarla. Los requisitos comerciales iniciales requerían que se codificaran todos los tipos y que las cadenas se rellenaran con su longitud. Afortunadamente, Python proporciona la biblioteca de estructuras para hacer la mayor parte del trabajo duro.
Implementando Inyección de Dependencia
La encode_namefunción es una implementación simple para crear una carga útil codificada con el nombre especificado. Toma un IPacketEncoderobjeto y una cadena como parámetros.
Los dos detalles clave de implementación usan la IPacketEncoderinterfaz en lugar de la PaddedPacketEncoderclase concreta y encoderes un argumento en lugar de inicializarse dentro de la función. Esto es inyección de dependencia. Debido IPacketEncodera que se pasa, se puede extender, cambiar o proporcionar fácilmente con un trozo , manteniendo así el sistema flojamente acoplado.
Unas semanas más tarde, hubo un nuevo requisito para que un codificador manejara codificaciones terminadas en nulo. Afortunadamente, debido a la implementación existente, se puede implementar fácilmente.
NullTerminatedPacketEncoderesencialmente agrega NULL_BYTEdespués de cada cadena codificada. Volviendo a la encode_namefunción, una instancia de NullTerminatedPacketEncoderes un argumento de codificador válido ya que NullTerminatedPacketEncoderimplementa la IPacketEncoderinterfaz de manera similar a PaddedPacketEncoder.
Si no se usó la inyección de dependencia aquí, podría resultar en un código estrechamente acoplado y difícil de cambiar, por ejemplo:
Si se requiere un nuevo encoder, encode_namehabrá que cambiar la función casi en su totalidad junto con sus pruebas, alargando los tiempos de entrega. Lo que es peor, podría provocar efectos secundarios ocultos, especialmente si el desarrollador original ya no está disponible.
Para concluir, proporcionaré un ejemplo menos simplista usando esta técnica. SocketServicees responsable de decodificar un código de operación, llamar a su controlador relevante y devolver su resultado. Todos sus tipos de argumentos son abstracciones de interfaz, incluido su constructor. La CLI es responsable de determinar qué codificador usar, es decir, NullTerpressed o Padded, y pasar su instancia a la SocketServiceclase.
A medida que los proyectos continúan creciendo, se recomienda utilizar un marco de inyección de dependencia para "inyectar" estas dependencias automáticamente, como Dependency Injector .
Con suerte, esto demuestra cómo escribir código Python débilmente acoplado con inyección de dependencia. A muchos desarrolladores de Python no les gusta la inyección de dependencia porque sienten que no es "pythonic", pero diría que sus beneficios no pueden desacreditarse, especialmente cuando está presente en tantos otros lenguajes de programación.
Gracias por leer . Si desea conectarse conmigo, puede encontrarme en Linkedin o Github .

![¿Qué es una lista vinculada, de todos modos? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































