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
aDefaultTemplateEngine
nel secondo esempio)?