Wpis z mikrobloga

Czy w Javie jak jakaś metoda jest często wywoływana to powinna zawierać lokalne zmienne? Czy lepiej aby miała zmienne zdefiniowane po prostu w klasie i je wykorzystywać w metodzie? Kiedyś pamiętam że gdzieś czytałem że lepiej by w metodzie którą często się używa lepiej aby nie było inicjalizacji zmiennych bo wtedy program będzie musiał je na nowo tworzyć i usuwać, ale raz to chyba nie było odnośnie Javy, dwa to było z 14 lat temu to się zmienić mogło.
Kompilator mi podpowiada aby właśnie definiować zmienne bezpośrednio w metodzie ale nie wiem czy mu wierzyć. ( ͡° ͜ʖ ͡°)

W sensie ja wiem że mogą być różne przypadki jak np wielowątkowość, czy zajmowanie pamięci itd, ale mi chodzi po prostu o najprostszy program który powiedzmy wywołuje w kółko jakaś metodę i hiperbolizując - niech ta metoda ma z 20 tysięcy zmiennych, lepiej aby je zdefiniować lokalnie w metodzie czy w klasie?

#java #programowanie #pytanie #kiciochpyta
  • 25
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@mdlejtecole: Tak chodzi mi o zmienną którą używam w jednej metodzie tylko, wiem że jak w wielu to inny temat. Mi chodzi mi o dobrą praktykę, wiem że w dzisiejszych czasach to już w większości przypadków bez większego znaczenia ale po prostu chciałbym pisać jak najpoprawniej.
  • Odpowiedz
@Sinti: jak 20k zmiennych? Takich rzeczy się nie robi, robisz małe klasy odpowiedzialne za jedną rzecz. Ja rzadko mam klasy, które mają więcej niż 300 linijek kodu. I dla czytelności umieszczasz te zmienne w metodzie, która je używa. Nie wiem jak w Java, ale w C# nie musisz ich już deklarować na samym początku metody, tylko w momencie jak zaczynasz je używać.
  • Odpowiedz
@Sinti: no ale to bez sensu polemizować, nad czymś co się nie wydarzy. Nawet jakbyś miał 5/10 ty h zmiennych to wsadzasz do metody. Ewentualnie nie wiem jakaś duża tablice, to robisz static i tyle.
  • Odpowiedz
@mdlejtecole: To że się nie wydarzy to nie znaczy że nie mogę użyć hiperboli aby lepiej podkreślić o co mi chodzi. Mi chodzi o kwestie optymalizacyjne, nawet jeśli w obecnych czasach niema to większego znaczenia (albo ma w bardzo rzadkich przypadkach) to po prostu chciałbym to wiedzieć. Czytelność kodu czytelnością kodu, a optymalizacja optymalizacją. Przypuszczam że kompilatory obecnie są już tak mądre że same te kwestie rozwiążą ale jednak fajnie
  • Odpowiedz
chodzi po prostu o najprostszy program


@Sinti: No to piszemy kod tak, żeby był zrozumiały dla człowieka (i nie bawimy się w przedwczesną optymalizację, bo w większości przypadku kompilator i tak sobie to zoptymalizuje lepiej). Spotkałem się kiedyś z taką fajną zasadą związaną właśnie z czytelnością zmiennych: zmienną deklarujemy tak późno jak to możliwe ale nie później. Nie bawimy się więc w listowanie wszystkich zmiennych przed właściwym blokiem kodu, bo
PaaD - > chodzi po prostu o najprostszy program

@Sinti: No to piszemy kod tak, żeb...

źródło: comment_1661492682FPeGFgwkCqM2P9aiEAxyiK.jpg

Pobierz
  • Odpowiedz
@Sinti: O tym czy zmienna ma być lokalna czy ma być trzymana w polu klasy powinna decydować logika programu, a nie jakieś aspekty wydajnościowe. Jeśli zmienna jest potrzebna tylko na czas działania metody, to powinna być lokalna. Jeśli jednak jakiś informacje muszą być przechowane do następnego wywołania, to wtedy musisz zrobić pole. Pola komplikują analizę kodu bardziej niż obecność zmiennych lokalnych, więc zmienne lokalne powinny być Twoim pierwszym wyborem.
  • Odpowiedz
@Sinti: Co do wydajności, to zmienne lokalne prostych typów (np int) nie kosztują praktycznie nic jesli chodzi o CPU. Jak masz N zmiennych lokalnych, to bardzo możliwe, że alokacja wszystkich wykona się JEDNĄ instrukcją CPU. Oczywiście zajmują trochę miejsca na stosie, ale dopóki nie robisz jakiś głębokich rekurencji, to nie musisz się przejmować. Natomiast niestety w Javie (w przeciwieństwie do Rust, C, Pascala, C++ i wielu innych), utworzenie obiektu wymaga
  • Odpowiedz
@Sinti: premature optimization is the root of all evil

1. najpierw zrób żeby kod działał
2. potem popraw kod, żeby był dobrej jakości
3. wreszcie dopiero wtedy optymalizuj TAM GDZIE JEST
  • Odpowiedz
1. najpierw zrób żeby kod działał

2. potem popraw kod, żeby był dobrej jakości

3. wreszcie dopiero wtedy optymalizuj TAM GDZIE JEST POTRZEBA


@MacDada: świetna recepta na zmarnowanie 3x więcej czasu niż potrzeba - punkty 2 i 3 to będzie kompletne przepisanie wszystkiego na nowo, bo pisanie "byle działało" kończy się zwykle kodem spaghetti, a pisanie kodu bez jakiejkolwiek analizy wymagań wydajnościowych może spowodować że trzeba będzie przejść na inny
  • Odpowiedz
Kompletnie nie na temat, przecież wiem żeby nie optymalizować hello worlda. Mimo to dziękuje za odpowiedź.


@Sinti: Nie chodzi o to czy optymalizujesz Hello Worlda, ale czy i kiedy w ogóle siadać do optymalizacji kosztem jakości kodu.

Wiele osób zafiksowuje się w mikrooptymalizacji, zamiast skupić się na tym co jest znacznie cenniejsze niż czas procesora -> czyli
  • Odpowiedz
@MacDada:

Jeśli dobrze zrozumiałem pytanie, zastanawiasz się czy warto zadeklarować wartość jako pole obiektu/klasy zamiast na poziomie metody – celem optymalizacji.

Tak, ale nie w formie czy warto bo coś zyskam, tylko czy jakbym chciał coś perfekcyjnie zrobić albo np. czy sam kompilator już nie ogarnia tego typu kwestii i sam nie usuwa zmiennej w niektórych przypadkach. No po prostu kwestie wiedzy i świadomości.

Gdyby chcieć odpowiedzieć bezpośrednio na to
  • Odpowiedz
@MacDada: A co do tego co napisał @Krolik to myślę że po prostu się nie zrozumieliście, ja też na początku jak przeczytałem to się popukałem w głowę bo ty chyba założyłeś że ktoś ma aż tak dobre umiejętności ze z marszu napisze w miarę sensowny kod itd. a mnóstwo ludzi nawet po studiach często tego aż tak dobrze nie ogarnia i wtedy naprawdę będzie to pisanie kodu na nowo,
  • Odpowiedz