È meglio affidarsi alle dipendenze transitive o dichiararle esplicitamente?

12

Ho una struttura di progetto come questa:

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

My Project richiede Other Team's Project per funzionare, e sia My Project che Other Team's Project richiedono Third Party Dependency per funzionare. Stiamo utilizzando un sistema di gestione delle dipendenze per gestirli.

Dal punto di vista del design, è meglio avere My Project transitivamente su Third Party Dependency ? Oppure è meglio sia per My Project che Other Team's Project per dichiarare esplicitamente che usano Third Party Dependency ?

Alcune altre cose:

  • Entrambi i progetti devono avere la stessa versione di Third Party Dependency .
  • Non è garantito che se Other Team's Project viene aggiornato che My Project verrà testato per garantire che non si interrompa nulla, perché sono gestiti da team diversi.
posta Thunderforge 02.06.2016 - 20:03
fonte

2 risposte

12

Immagina cosa succede se l'altra squadra rifatta il suo progetto per fare la stessa cosa senza usando la libreria di terze parti e rimuove la loro dipendenza. Oppure passano a un'altra libreria di terze parti per fare la stessa cosa. Il tuo codice funzionerà ancora?

Se fa il tuo codice dipende solo dall'altro progetto, altrimenti il tuo codice dipende anche dalla libreria di terze parti.

Both projects need to have the same version of Third Party Dependency.

Questo è un strong indicatore del fatto che il tuo progetto dipende direttamente anche dalla libreria di terze parti.

    
risposta data 03.06.2016 - 06:20
fonte
16

Penso che sia per lo più basato sull'opinione pubblica, ma inserirò comunque il mio 2p.

Il modo in cui l'ho sempre fatto è chiedermelo, qual è la quantità minima di conoscenza che il mio codice ha bisogno di dover fare ciò che dovrebbe fare?

Se il mio codice utilizza solo il codice da Other team's library , includerò solo Other team's library come dipendenza.

Se il mio codice anche utilizza il codice da Third-party library , allora includerò anche quello.

Diciamo che ho avuto le seguenti classi da My Library , Other Library e Third-party Library (Userò Java per il codice di esempio)

package mylibrary;

import otherlibrary.Bar;

public class Foo {

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

In Other Library

package otherlibrary;

import thirdparty.Baz;

public class Bar {

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

In Third-party library

package thirdparty;

public class Baz {

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

Perché il mio codice in Foo dipende solo dal codice da otherlibrary , questo è tutto ciò che includerei, perché è tutto ciò che mi interessa. Non mi interessa come otherlibrary.Bar#doBar fa tutto ciò che fa, voglio solo farlo.

Se tuttavia, abbiamo modificato otherlibrary.Bar#doBar per accettare un Baz con cui fare qualcosa, come

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

Dovrei quindi cambiare mylibrary.Foo#doFoo in qualcosa di simile

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

    bar.doBar(baz);
}

Perché ora sono interessato a come Bar#doBar sta per fare la sua cosa, e il mio codice ha bisogno di sapere su Baz per fare ciò che voglio che faccia, ho bisogno di essere esplicito sulle librerie che includo.

Se il mio codice deve sapere di elementi all'interno della libreria thirdparty , allora I deve includerlo come dipendenza.

Anche se forse l'autore di Bar dovrebbe nascondere più dettagli, quindi non è necessario includere la libreria thirdparty ...

    
risposta data 03.06.2016 - 00:17
fonte

Leggi altre domande sui tag