Domanda

Ho avuto qualche codice ereditaria che ha la tendenza a passare gli oggetti intorno come interfacce (IFoo, per esempio), allora, in luoghi arbitrarie nel codice, spontaneamente li getteranno alle implementazioni concrete di queste interfacce (diciamo, MyConcreteFoo).

Ecco un esempio stupido:

public bool IsThisFooScaredOfMonkeys(IFoo foo)
{
    if (foo is MyConcreteFoo)
    {
        return ((MyConcreteFoo)foo).BelievesMonkeysAreEvil;
    }
    return false;
}

Quello che mi piacerebbe fare è scrivere una query NDepend CQL per raccogliere questi tipi di calchi e darmi un conteggio per ogni metodo o per tipo di, o qualcosa di veramente. Solo una cosa così so dove posso iniziare a concentrarsi i miei sforzi su come liberarsi di questa particolare marca di stupidità, invece di inviare la mia squadra speleologia attraverso il codice a caccia casuale per calchi ...

Qualcuno sa se c'è un modo per farlo? Sto indovinando non (non ci possono essere troppe persone là fuori che hanno bisogno di quella particolare funzionalità), ma ho pensato di chiedere prima qui ...: -)

Naturalmente, altre idee sui modi per rendere il cast caccia andare più veloce sarebbe altrettanto apprezzato.

È stato utile?

Soluzione

Questo sarebbe molto bello, ma NDepend è limitato ad un insieme di entità che non copre individuale dichiarazioni.

Enti NDepend

  1. Metodi
  2. Campi
  3. Tipi
  4. I namespace
  5. Gruppi

Nonostante questo limite NDepend è ancora abbastanza impressionante! Forse questa è una caratteristica prossima versione.

Ora Patrick Smacchia potrebbe essere in grado di dirmi diverso, quindi vorrei contattarlo con questa domanda. Mi aspetto di ottenere una risposta indietro in fretta che è piuttosto in cima delle cose.

Su un lato nota:

Se si utilizza ReSharper 5,0 ha una Ricerca strutturale che permetterebbe di trovare dichiarazioni come questa. Si dovrebbe costruire il te stesso di ricerca, ma è uno strumento piuttosto potente.

Questo modello avrebbe raggiunto l'esempio precedente:

if($fooObject$ is $concreteFoo$)
{
    return (($concreteFoo$)$fooObject$).$anyIdentifier$;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top