licencia java spring dependencies package circular-dependency

java - licencia - openjdk download



¿Por qué todas las principales bibliotecas de código abierto de Java tienen dependencias circulares entre sus paquetes? (1)

Puedo confirmar que después del análisis de muchos proyectos Java que usan JArchitect , muchos de ellos contienen dependencias circulares entre los paquetes, la razón es que muchos de ellos eligen el enfoque "paquete por función" en lugar de "paquete por capa".

Aquí hay un buen artículo que habla sobre la diferencia entre estos dos enfoques.

Tomemos como ejemplo algunos paquetes del JDK

Estos paquetes están diseñados por características, la característica de expresiones regulares está agrupada en el paquete java.util.regex que necesita algunas características de seguridad del paquete java.security y las clases de seguridad también necesitan algunas funcionalidades de expresiones regulares.

He estado investigando la estructura del paquete de Java y los patrones de dependencia en las últimas semanas. Uno de los hilos comunes a través de las escrituras sobre el tema es la regla simple de que las dependencias del paquete deberían formar un gráfico acíclico dirigido (DAG). El autor Robert Martin incluso formalizó el Principio de Dependencias Acíclicas (ADP), que establece

La estructura de dependencia entre paquetes debe ser un gráfico acíclico dirigido (DAG). Es decir, no debe haber ciclos en la estructura de dependencia.

Algunas bibliotecas de Java se adhieren a esta simple regla. A saber, las bibliotecas Spring Framework (spring-core, spring-web, etc.) y Google Guava .

Sin embargo, para mi sorpresa, ¡la mayoría de los principales proyectos de código abierto de Java no lo hacen !

Los siguientes proyectos de código abierto tienen dependencias circulares entre paquetes:

  • Netflix Hystrix (¡ cada paquete es parte de un ciclo!)
  • AWS SDK
  • Commons-Lang
  • Commons-Colecciones
  • Daga
  • Google Gson
  • Google Guice
  • ORM de Hibernate
  • Validador de Hibernate
  • Jackson Core
  • Joda Time
  • Juega Framework
  • Junit
  • Volver a iniciar sesión
  • Embarcadero
  • AspectJ
  • Netty
  • java.util
  • java.lang

¿He entendido mal el principio de la ingeniería del software? ¿O los desarrolladores descuentan esta técnica de organización de paquetes?

Referencias