/ / Do jakiego stopnia należy zastosować odbicie? - .net, odbicie

Do jakiego stopnia Odbicie powinno być używane? - .net, odbicie

W projekcie wpadliśmy na bardzo trudny scenariusz. W naszym projekcie wykorzystaliśmy wiele refleksji.

Mamy ..

  • Struktura sprawdzania poprawności oparta na atrybutach i odbiciach
  • Metody rozszerzeń, które przekształcają DataRow w obiekt encji przy użyciu atrybutów i odbić i odwrotnie. To samo, co zrobiliśmy dla DataTable i EntityCollections.
  • Interfejs IComparer zaimplementowany w ogólnej klasie EntityComparer, który używa refleksji do porównywania dwóch obiektów Entity.

Podobnie jak w powyższych scenariuszach, w naszej aplikacji używaliśmy Refleksji w wielu innych częściach. Po użyciu odbicia zauważyliśmy, że aplikacja przyjmuje więcej cykli przetwarzania z odbiciem.

Do jakiego stopnia powinniśmy używać Reflection w naszymprojekt ? Na jakie obszary projektu najbardziej negatywnie wpływa refleksja w zakresie przetwarzania? Gdzie refleksja nie wpłynie na wydajność? Czy istnieją jakieś wytyczne dotyczące korzystania z Reflection?

Odpowiedzi:

4 dla odpowiedzi № 1

Odbicie jest silne, ale ma wady. Zasadniczo staraj się kodować bez niego - ale jest to niezwykle przydatne dla bibliotek „szkieletowych”, w których masz niewielką / ograniczoną wiedzę na temat rzeczywistych obiektów; na przykład:

  • Narzędzia ORM / DAL (ładowanie / zapisywanie dowolnych danych)
  • wiązanie danych
  • serializacja

Istnieją kary za wyniki z refleksją ad hoc, ale jeśli zamierzasz to zrobić dużo (w bibliotece i w ciasnej pętli) możesz temu zaradzić:

  • używając Delegate.CreateDelegate (jak wpisane delegat; nie używaj DynamicInvoke)
  • pisząc dynamiczną IL
  • używając Expression w .NET 3.5

I oczywiście każdy taki kod powinien być buforowany i ponownie używany (nie chcesz kompilować + wykonać dla każdego wywołania; tylko pierwsze - reszta powinna po prostu wykonać).

Lub istnieją biblioteki, które to abstrakcyjnie; na przykład, HyperPropertyDescriptor zawija niestandardową IL (dla dostępu członka) do znajomego PropertyDescriptor API - dzięki czemu jest bardzo szybki, ale bezbolesny. Twoje pytanie wymienia tabele danych i podmioty; co brzmi los lubić to poprzednie pytanie, w którym wykonałem pewne pomiary za pomocą HyperDescriptora, z podsumowaniem (w milisekundach):

Vanilla 27179
Hyper   6997

Więc moje „weź”:

  • w podanie; bardzo mało - ogólnie w ostateczności
  • w Twoim wspólna biblioteka / biblioteki; w stosownych przypadkach (zauważając, że w miarę możliwości preferowane są interfejsy itp.)

1 dla odpowiedzi nr 2

Jeśli but pasuje, to noś go ... Jeśli rozwiązuje on dany problem i nie powoduje nadmiernego przetwarzania mierzonego za pomocą pewnego rodzaju testów (najlepiej profilera), nie martw się o to. Istnieje wiele problemów, które można łatwo rozwiązać za pomocą refleksji.

Jedyną wskazówką, jaką mam w związku z decyzją o niestosowaniu odbicia, jest użycie go do uzyskania właściwości, do których normalnie nie miałbyś dostępu (tj. Własności prywatnych w klasie innej osoby).


1 dla odpowiedzi nr 3

Twoje niefunkcjonalne wymagania / QoS powinnydyktuj, czy należy zastosować refleksję i tak jak w przypadku mojego komentarza, testu, testu, testu (jednostka, test wydajności itp.). Jeśli twój klient jest zadowolony z wydajności, powiedziałbym, że idź na to. Może i rzeczywiście daje pewien wzrost produktywności, gdy jest używany prawidłowo.

Osobiście zrezygnuję z używania refleksji, kiedy tylko będę mógł.


1 dla odpowiedzi nr 4

Refleksja może przynieść realne korzyścirozciągliwość i elastyczność. Korzystanie z odbicia nie powinno Cię zniechęcać, zwłaszcza jeśli daje to więcej korzyści. Staraj się oszczędnie korzystać z refleksji, ale nie zakładaj, że użycie refleksji będzie bardzo bolesne, gdy zajdzie taka potrzeba. Ten artykuł jest dobry na ten temat: http://www.west-wind.com/weblog/posts/351.aspx


1 dla odpowiedzi nr 5

Radzę zawsze starać się znaleźć jakiś przedmiotw pierwszej kolejności ukierunkowane rozwiązanie, zamiast uciekać się do refleksji przy pierwszej okazji. Może być łatwiej osiągnąć coś za pomocą refleksji, ale kod generalnie jest lepiej zorganizowany dzięki rozwiązaniu obiektowemu, a Ty pozbywasz się narzutu refleksji.

Przez lata jako programista korzystałem tylko zrefleksja dwa razy ... Pierwszym było uzyskanie dostępu do jakiejś prywatnej zmiennej, aby uzyskać postęp wysyłania żądania internetowego. Drugim było dynamiczne tworzenie instancji obiektów podczas odczytu z czytnika danych, który później z przyjemnością zastąpiłem rozwiązaniem ogólnym.