Często spotykam się z pomocnikami lub klasami Java w języku Java lub jakimkolwiek innym języku. Zadawałem więc sobie pytanie, czy jest to jakiś anty-wzór, a istnienie tego rodzaju klas to po prostu brak braków w projektowaniu i architekturze oprogramowania.
Często te klasy są ograniczone przy użyciu tylko metod statycznych, które robią wiele rzeczy. Ale przede wszystkim jest to zależne od kontekstu i stanowe.
Moje pytanie brzmi: co sądzisz o tego rodzaju statycznych klasach helper / util, ponieważ zaletą jest oczywiście szybkie wywoływanie przy użyciu samej nazwy klasy.
A na jakim poziomie abstrakcji uniknąłbyś korzystania z tego rodzaju klas?
Moim zdaniem słowo kluczowe „static” powinno być dozwolone w deklaracji klasy (Java), a nie w przypadku metod. Moim zdaniem użycie go w ten sposób może być dobrą alternatywą i środkiem do połączenia paradygmatów Procuedural i OO w Javie i uniknięcia niewłaściwego użycia słowa kluczowego.
Dodatki wynikające z odpowiedzi:
Na początku myślę, że łączenie różnych paradygmatów, a nawet używanie języków skryptowych interpretowanych w środowisku wykonawczym w kodzie skompilowanym maszynowo lub maszynowo jest całkowicie legalne.
Z mojego doświadczenia wynika, że w trakcie procesu opracowywania projektu tego rodzaju pomocnicy i narzędzia, czy jak tam się nazywa, rosną i rosną i są wykorzystywane w każdym zapomnianym rogu bazy kodu, która pierwotnie została zaprojektowana jako modułowa i elastyczna. A ze względu na brak czasu na refaktoryzację lub ponowne przemyślenie projektu, z biegiem czasu pogorszysz sytuację.
Myślę, że static
powinienem zostać usunięty z Javy. Zwłaszcza teraz, gdy możliwe jest użycie jeszcze bardziej wyrafinowanych funkcjonalnych elementów językowych.
źródło
Odpowiedzi:
Cóż, Java nie ma wolnych funkcji, dlatego jesteś zmuszony umieścić je jako funkcje statyczne w jakiejś klasie pro-forma. Konieczne obejście nigdy nie jest anty-wzorem, choć może brakować elegancji.
Następnie z bezpłatnymi funkcjami nie ma nic złego. W rzeczywistości korzystanie z bezpłatnych funkcji zmniejsza sprzężenie, ponieważ mają one dostęp tylko do publicznego interfejsu zamiast do wszystkich krwawych szczegółów.
Oczywiście używanie funkcji swobodnych / statycznych w żaden sposób nie zmniejsza niebezpieczeństw związanych ze zmiennym stanem współdzielonym, szczególnie globalnym.
źródło
this
i wymagają odpowiedniej instancjiStatyczne funkcje narzędziowe lub pomocnicze nie są anty-wzorcem, jeśli są zgodne z pewnymi wytycznymi:
Powinny być wolne od skutków ubocznych
Służą do zachowania specyficznego dla aplikacji, które nie należy do klasy lub klas, w których działają te funkcje
Nie wymagają żadnego wspólnego stanu
Typowe przypadki użycia:
Na przykład w aplikacji, nad którą pracowałem, użytkownicy przechowują wpisy do dziennika dotyczące ich działań. Mogą określić datę obserwacji i pobrać przypomnienie o wydarzeniu. Stworzyliśmy statyczną klasę narzędziową do pobierania pozycji dziennika i zwracania surowego tekstu dla pliku .ics.
Nie wymagało to żadnego wspólnego stanu. Nie mutuje żadnego stanu, a utworzenie zdarzenia iCal z pewnością było specyficzne dla aplikacji i nie należało do klasy pozycji dziennika.
Jeśli funkcje statyczne lub klasy użytkowe mają skutki uboczne lub wymagają stanu wspólnego, zaleciłbym ponowną ocenę tego kodu, ponieważ wprowadza on sprzężenie, które może być trudne do wyszydzenia w przypadku testów jednostkowych.
źródło
Będzie to zależeć od twojego podejścia. Wiele aplikacji jest napisanych w sposób bardziej funkcjonalny, w przeciwieństwie do klasycznego sposobu myślenia (w tym większość witryn, na których się znajdujesz).
Przy takim sposobie myślenia na klasach pracowniczych będzie wiele metod narzędziowych, które można połączyć jako metody statyczne. Są one zasilane / używane bliżej zwykłych obiektów, które tylko przechowują dane i są przekazywane.
Jest to prawidłowe podejście i może działać bardzo dobrze, zwłaszcza na dużą skalę.
źródło
Agent.Save(obj)
w porównaniuagentInstance.Save(obj)
. W tym drugim przypadku masz możliwość wstrzyknięcia do używanegoagentInstance
kodu. W konsekwencji można wstrzykiwać w żadnej grupie dzieci oAgent
zbyt która umożliwia ponowne wykorzystanie og użyciu kodu z różnych „typów” oAgent
bez rekompilacji. To jest niskie sprzężenie .Osobiście uważam, że jedyną ważną częścią takich klas pomocniczych jest to, aby stały się prywatne. Poza tym - są ściśle dobrym pomysłem (stosowane oszczędnie).
Myślę o tym - jeśli we wdrażaniu klasy (lub funkcji) - coś takiego jest pomocne i sprawia, że implementacja jest jaśniejsza, jak może być źle? I CZĘSTO bardzo ważne jest zdefiniowanie takich prywatnych klas pomocników, aby umożliwić integrację z innymi algorytmami i korzystanie z nich, zależnie od tego, czy dane mają określony kształt.
To, czy nazwać go „pomocnikiem”, jest drobną kwestią osobistego gustu, ale oznacza, że pomaga we wdrażaniu i nie jest interesujące dla szerszej publiczności. Jeśli to ma sens - idź!
źródło
java.lang.Math
.Występowanie
static
klas pomocniczych opiera się na nieporozumieniu. To, że nazywamy klasy tylkostatic
metodami „klasami użyteczności”, nie oznacza, że nie można pisać typowych zachowań w POJO.static
klasy pomocnicze są anty-wzorcowe z trzech powodów:Statyczny dostęp do metod pomocniczych ukrywa zależności . Gdyby te „klasy użytkowe” były POJO, można je wprowadzić do klasy zależnej jako parametry konstruktora, co uczyniłoby zależność oczywistą dla każdego użytkownika klasy zależnej.
Statyczny dostęp do tych metod pomocniczych powoduje ścisłe połączenie . Oznacza to, że kod korzystający z metod pomocniczych jest trudny do ponownego użycia i (jako efekt uboczny) testowany.
Zwłaszcza jeśli utrzymują stan, są to jedynie zmienne globalne . I mam nadzieję, że nikt nie twierdzi, że zmienne globalne są jakieś dobre ...
Statyczne klasy pomocnicze są częścią anty-wzorca kodu STUPID .
OP napisał:
Statyczne konstrukty stanowe to stany globalne.
Tak, z powodu. I prawie wszystkie aplikacje wymagają pewnego rodzaju stanu globalnego .
Ale stan globalny ! = Zmienna globalna .
Możesz stworzyć stan globalny za pomocą technik OO poprzez wstrzykiwanie zależności, ale nie można uniknąć stanu globalnego za pomocą stanowych struktur statycznych, które są zmiennymi globalnymi na dole.
źródło
Func<Result, Args>
obiekty, które są tworzone w innym miejscu.