• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Stosowanie zmiennych lokalnych vs globalnych

VPS Starter Arubacloud
+1 głos
2,391 wizyt
pytanie zadane 5 sierpnia 2017 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)

Witam, mam bardzo proste pytanie (zaznaczam że jestem początkujący) czemu prawie wszyscy doświadczeni programiści uważają że zmienne globalne są tak złe ? Nieraz słyszałem komentarze żeby nigdy ich nie tworzyć, unikać itp... . Chciał bym tylko się dowiedzieć co jest w nich takiego złego frown .Np tworzę prostą grę ,niech będzie to snake ,łatwiej mi stworzyć wężyka jako globalny vector czy lista w klasie do którego każda metoda ma dostęp i może go zmieniać niż bawić się w przekazywanie orginału vectora do funkcji ,tworzyć masę wskaźników i masę innych elementów utrudniających się znalezienie w kodzie . Przepraszam jeżeli mówię  o czymś na czym się jeszcze niezbyt znam ale bardzo mnie nurtuje pytanie czemu lepsze są zmienne lokalne ?...

3 odpowiedzi

+3 głosów
odpowiedź 5 sierpnia 2017 przez rafal.budzis Szeryf (85,260 p.)
wybrane 5 sierpnia 2017 przez Jakub 0
 
Najlepsza
Stworzenie listy w klasie jest poprawnym rozwiązaniem. Chodzi o porządek i czystość kodu. Np jeśli napisał byś już dużą grę która ma z 10-20 tyś linijek to trudno będzie ci znaleźć błąd jeśli będzie on związany z tym iż zmienna globalna ma złą wartość a edytujesz ją wszędzie. Brak zmiennych globalnych zmniejsza zakres poszukiwania błędów zazwyczaj tylko do jednej klasy oraz wszystko masz poukładane ;)

Zmienne globalne można porównać do bałaganu w pokoju ;D Jeśli jest to twój pokój bez problemu nawet w bałaganie znajdziesz wszystko ale innym programistą lepiej bałaganu nie pokazywać ;)
komentarz 5 sierpnia 2017 przez Jakub 0 Pasjonat (23,120 p.)
Dzieki za komentarz , to fakt ze mam spory problem z refaktoryzacja kodu ... Nie lubię tez zbytnio wskaźników wiec używam ich tylko w ostateczności kiedy nie da się zrobić czegoś w inny sposób ,dlatego często wole używać po prostu zmiennych globalnych ,czyli mówisz ze są sytuacje w których lepiej użyć zm. Globalnych i takie w których lepsze okażą się lokalne ? Bo np logiczne ze kiedy tworze algorytm sortowania liczb to tablice przekazuje wskaźnikiem lub referencja ,podczas gdy tak jak mówiłem z tablicy maja korzystać wszystkie funkcje to nie wiem w jaki inny sposób mogę to zakodować niż użyć zm glob...
+4 głosów
odpowiedź 5 sierpnia 2017 przez PoetaKodu Stary wyjadacz (10,990 p.)

Nie możesz kontrolować czasu życia zmiennych globalnych. Ten fakt jest najczęściej podawany ale do tego dochodzi dużo gorsza rzecz. Jeśli masz dwie zmienne globalne w dwóch plikach, to nie masz wpływu na kolejność ich utworzenia. Dajmy na to, że chcesz zrobić coś takiego:

vector<Color> colors = { Color_Red, Color_White, Color_Blue, Color_Black };

int main()
{
    // tutaj uzywasz tego vectora
}

A następnie w plikach Color.hpp oraz Color.cpp

// Color.hpp

typedef std::uint32_t Color;

extern Color Color_Red;
extern Color Color_Green;
extern Color Color_Blue;
extern Color Color_White;
extern Color Color_Black;

// Color.cpp

Color Color_Red = 0xFF0000FF;
Color Color_Green = 0x00FF00FF;
Color Color_Blue = 0x0000FFFF;
Color Color_White = 0xFFFFFFFF;
Color Color_Black = 0x000000FF;

Takie coś może zadziałać a może się stać tak, że vector<Color> colors zostanie zdefiniowany przed ustawieniem wartości zmiennym Color_Red itp, przez co będzie trzymał same zera.

Dodatkowo jeśli pójdziesz dalej w programowanie, to zrozumiesz, że zamiast zmiennych globalnym można używać dużo lepszych rozwiązań - wszystko zależy od tego jak dobrze potrafisz zaprojektować kod. Zacznij korzystać z różnych wzorców projektowych.

Oczywiście nie jest tak, że nie wolno używać zmiennych globalnych. Można ale trzeba dokładnie wiedzieć jak program zadziała. Tak np. jest zaprogramowane std::cout, std::cin, std::cerr, std::clog itd.

W każdym razie, póki nie musisz ich używać to kategorycznie powinieneś się ich wystrzegać - spowodujesz sobie nimi bardzo wiele problemów. Nie tylko sobie ale też ludziom, którzy będą Ci pomagali w ich rozwiązywaniu.

komentarz 5 sierpnia 2017 przez Jakub 0 Pasjonat (23,120 p.)
Dzięki za odpowiedz, chociaż czasami gdzie zmienne są rozsiane  po wszystkich funkcjach  jest mi się nawet ciężej połapać niż np jest konkretne miejsce w kodzie w którym są zmienne (oczywiście nie w każdym wypadku bo logiczne ze np char wczytujący dane do switcha powinien być lokalny by to miało jaki sens)
1
komentarz 5 sierpnia 2017 przez PoetaKodu Stary wyjadacz (10,990 p.)
Nie używaj zmiennych globalnych w ogóle. Tak powinieneś myśleć. Dopiero w pewnym momencie zdasz sobie sprawę, że jesteś w stanie zdecydować gdzie ich użyć a gdzie nie, na razie one Ci nie potrzebne i zdecydowanie lepiej dla Ciebie będzie uczenie się poprawnego przekazywania zmiennych do argumentów funkcji niż korzystania ze zmiennych globalnych. Jak przejdziesz do programowania obiektowego to jeszcze lepiej to wszystko zrozumiesz.
komentarz 5 sierpnia 2017 przez Jakub 0 Pasjonat (23,120 p.)
Dzięki za pomoc :)
+2 głosów
odpowiedź 5 sierpnia 2017 przez jpacanowski VIP (101,940 p.)

do którego każda metoda ma dostęp i może go zmieniać

Właśnie sobie odpowiedziałeś na pytanie ;) Gdzieś coś w kodzie poprawisz, albo zmienisz i reszta kodu może się wywalić, albo działać niestabilnie. Kod powinien być modularny, czyli każdy fragment kodu niezależny od siebie. Taka hermetyzacja danych. Między funkcje przekazujesz różne dane. Ale to nie tak, że zmienne globalne są złe, tylko trzeba wiedzieć jak je używać. Bo zmienne/stałe globalne takie jak np. CANVAS_WIDTH, czy ilość_żyć jest ok.

https://forum.pasja-informatyki.pl/75694/zmienne-globalne-za-i-przeciw

komentarz 5 sierpnia 2017 przez Jakub 0 Pasjonat (23,120 p.)
Ale np raczej nie ma nic złego kiedy używam zmiennych globalnych w małych projektach ? Problem jest właśnie taki ze oglądam kursy P.Zelenta i tam jest ponąć wiele starych praktyk . Dlatego nie wiem gdzie mogę poznawać po tym kursie programowanie na najnowszych standardach c++ . Czy książka c++ szkoła programowania będzie ok??
1
komentarz 5 sierpnia 2017 przez PoetaKodu Stary wyjadacz (10,990 p.)

Nie ucz się z kursów Pana Zelenta jeśli chcesz się naprawdę nauczyć programować bo tylko uczysz się niepoprawnych rozwiązań. Zamiast tego masz

  • www.cpp0x.pl
  • www.xion.org.pl -> Produkcje -> Megatutorial (to jeszcze pre-c++11 ale przynajmniej uczy bardzo dobrych schematów programowania)
  • http://www.learncpp.com/

Każde z tych będzie o wiele lepszym wyjściem. Pan Zelent chyba nie zdaje sobie sprawy z szkodliwości uczenia ludzi tak bardzo niepoprawnych i archaicznych rzeczy.

komentarz 5 sierpnia 2017 przez Jakub 0 Pasjonat (23,120 p.)
Chyba pomyśle nad zaczęciem tej książki i zeczywiscie serwisem cpp0x... Chociaż to będzie mój trzeci raz od kąd zacznę się uczyć C++ od nowa a już myślałem o grach i aplikacjach okienkowych :( . Problem jest jeszcze taki iż nie jestem zbyt zdolnym człowiekiem i skoro często cieżko mi zrozumie kurs P.Miroslawa to czy mam szanse na zrozumienie kodów z tej strony oraz z książki ?
1
komentarz 5 sierpnia 2017 przez PoetaKodu Stary wyjadacz (10,990 p.)
Tym bardziej to dasz rade zrozumieć, musisz uważnie po prostu to czytac. Jak czegoś nie będziesz rozumiał to jest tam forum - pomogą Ci, w tym ja, bo też tam czasem przebywam.
komentarz 5 sierpnia 2017 przez Jakub 0 Pasjonat (23,120 p.)
Dzięki wielkie z pomoc i rady
komentarz 5 sierpnia 2017 przez jpacanowski VIP (101,940 p.)

a już myślałem o grach i aplikacjach okienkowych :(

Raz dwa i będziesz się jeszcze tu chwalił swoimi projektami ;)

Problem jest jeszcze taki iż nie jestem zbyt zdolnym człowiekiem

Nie ma niezdolnych osób ;) Oglądaj raz, dwa, trzy razy aż zrozumiesz. Na początku ciężko zmusić mózg do algorytmiczego myślenia.

Podobne pytania

0 głosów
3 odpowiedzi 335 wizyt
pytanie zadane 30 marca 2016 w C i C++ przez TheFeniks Gaduła (4,710 p.)
0 głosów
0 odpowiedzi 603 wizyt
pytanie zadane 17 kwietnia 2019 w C# przez WojMen Początkujący (330 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...