Resharper lubi wskazywać wiele funkcji na stronie asp.net, które można ustawić na statyczne. Czy to pomaga mi, jeśli sprawiam, że stają się statyczne? Czy powinienem uczynić je statycznymi i przenieść je do klasy użytkowej?
Resharper lubi wskazywać wiele funkcji na stronie asp.net, które można ustawić na statyczne. Czy to pomaga mi, jeśli sprawiam, że stają się statyczne? Czy powinienem uczynić je statycznymi i przenieść je do klasy użytkowej?
Odpowiedzi:
Metody statyczne a metody instancji
10.2.5 Statyczne i instancyjne elementy specyfikacji języka C # wyjaśniają różnicę. Zasadniczo metody statyczne mogą zapewnić bardzo małe zwiększenie wydajności w stosunku do metod instancji, ale tylko w nieco ekstremalnych sytuacjach ( więcej informacji na ten temat można znaleźć w tej odpowiedzi ).
Reguła CA1822 w FxCop lub analizie kodu stwierdza:
„Po [oznaczeniu elementów jako statycznych] kompilator wyemituje do tych członków nie-wirtualne witryny wywołań, co zapobiegnie sprawdzaniu w czasie wykonywania każdego połączenia, które zapewnia, że bieżący wskaźnik obiektu nie ma wartości zerowej. Może to spowodować wymierny wzrost wydajności dla kodu wrażliwego na wydajność. W niektórych przypadkach brak dostępu do bieżącej instancji obiektu oznacza problem z poprawnością. ”
Klasa użyteczności
Nie należy przenosić ich do klasy użyteczności, chyba że ma to sens w twoim projekcie. Jeśli metoda statyczna odnosi się do określonego typu, tak jak ToRadians(double degrees)
metoda odnosi się do klasy reprezentującej kąty, sensowne jest, aby ta metoda istniała jako element statyczny tego typu (uwaga, jest to skomplikowany przykład do celów demonstracyjnych).
Wydajność, zanieczyszczenie przestrzeni nazw itp. Są moim zdaniem drugorzędne. Zadaj sobie pytanie, co jest logiczne. Czy metoda logicznie działa na instancji typu, czy jest związana z samym typem? Jeśli jest to ten drugi, uczyń go metodą statyczną. Przenieś go do klasy użyteczności tylko, jeśli jest powiązany z typem, który nie jest pod twoją kontrolą.
Czasami istnieją metody, które działają logicznie na przykład, ale nie zdarzają się użycie dowolnego stanu instancji jest jeszcze . Na przykład, jeśli budujesz system plików i masz pojęcie katalogu, ale jeszcze go nie zaimplementowałeś, możesz napisać właściwość zwracającą rodzaj obiektu systemu plików, i zawsze będzie to po prostu „plik” - ale jest on logicznie powiązany z instancją, a zatem powinna być metodą instancji. Jest to również ważne, jeśli chcesz uczynić metodę wirtualną - twoja konkretna implementacja może nie wymagać stanu, ale klasy pochodne mogą. (Na przykład pytanie kolekcji, czy jest to tylko do odczytu - być może nie zaimplementowałeś jeszcze tej formy tylko do odczytu, ale wyraźnie jest to właściwość samej kolekcji, a nie typu).
Oznaczenie metody jako static
wewnątrz klasy sprawia, że oczywiste jest, że nie korzysta ona z żadnych elementów instancji, co może być pomocne przy przeglądaniu kodu.
Nie musisz koniecznie przenosić go do innej klasy, chyba że ma być dzielony przez inną klasę, która jest równie ściśle powiązana pod względem koncepcyjnym.
Jestem pewien, że tak się nie dzieje w twoim przypadku, ale jeden „nieprzyjemny zapach”, który widziałem w jakimś kodzie, który musiałem cierpieć z powodu utrzymywania stosowanej metody wielu statycznych metod.
Niestety były to metody statyczne, które zakładały określony stan aplikacji. (dlaczego, na pewno będziemy mieć tylko jednego użytkownika na aplikację! Dlaczego klasa User nie śledzi tego w zmiennych statycznych?) Były to chwalone sposoby dostępu do zmiennych globalnych. Mieli także konstruktory statyczne (!), Które prawie zawsze są złym pomysłem. (Wiem, że jest kilka rozsądnych wyjątków).
Jednak metody statyczne są dość przydatne, gdy uwzględniają logikę domeny, która tak naprawdę nie zależy od stanu instancji obiektu. Mogą sprawić, że Twój kod będzie znacznie bardziej czytelny.
Tylko upewnij się, że umieszczasz je we właściwym miejscu. Czy metody statyczne ingerują w stan wewnętrzny innych obiektów? Czy można uzasadnić, że ich zachowanie należy do jednej z tych klas? Jeśli nie rozdzielasz problemów w odpowiedni sposób, możesz mieć problemy z bólem głowy później.
To jest interesujące przeczytać:
http://thecuttingledge.com/?p=57
ReSharper tak naprawdę nie sugeruje, aby twoja metoda była statyczna. Powinieneś zadać sobie pytanie, dlaczego ta metoda jest w tej klasie, w przeciwieństwie do, powiedzmy, jednej z klas, która pojawia się w jej podpisie ...
ale oto, co mówi dokumentacja resharper: http://confluence.jetbrains.net/display/ReSharper/Member+can+be+made+static
Wystarczy dodać do @Jason prawdą jest odpowiedź , to ważne jest, aby uświadomić sobie, że tylko wprowadzenie „static” na metodzie nie gwarantuje, że metoda będzie „czysty”. Będzie bezstanowy w odniesieniu do klasy, w której jest zadeklarowany, ale może również uzyskiwać dostęp do innych „statycznych” obiektów, które mają stan (konfiguracja aplikacji itp.), Nie zawsze może to być zła rzecz, ale jeden z powodów, dla których Osobiście wolę metody statyczne, gdy tylko mogę, że jeśli są czyste, możesz je testować i uzasadniać w izolacji, bez martwienia się o stan otoczenia.
Powinieneś robić to, co jest najbardziej czytelne i intuicyjne w danym scenariuszu.
Argument wydajności nie jest dobry, z wyjątkiem najbardziej ekstremalnych sytuacji, ponieważ jedyne, co się faktycznie dzieje, to to, że jeden dodatkowy parametr ( this
) jest wypychany na stos, na przykład metody.
W przypadku złożonej logiki w klasie znalazłem prywatne metody statyczne przydatne w tworzeniu logiki izolowanej, w której dane wejściowe instancji są wyraźnie określone w sygnaturze metody i nie mogą wystąpić żadne skutki uboczne instancji. Wszystkie wyjścia muszą być przesyłane za pomocą wartości zwracanej lub parametrów out / ref. Podział skomplikowanej logiki na pozbawione skutków ubocznych bloki kodu może poprawić czytelność kodu i zaufanie zespołu programistów do niego.
Z drugiej strony może to prowadzić do zanieczyszczenia klasy przez rozprzestrzenianie się metod użyteczności. Jak zwykle, logiczne nazewnictwo, dokumentacja i spójne stosowanie konwencji kodowania zespołu mogą to złagodzić.
Ustawienie statycznej metody oznacza, że możesz wywoływać metodę spoza klasy bez uprzedniego tworzenia instancji tej klasy. Jest to pomocne podczas pracy z obiektami lub dodatkami dostawców zewnętrznych. Wyobraź sobie, że musisz najpierw utworzyć obiekt konsoli „con” przed wywołaniem con.Writeline ();
Pomaga kontrolować zanieczyszczenie przestrzeni nazw.
Class.a_core_function( .. )
vsa_core_function( .. )
Po prostu moja tuppence: Dodanie wszystkich wspólnych metod statycznych do klasy narzędzi pozwala na dodanie
using static className;
do instrukcji using, dzięki czemu kod jest szybszy do pisania i łatwiejszy do odczytania. Na przykład mam dużą liczbę tak zwanych „zmiennych globalnych” w odziedziczonym przeze mnie kodzie. Zamiast tworzyć zmienne globalne w klasie, która była klasą instancji, ustawiłem je wszystkie jako właściwości statyczne klasy globalnej. Wykonuje to zadanie, jeśli jest bałagan, i mogę po prostu odwoływać się do właściwości według nazwy, ponieważ mam już statyczną przestrzeń nazw.
Nie mam pojęcia, czy to dobra praktyka, czy nie. Mam tak wiele do nauczenia się o C # 4/5 i tyle starszego kodu do refaktoryzacji, że po prostu próbuję poprowadzić wskazówki od Roselyn.
Joey
Mam nadzieję, że już zrozumiałeś różnicę między metodami statycznymi a instancjami. Ponadto może być długa i krótka odpowiedź. Długie odpowiedzi są już dostarczane przez innych.
Moja krótka odpowiedź: Tak, możesz przekonwertować je na metody statyczne, jeśli sugeruje to Resharper. Nie ma w tym nic złego. Zamiast tego, ustawiając metodę na statyczną, faktycznie chronisz ją, aby niepotrzebnie nie przypisywać żadnych elementów instancji do tej metody. W ten sposób możesz osiągnąć zasadę OOP „ Minimalizuj dostępność klas i członków ”.
Kiedy ReSharper sugeruje, że metodę instancji można przekonwertować na metodę statyczną, w rzeczywistości mówi: „Dlaczego ... ta metoda siedzi w tej klasie, ponieważ w rzeczywistości nie używa żadnego ze swoich stanów?” Daje to do myślenia. Następnie to Ty możesz zrozumieć potrzebę przeniesienia tej metody do statycznej klasy użyteczności, czy nie. Zgodnie z zasadami SOLID klasa powinna ponosić tylko jedną podstawową odpowiedzialność. W ten sposób możesz lepiej uporządkować swoje zajęcia. Czasami potrzebujesz niektórych metod pomocniczych, nawet w klasie instancji. W takim przypadku możesz zatrzymać ich w ramach pomocnika #region.