Zmienne static boolean symbolizujące stany programu

0

Mam takie pytanko: bawiłem się analizatorami kodu javovego i wychwytywał mi on "nieprofesjonalny kod" :

Mam klase która ma tylko pola statyczne boolean symbolizujace stany programu. po prostu jeżeli np. zamknę socket, lub on z jakiś powodów sam się zamknie to w metodzie serverSocketClose ustawiam flagę z tej mojej "stanowej" klasy na srverConnected= false;

Wysawało mi się to logiczne i przejrzyste...a okazuje się że jest lamerskie i niepożadane.

W jaki inny sposób można zrealizować "stanowość" aplikacji? Głownie to są booleny ale może też być jakiś port albo obecnie wybrane ustawienia. Nie wyobrażam sobie tworzenia jakiegoś obiektu w którym by te stany były i przekazywanie jego referencji po całej aplikacji - każda klasa posiadajaca ten obiekt jako pole to by była masakra.

0

Problem z automatycznymi analizatorami kodu jest taki, że analizują one tylko składnię, a nie logikę kodu. W najprostszym przypadku

public final class AppStates implements Serializable{

    public static boolean state;

}

Analizator przyczepi się do kilku rzeczy:

  1. pole jest typu public, a powinno być private z getterami i setterami
  2. brak konstruktora domyślnego i UIDu
  3. brak dokumentacji

Wynika to z faktu, że analizator sprawdza kod i porównuje go z listami "good practices" i "bad practices", ale nie może sprawdzić czy w danym szczególnym przypadku kod nie jest aby dobry.

Jeżeli zależy ci na braku błędów możesz zrobić dwie rzeczy:

  1. dodać do konfiguracji analizatora by nie brał pod uwagę tej klasy.
  2. zamienić pola publiczne na prywatne i dodać statyczne gettery/settery z synchronizacją gdzie trzeba.
0

Użyj wstrzykiwania zależności. W ten sposób nie będziesz musiał przekazywać referencji do obiektu po całym projekcie. Jedyną klasą z elementami statycznymi pozostanie wtedy wstrzykiwacz.

0

Dziękuje koziołek - wypróbowałem kilka analizatorów i kart: są one static analyzers do bólu - jadą z porównywaniem na "twardo". BTW - jest jakiś non-static analyzer? w sensie jak rozumiem miałoby to mierzyć wydajność już bajtkodu i w razie potrzeby doradzać zmiany kodu? Takie coś chyba mogłoby wychwytywac niepotrzebne tworzenie kodu który już się gdzieś powtarza.

Wibowit - znam wstrzykiwanie zalezności tylko z wielkiego projektu w którym teraz pracuje, ale tylko tego używam: jeden setter i tyle.

Jak to zrobić sam? Muszę kolubrynę np. Springa zapinać? Moja aplikacja ma kilkadziesiąt klas i oprócz sockwtów jakiś tasków, kilku wątków i GUI w swingu to tam nie ma nic "transakcyjnego" i czy żenienie tego ze spingiem ma sens? Proszę o radę i ukierunkowanie.

Pozdrawiam

0

Koziolek i dobre rady ciag dalszy: klasa serializable z polami statycznymi...

0

@lipkerson, możesz wziąć jako DI jakiś mały silniczek w rodzaju Google Guice.

Co do analizatora to powiem ci, że nie wiem, ale na pewno coś się znajdzie. Swoją droga taka funkcję ma JIT, ktory potrafi w locie zmienić sobie strukturę kodu na optymalniejszą i jeszcze skompilować często wołane elementy do kodu natywnego platformy.

0

Kilkadziesiąt klas to niewiele (no chyba, że to kolosy, ale wtedy powinna być refaktoryzacja).

Też polecam Google Guice. Springa to chyba używają miłośnicy XMLa, ale to jest zboczenie. Guice jest konfigurowane przede wszystkim przez kod Javowy.

Nie musisz zmieniać całego kodu. Wstrzykiwacz jest statyczny, więc w klasach czy metodach gdzie do tej pory korzystałeś ze statycznego stanu wołasz wstrzykiwacza, aby ci wstrzyknął coś do jakiejś zmiennej i jedziesz dalej.

Ewentualnie jeżeli masz jakiś framework czy fabryki budujące obiekty, to one mogą od razu wstrzykiwać co trzeba.

0

Jak podajesz przyklady to je przemysl.

@Wibovit: spring od wersji 3 jest duzo lepiej zmodularyzowany, mozna uzywac DI bez calej reszty. Do tego, od wersji 3 jest cos co sie nazywa Java Config - swietne rozwiazanie, podobne do modulow guice. W zwiazku z tym, sa 3 rodzaje komfiguracji w spring: XML, anotacje (@Autowired, wsparcie dla @Inject) oraz wspomniane Java Config.
Wspominam tylko, poniewaz 'spring to xml' to zwyczajna nieprawda, nie powinno sie tego glosic. Zachecam do zapoznania sie z czyms co sie krytykuje zebys nie wyjsc na durnia i ignoranta.
Na marginesie, jestem wielkim fanem DI w formie Guice.

0

No dobra ... a EJB? mogę to wykorzystać w prosty sposób? Tylko do wstrzykiwania zależnosci?

0

Mozesz jesli chcesz.
Ale wierz mie, nie chcesz podazac ta sciezka - tworzenie aplikacji EJB, zaprzeganie calego serwera Java EE tylko po to aby miec wstrzykiwanie to bardzo zly pomysl.
Posluchac przedmowcow, Guice jest naprawde prosty, maly i szybki - w 30 minut powinienes sie z nim zaznajomic. Poza tym, spojrz z tej strony - jak nie teraz, to kiedy? Wyjdzie Ci to na dobre, wierz mi.

1 użytkowników online, w tym zalogowanych: 0, gości: 1