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

Czemu tego nie robic?

Object Storage Arubacloud
0 głosów
416 wizyt
pytanie zadane 20 kwietnia 2016 w C i C++ przez DragonCoder Nałogowiec (36,500 p.)
edycja 20 kwietnia 2016 przez DragonCoder
Witam. Kazdy z obecnych tu mowi zeby nie stosowac zmiennych globalnych tylko dawac je do int main () ale gdy patrze na odcinki Pana Miroslawa bynajmiej do 5 to widze same zmienne globalne. Czemu? I czemu lepiej jest je stosowac w int main ()?
1
komentarz 20 kwietnia 2016 przez Tomatosoup Pasjonat (18,530 p.)
Bynajmniej to nie przynajmniej !
1
komentarz 20 kwietnia 2016 przez event15 Szeryf (93,790 p.)
Bynajmniej nie zaprzeczam ;)

4 odpowiedzi

+3 głosów
odpowiedź 20 kwietnia 2016 przez event15 Szeryf (93,790 p.)
Wynika to z potrzeby enkapsulacji kodu. Najprostszy przykład: Jedziesz sobie samochodem z otwartym oknem i masz w ręku swoją ulubioną kanapkę. Nagle podjeżdża do Ciebie inny samochód, kierowca zabiera Ci ją właśnie wtedy, gdy chciałeś jej skosztować.

Ta paplanina nie bierze się znikąd. Już w latach 90' poprzedniego wieku było głośno o tym, żeby ukrywać informacje w modułach. Stosowanie globali powoduje to, że niesamowicie ciężko jest debugować kod w większej aplikacji, a jeszcze trudniej go testować. W przypadku globalnych zmiennych w językach obsługujących wątki, moga występować wszelakiego rodzaju problemy.

Jeśli chcesz więcej, to czytaj tu:

https://docs.google.com/document/d/1OsI99MQFlzIvAHNSaX_bk5skUoQRZnu2COmQ_wQstb8/edit?usp=sharing
komentarz 20 kwietnia 2016 przez event15 Szeryf (93,790 p.)
Warto powiedzieć, że Bertrand Meyer jako jeden z prekursorów dzisiejszego programowania obiektowego w swojej książce napisał kilkukrotnie, iż dobry język programowania nie powinien nawet posiadać zmiennych globalnych.

Jest wiele dowodów na to, że można bez nich sobie poradzić.
2
komentarz 20 kwietnia 2016 przez draghan VIP (106,230 p.)

Ostatnio ktoś tutaj miał problem już nawet z malutkim programikiem, gdzie jedną z przyczyn było użycie globala. :)

+1 głos
odpowiedź 20 kwietnia 2016 przez DragonCoder Nałogowiec (36,500 p.)
Ok. Dziekuje za odpowiedz. Czyli po prostu starac sie unikac globali jak ognia.
komentarz 20 kwietnia 2016 przez Patryk Krajewski Nałogowiec (26,170 p.)
Tak, zawsze możesz ich uniknąć.
0 głosów
odpowiedź 20 kwietnia 2016 przez niezalogowany
–4 głosów
odpowiedź 20 kwietnia 2016 przez KubenQPL Maniak (62,820 p.)
Zmiennych globalnych możesz używać, czasem nawet musisz gdy chcesz ich używać w innych funkcjach, ale kiedy używasz ich tylko w danej funkcji to lepiej dać je jako zmienne lokalne.
komentarz 20 kwietnia 2016 przez event15 Szeryf (93,790 p.)
o.O
komentarz 20 kwietnia 2016 przez niezalogowany
Rzadko(a prawie nigdy) nie ma potrzebu używania zmiennych globalnych.
2
komentarz 20 kwietnia 2016 przez draghan VIP (106,230 p.)
Nigdy. :) Zawsze można kod zorganizować tak, żeby globali nie było.
komentarz 20 kwietnia 2016 przez Patryk Krajewski Nałogowiec (26,170 p.)
Gdy musisz używać zmiennych w innych funkcjach to przesyłasz przez argument chyba, że zmienna i funkcja jest w klasie.
komentarz 20 kwietnia 2016 przez KubenQPL Maniak (62,820 p.)
Czyli w Androidzie nie zmiennych "kontrolek" też nie używać jako globali?
komentarz 20 kwietnia 2016 przez draghan VIP (106,230 p.)
Nie rozumiem pytania, aczkolwiek pewnie wynika to z faktu, że nie programowałem nic na Androida.

Powinieneś postarać się, żeby takich zmiennych nie było. Jeśli framework, który wykorzystujesz, od Ciebie tego wymaga... to może powinieneś poszukać lepszego? ;)
komentarz 20 kwietnia 2016 przez KubenQPL Maniak (62,820 p.)
Każdy element interfejsu którego chcemy użyć w kodzie musi być zadeklarowany(np Button gButtonVar;) i jeśli mam to jako zmienną globalną to łatwiej tego użyć np do zmiany tekstu po pobraniu danych z internetu.
I druga sprawa mnie zastanawia, czasem mamy jakąś zmienną która nie może się wczytywać za każdym razem od nowa, niech to będzie jakieś liczenie punktów w grze, no to oczywiście można zrobić tak żeby pobierać i ustawiać wartość tej zmiennej funkcjami (gettery i settery) ale to musi być wtedy jako zmienna globalna.
1
komentarz 20 kwietnia 2016 przez event15 Szeryf (93,790 p.)

i jeśli mam to jako zmienną globalną to łatwiej tego użyć np do zmiany tekstu po pobraniu danych z internetu.

Podejście programistów do problemu minimalizowania zakresu zmiennych zależy w dużej mierze od tego, jak rozumieją oni pojęcia "wygoda" i "opanowanie zależności". Niektórzy programiści stosują wiele zmiennych globalnych, ponieważ zapewnia to łatwy dostęp do ich wartości i pozwala uniknąć zabawy z listami parametrów i regułami dotyczącymi zakresu w klasach. Uważają oni, że wygoda dostępu do zmiennej w dowolnym momencie jest cenniejsza niż związane z tym ryzyko.

Inni dbają o to, aby jak najbardziej ograniczać zakres zmiennych, ponieważ lokalność zakresu sprzyja opanowaniu złożoności. Im więcej informacji pozostaje ukrytych, tym mniejszy wysiłek intelektualny przy pracy z poszczególnymi fragmentami kodu. Gdy programista może operować mniejszą ilością informacji, maleje prawdopodobieństwo powstania błędów wynikających z zapomnienia o tym czy innym szczególe.

Różnica między "filozofią wygody" a "filozofią złożoności" sprowadza się do różnicy między ułatwieniem pisania kodu a ułatwieniem jego czytania. Maksymalizacja zakresu faktycznie czyni łatwiejszym pisanie programu, ale program, w któym każda procedura może użyć w dowolnym momencie każdej zmiennej, dużo trudniej jest poznać niż ten zbudowany z dobrze zaprojektowanych i podzielnych procedur. Nie wystarcza wtedy zrozumienie działania jednej procedury - trzeba poznać wszystkie inne, które używają tych samych danych globalnych. Tak budowany kod jest więc mało przejrzysty, trudny w debugowaniu i bardzo podatny na błędy przy modyfikacjach.

Podsumowując, każda zmienna powinna być deklarowana w taki sposób, aby była widoczna w jak najmniejszej części kodu. Najlepszym rozwiązaniem jest ograniczenie zakresu zmiennej do pojedynczej pętli lub procedury. Jeżeli nie jest to możliwe, widoczność powinna zostać ograniczona do pojedynczej klasy. W przypadku gdy nie można zawęzić zakresu do klasy, której odpowiedzialność za zmienną jest największa, warto utworzyć procedury dostępowe, które pozwolą udostępniać dane zmiennej innym klasom. Podejście takie zapewni, że potrzeba użycia widocznych w całym programie zmiennych globalnych będzie pojawiać się bardzo rzadko.

 

komentarz 20 kwietnia 2016 przez event15 Szeryf (93,790 p.)

I druga sprawa mnie zastanawia, czasem mamy jakąś zmienną która nie może się wczytywać za każdym razem od nowa, niech to będzie jakieś liczenie punktów w grze, no to oczywiście można zrobić tak żeby pobierać i ustawiać wartość tej zmiennej funkcjami (gettery i settery) ale to musi być wtedy jako zmienna globalna.

W takim razie niestety, ale nie pisałeś jeszcze obiektowego kodu. Takie rzeczy rozwiązuje się nie stosując globalnych zasięgów zmiennych. Jeśli chodzi o publiczne metody to idealnym rozwiązaniem jest projektowanie interfejsów (w przypadku php) lub odpowiednich klas abstrakcyjnych (w przypadku innych języków), które jedynie informują klasy je używające o tym, że daną metodę należy użyć i zaimplementować. Dzięki tworzeniu podobnych adapterów oddziela się implementację dziedziny od zewnętrznych modułów, które wcale nie muszą nawet wiedzieć w jaki sposób dana klasa w środku się zachowuje. Wystarczy, że posiadają jej interfejs. 

komentarz 20 kwietnia 2016 przez Porcupine Nałogowiec (31,560 p.)
komentarz 47 minuty temu przez użytkownika KubenQPL Dyskutant (9,050 punkty)

Każdy element interfejsu którego chcemy użyć w kodzie musi być zadeklarowany(np Button gButtonVar;) i jeśli mam to jako zmienną globalną to łatwiej tego użyć np do zmiany tekstu po pobraniu danych z internetu.

Zmienna globalna w C++ to nie to samo co pole w klasie w Javie... 

Podobne pytania

+1 głos
4 odpowiedzi 301 wizyt
pytanie zadane 25 stycznia 2016 w Offtop przez niezalogowany
+1 głos
5 odpowiedzi 1,460 wizyt
0 głosów
2 odpowiedzi 185 wizyt
pytanie zadane 2 lipca 2016 w C# przez matilogias Obywatel (1,550 p.)

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...