Come calcolare il numero di dipendenze indirette di una classe?

3

La maggior parte degli strumenti di analisi del codice statico che analizzano le dipendenze di classe generano coppie di classi di dipendenza in cui ciascuna coppia rappresenta una dipendenza diretta tra due classi. Date queste coppie di dipendenze, è semplice calcolare il numero di dipendenze dirette di una particolare classe. Tuttavia, se dobbiamo calcolare il numero di dipendenze indirette di una classe, mi sono reso conto che l'algoritmo è piuttosto complesso. Permettetemi di chiarire cosa intendo per dipendenza indiretta:

Abbiamo seguito le coppie di classe di dipendenza diretta :

La classe A dipende dalla classe B

La classe B dipende dalla classe C

La classe B dipende dalla classe D

In questo caso, la classe A dipende direttamente dalla classe B e indirettamente dalle classi C e D.

Definirei il numero di dipendenze dirette per la classe A come 1 e il numero di dipendenze indirette per la classe A come 2.

Vorrei calcolare le dipendenze indirette per ogni classe nei sistemi che analizzo.

La complessità deriva principalmente dalle dipendenze cicliche.

Ad esempio, se dovessimo calcolare il numero di dipendenze indirette per la classe A:

Scenario 1:

A - > B

B - > C

C - > D

D - > B

Scenario 2:

A - > B

B - > C

B - > D

C - > E

D - > F

E - > G

F - > G

G - > H

Scenario 3:

A - > B

B - > C

C - > A

Questo può essere risolto usando la teoria dei grafi? Ad esempio, rappresentano tutte le coppie di dipendenze utilizzando un grafico diretto e calcolano la somma ricorsiva di outdegrees dei nodi adiacenti. Altre idee sono ben accette.

Fammi sapere qual è il modo migliore per ottenerlo.

    
posta Heramb Deware 21.08.2015 - 07:36
fonte

1 risposta

4

Il calcolo delle dipendenze dirette è molto semplice. Quindi per i tuoi scopi ti consiglio di trovare il conteggio delle dipendenze tutte , quindi se sei interessato solo indirettamente, puoi semplicemente sottrarre il numero di diretto dal totale.

L'algoritmo non è troppo complicato e in pseudocode assomiglia a qualcosa di simile:

count = 0
visited = [ ]
toVisit = [ startNode ]
while(toVisit not empty)
{
    current = toVisit.Pop
    for(dependency in current.dependencies)
    {
        if(dependency not in visited)
            toVisit.Push(dependency)
    }
    visited.Push(current)
    count++;
}

Stai semplicemente attraversando il grafico, tenendo traccia di tutti i nodi già visitati per assicurarti di non rivederli (evitando problemi derivanti da dipendenze circolari).

    
risposta data 21.08.2015 - 09:58
fonte