Come rappresentare correttamente le espressioni lambda o gli attraversamenti attraverso di loro in Architecture Explorer?

4

Sto esplorando un pezzo di codice in Architecture Explorer in Visual Studio 2010 per studiare le relazioni tra i metodi. Ho notato uno strano comportamento.

Prendi il seguente codice sorgente. Genera un messaggio di saluto basato su un modello e un motore di template, essendo il motore del template un metodo (una sorta di schema di strategia semplificato al massimo per scopi dimostrativi).

public string GenerateHelloMessage(string personName)
{
    return this.ApplyTemplate(
        this.DefaultTemplateEngine, this.GenerateLocalizedHelloTemplate(), personName);
}

private string GenerateLocalizedHelloTemplate()
{
    return "Hello {0}!";
}

public string ApplyTemplate(
    Func<string, string, string> templateEngine, string template, string personName)
{
    return templateEngine(template, personName);
}

public string DefaultTemplateEngine(string template, string personName)
{
    return string.Format(template, personName);
}

Il grafico generato da questo codice è questo:

Cambiailprimometododaquesto:

public string GenerateHelloMessage(string personName) { return this.ApplyTemplate( this.DefaultTemplateEngine, this.GenerateLocalizedHelloTemplate(), personName); }

a questo:

public string GenerateHelloMessage(string personName)
{
    return this.ApplyTemplate(
        (a, b) => this.DefaultTemplateEngine(a, b),
        this.GenerateLocalizedHelloTemplate(), personName);
}

e il grafico diventa:

Pur essendo semanticamente identiche, queste due versioni di codice producono diversi grafici di dipendenza, e Architecture Explorer non mostra alcuna traccia dell'espressione lambda (mentre la copertura del codice di Visual Studio, ad esempio, le mostra, così come l'analisi del codice sembra essere in grado di capire che il link esiste).

Come sarebbe possibile, senza cambiare il codice sorgente, a:

  • O forzare Architecture Explorer a visualizzare tutto, comprese le espressioni lambda,

  • O fallo attraversare le espressioni lambda mentre disegni una dipendenza attraverso di loro (quindi in questo caso, disegnando la dipendenza da GenerateHelloMessage a DefaultTemplateEngine nel secondo esempio)?

posta Arseni Mourzenko 05.03.2013 - 02:55
fonte

1 risposta

0

Una soluzione alternativa sarebbe chiamare esplicitamente il metodo del motore di template, sostituendo:

public string GenerateHelloMessage(string personName)
{
    return this.ApplyTemplate(
        (a, b) => this.DefaultTemplateEngine(a, b),
        this.GenerateLocalizedHelloTemplate(), personName);
}

da:

public string GenerateHelloMessage(string personName)
{
    Func<string, string, string> engine = this.DefaultTemplateEngine;
    return this.ApplyTemplate(
        (a, b) => engine(a, b), this.GenerateLocalizedHelloTemplate(), personName);
}

Questo cambiamento rende il codice ancora più semanticamente identico; probabilmente anche il compilatore inserirà la variabile engine nell'ultimo esempio per ottenere l'IL identico al primo esempio.

Tuttavia, questo approccio richiede di cambiare il codice sorgente, che è inaccettabile in base alla domanda.

    
risposta data 05.03.2013 - 03:20
fonte