¿Es mejor confiar en dependencias transitivas o declararlas explícitamente?

12

Tengo una estructura de proyecto como esta:

My Project
  - Other Team's Project
     -Third Party Dependency

My Project requiere Other Team's Project para funcionar, y tanto My Project como Other Team's Project requieren Third Party Dependency para funcionar. Estamos utilizando un sistema de gestión de dependencias para gestionarlos.

Desde una perspectiva de diseño, ¿es mejor tener My Project de forma transitoria en Third Party Dependency ? ¿O es mejor que tanto My Project como Other Team's Project declaren explícitamente que usan Third Party Dependency ?

Algunas otras cosas:

  • Ambos proyectos deben tener la misma versión de Third Party Dependency .
  • No se garantiza que si Other Team's Project se actualiza, se probará My Project para garantizar que no se rompa nada, ya que son administrados por equipos diferentes.
pregunta Thunderforge 02.06.2016 - 20:03

2 respuestas

12

Imagine lo que sucede si el otro equipo refactora su proyecto para hacer lo mismo sin utilizando la biblioteca de terceros y eliminan su dependencia. O cambian a otra biblioteca de terceros para hacer lo mismo. ¿Seguirá funcionando tu código?

Si su código solo depende del otro proyecto, si no, su código también depende de la biblioteca de terceros.

  

Ambos proyectos deben tener la misma versión de Third Party Dependency .

Eso es un indicador claro de que su proyecto también depende directamente de la biblioteca de terceros.

    
respondido por el Roman Reiner 03.06.2016 - 06:20
16

Creo que esto se basa principalmente en la opinión, pero de todos modos lo pondré en mi 2p.

La forma en que lo he hecho siempre es preguntándome, ¿cuál es la cantidad mínima de conocimiento que mi código necesita para hacer lo que se supone que debe hacer?

Si mi código solo usa código de Other team's library , entonces solo incluiré Other team's library como una dependencia.

Si mi código también usa el código de Third-party library , entonces también lo incluiré.

Digamos que tuve las siguientes clases de My Library , Other Library y Third-party Library (usaré Java para el código de ejemplo)

package mylibrary;

import otherlibrary.Bar;

public class Foo {

    public void doFoo() {
        Bar bar = new Bar();
        bar.doBar();
    }
}

En el Other Library

package otherlibrary;

import thirdparty.Baz;

public class Bar {

    public void doBar() {
        Baz baz = new Baz();
        baz.doSomething();
    }
}

En el Third-party library

package thirdparty;

public class Baz {

    public void doBaz() {
        System.out.println("baz");
    }
}

Debido a que mi código en Foo solo depende del código de otherlibrary , eso es todo lo que incluiría, porque eso es todo lo que me importa. No me importa cómo otherlibrary.Bar#doBar hace lo que hace, solo quiero que lo haga.

Sin embargo, si cambiamos el otherlibrary.Bar#doBar para aceptar un Baz para hacer algo, como

public void doBar(Baz baz) {
    baz.doBaz();
}

Entonces necesitaría cambiar mylibrary.Foo#doFoo a algo como

public void doFoo() {
    Bar bar = new Bar();
    Baz baz = new Baz();

    bar.doBar(baz);
}

Debido a que ahora estoy interesado en cómo Bar#doBar va a hacer su trabajo, y mi código necesita saber sobre Baz para hacer lo que quiero que haga, necesito estar explícito sobre las bibliotecas que incluyo.

Si mi código debe conocer las cosas dentro de la biblioteca thirdparty , entonces debo incluirlo como una dependencia.

Aunque quizás el autor de Bar debería ocultar más de esos detalles, por lo que no necesito incluir la biblioteca thirdparty ...

    
respondido por el Zymus 03.06.2016 - 00:17

Lea otras preguntas en las etiquetas