Czy prywatne metody statyczne w C # coś ranią?


10

Stworzyłem prywatną metodę sprawdzania poprawności dla pewnej weryfikacji, która ma miejsce wielokrotnie w mojej klasie (nie mogę przechowywać zweryfikowanych danych z różnych powodów). Teraz ReSharper sugeruje, że funkcja może być statyczna. Nie chcę tego robić z powodu znanych problemów z metodami statycznymi. Byłaby to prywatna metoda statyczna. Moje pytanie brzmi: czy prywatne metody statyczne mogą powodować podobne problemy z łączeniem i testowaniem, jak publiczne metody statyczne? Czy to zła praktyka? Nie sądzę, ale nie jestem pewien, czy jest tu pułapka.


10
Jakie są „znane problemy” z metodami statycznymi?
Robert Harvey

3
@Ed: Racja. Właściwie napisane metody statyczne nie powinny i tak dotykać zewnętrznych interfejsów API. Manipulowanie stanem wewnętrznym enkapsulowanym w klasie wydaje mi się całkowicie OK, a metoda nie musiałaby być testowana jednostkowo, ponieważ testy jednostkowe testują zewnętrzne zachowanie klasy.
Robert Harvey

1
Metody statyczne są podatne na modyfikowanie stanu globalnego, a także zabijają dziedziczenie (za każdym razem, gdy chcesz rozszerzyć funkcjonalność, musisz zmodyfikować kod wywołujący, ponieważ nie możesz przesłonić metody w klasie pochodnej). Jesteś przywiązany do tej jednej implementacji. Nie można wyśmiewać metod statycznych, co bardzo utrudnia ich testowanie jednostkowe. Ukrywają zależność . Jestem pewien, że jest więcej. Nie tylko ślepo ich unikam, proszę o podjęcie świadomej decyzji.
Tamás Szelei

2
@ Tamás Metody statyczne modyfikują stan globalny tylko wtedy, gdy napiszesz je w ten sposób, czego nigdy nie robię. Ogólnie mówiąc, używam tylko metod statycznych w klasach użytkowych, metod, które pobierają jeden lub więcej obiektów i zwracają obiekt bez skutków ubocznych. Tego rodzaju metody nie mają opisywanych problemów.
Robert Harvey

1
@ TamásSzelei W jaki sposób mają skłonność do modyfikowania stanu globalnego? Nie mogą nawet znaleźć stanu globalnego, dopóki nie przekaże się go do parametru.
CodesInChaos

Odpowiedzi:


16

Pomyślałbym: „Czy muszę to przetestować?”

Jeśli twoja metoda i tak jest prywatna, co oznacza, że ​​nie chcesz testować logiki jednostkowej w samej metodzie, to jeśli chodzi o testowalność i łatwość konserwacji, twoja klasa jest czarną skrzynką w obu przypadkach, wewnętrzne funkcjonowanie twojej klasy jest jej sprawą i jest sam. Nie wpłynie to również na refaktoryzację, co również należy rozważyć.

Tak więc, moim zdaniem: Nie, stworzenie „prywatnej” metody „prywatnej statycznej” nie będzie miało żadnych długoterminowych konsekwencji.


17

Z mojego punktu widzenia prywatne metody statyczne są najłatwiejsze z możliwych.

DataIn -> Metoda -> DataOut

Nie ma zależności od obiektów zewnętrznych, żadnych skutków ubocznych. Dlaczego uważasz je za złe?


Dziękuję Ci. Wyjaśniłem swoje obawy w komentarzach pod pytaniem.
Tamás Szelei

2
To, co opisujesz, jest poprawne tylko dla metod statycznych, które nie zależą od statycznych zmiennych składowych - to może zrobić różnicę między „dobrą” i „złą” metodą statyczną.
Doc Brown

2

Testowanie klas, które używają publicznych metod statycznych może być trudne, ponieważ nie jest (szczególnie) łatwe do zetknięcia / sfałszowania / wyszydzenia metod statycznych. Z drugiej strony metody instancji można łatwo wyśmiewać, szczególnie jeśli są wirtualne lub spełniają interfejs.

Nie widzę jednak żadnego powodu, aby nie używać prywatnych metod statycznych. Rzeczywiście, istnieje niewielka poprawa wydajności, ponieważ nie potrzebujesz wystąpienia klasy, aby zająć pamięć.

Z drugiej strony wszystko statyczne to zapach kodu. Czy to rzeczywiście „klasa pomocnicza”? Czy to możliwe, że metoda może bardziej użytecznie znajdować się w jednej z klas przekazywanych jako parametr? Odpowiedź na te pytania często brzmi: „jest statyczna”, ale warto o tym pamiętać.


Klasa zawierająca metodę statyczną i tak już zajmuje pamięć. Twój strach przed staticsłowem kluczowym wydaje się nieuzasadniony.
Robert Harvey
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.