2013-06-08 15 views
12

Czy można użyć ReSharper do wyszarzania przydatnego, ale brzydkiego kodu przy użyciu ReSharper? Na przykład, gdy chcę dodać szczegółowe rejestrowanie, dobrze byłoby, aby kod funkcjonalny wyróżniał się wokół kodu logowania.Wygaszenie kodu logowania przy użyciu ReSharper

Próbowałem użyć wyszukiwania w katalogu wzorców ReSharpera, aby dopasować wzorce w moim kodzie i podświetlić je na szaro, ale obsługuje tylko wskazówki, sugestie, ostrzeżenia i błędy.

Szukam czegoś podobnego do tego, jak Debug.WriteLine jest wyświetlany w trybie Release, chociaż nie chcę kodu do kompilacji.

+3

Jest to ciekawy pomysł. Możesz zasugerować to na swoim trackerze problemów: http://youtrack.jetbrains.com/issues/RSRP –

+0

Zasugerowano tutaj: https://youtrack.jetbrains.com/issue/RSRP-437773 –

Odpowiedz

-3

Po prostu tego nie rób.

Jest to zły sposób radzenia sobie z niestrukturalnym kodem, a to będzie tylko nieznacznie pomocne i tylko dla Ciebie. Jeśli zrobisz to w sposób sugerowany (jeśli to możliwe), inni programiści muszą zainstalować program ReSharper i skonfigurować go tak, jak ty, jeśli chcą, aby logika biznesowa się wyróżniała.

To nie jest to, o co prosiłeś, ale myślę, że lepszym podejściem jest przeniesienie obszernej rejestracji na oddzielne metody/klasy. Wtedy kod związany z logowaniem byłby tylko pojedynczym wywołaniem metody w twoich obecnych metodach.

+1

Nie możesz się ruszyć cały przyziemny kod (taki jak rejestrowanie lub sprawdzanie) w celu oddzielenia metod, zwykle jest przeplatany logiką. –

9

Możesz to zrobić, ale to jest hack. Co możesz zrobić, udekoruj swoje metody rejestrowania za pomocą ConditionalAttribute, używając ReSharper's External Annotations.

Adnotacje są wykorzystywane w ReSharper niemal wszędzie, to jak to się zna na szarą linię w wersji Debug.WriteLine, na przykład, ponieważ Debug.Write... linie są ozdobione atrybut [Conditional("DEBUG")].

Co można zrobić, to oszukać dokonując ReSharper myśleć że istnieje taka metoda uzależnione od metod Twojego rejestratora. Możesz to zrobić, stosując ten atrybut zewnętrznie przez XML.

pisałem o zrobieniu czegoś takiego w my blog, oto jak można to zrobić:

  1. Utwórz plik o nazwie YourLogger.ExternalAnnotations.xml, np NLog.ExternalAnnotations.xml i umieść go obok zespołu rejestratora.
  2. Dodaj następujący:
<assembly name="NLog"> 
    <member name="M:NLog.Logger.Info(System.String)"> 
    <attribute ctor="M:System.Diagnostics.ConditionalAttribute.#ctor(System.String)"> 
     <argument>LOG</argument> 
    </attribute> 
    </member> 
    <member name="M:NLog.Logger.Debug(System.String)"> 
    <attribute ctor="M:System.Diagnostics.ConditionalAttribute.#ctor(System.String)"> 
     <argument>LOG</argument> 
    </attribute> 
    </member> 
</assembly> 

Dla każdej metody, którą chcesz "szary out", trzeba będzie dodać <member> blok o nazwie XML-Doc ID metody. W ReSharper 8 EAP dostępna jest opcja Skopiuj identyfikator dokumentu XML do schowka, znajdującego się pod menu ReSharper's Edycja.

To zasadniczo powoduje, że silnik ReSharpera uważa, że ​​istnieje [Conditional("LOG")] zdefiniowany w metadanych typu rejestratora.

Po dodaniu wszystkich pożądanych metod wystarczy ponownie załadować rozwiązanie. Powinieneś dostać to, czego szukasz (coś w rodzaju ...jak powiedziałem, jest to hack :))

ReSharper hackery

+0

Wysoce nie polecam tego, ponieważ inwokacje kasowane przez atrybut "[Conditional]" wpływają na wykres przepływu kontrolnego kompilatora C# i na określoną analizę przydziału, a także na analizę kodu R #. ReSharper zignoruje wszelkie użyteczne informacje na temat wyrażeń ocenianych w ramach '[Warunkowe]' wywołań, to jest "za dużo" dla samego szarzenia kodu. Lepiej napisz wtyczkę :) – ControlFlow

+1

@ControlFlow Powinienem chyba dodać "nie próbuj tego w domu" wykluczenie :) –

Powiązane problemy