<div dir="auto">Globalele sunt o problemă în proiectele mari pentru că este mai dificil să vezi ce cod le folosește. Și pentru majoritatea situațiilor la care mă gândesc (INCLUSIV cea din tema asta) mă gândesc că o variabilă globală limitată (sau statică per clasă) este suficient -- elimină problema efectelor secundare fără a îngreuna utilizarea codului în sine. Mai ales că suntem single threaded și nu e nevoie nici măcar de sincronizare, în situația de față variabilele globale (cu static) sunt chiar ok. Recomand 'static' acolo pentru ca alte module să nu modifice imprevizibil variabila.<div dir="auto"><br></div><div dir="auto">Un global global fără nicio restricție e ok în proiecte până în 1000-2000 de linii după părerea mea (sau proiecte mai mari dacă e mult boilerplate; ideea e ca întregul cod să încapă în mintea unei singure persoane) dar în acelea care sunt mai mari, sau vor deveni pe viitor mai mari, pot deveni o problemă dacă le folosești fără un motiv bun. Zic că complică procesul de debug pentru că există posibilitatea să existe multe accese la aceeași variabilă globală. Soluția cu 'static' rezolvă chestia asta în cele mai multe situații -- rareori e o restricție reală.</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Apr 15, 2019, 12:36 PM Mihai Barbulescu via so <<a href="mailto:so@cursuri.cs.pub.ro">so@cursuri.cs.pub.ro</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Salutare tuturor,<br>
<br>
In completarea maestrului RD eu unul chiar incurajez in situatii<br>
extreme/in situatii in care nu se pot evita atat folosirea goto cat si<br>
folosirea variabilelor globale.<br>
<br>
Exemple de folosire a variabilelor globale pe langa cel de care tocmai<br>
v-ati lovit (si este OK si __IN REGULA__ sa folositi globala) ar fi sa<br>
aveti un state machine asupra caruia umbla mai multe threaduri (sau<br>
nu) - de ex pt a stii starea curenta (daca ai threaduri faci accesul<br>
"sincronizat").<br>
<br>
Un exemplu de folosire goto aveti chiar pe wiki pentru eliberarea<br>
resurselor [1]. Acest approach e foarte important in lucrul cu<br>
dispozitive embedded pentru ca puteti lasa intregi resurse hardware<br>
marcate ca "ocupate" aiurea<br>
<br>
Paul Olaru: as vrea si o justificare pentru afirmatia "E bine să nu ai<br>
mai multe globale decât este necesar (complică mult procesul de<br>
debug)." - ce inseamna ca procesul de debug e complicat? Debuggerul<br>
stie sa arate si variabilele globale, de-aia fiecare proces are acea<br>
zona de memorie pt globale (.data si .bss) si poti debuga continutul<br>
lor prin breakpoint si inspectand acele zone de memorie ca sa fii<br>
sigur. E complicat procesul de debug ca trebuie sa te uiti in "inca o<br>
zona de memorie"? Raspunsul meu e NU, asta vine doar din<br>
lene/necunoastere.<br>
Stiu paper-ul la care te gandesti - ca sa nu ai side effects sau alte<br>
probleme de care zice acolo inseamna doar sa scrii codul cu ceva mai<br>
multa grija, lucru care oricum ar trebui sa va intre in reflex.<br>
<br>
Ah, da, la SD daca aveti de implementat lucrul pe o lista inlantuita<br>
si declarati o globala pt structura lista inlantuita ca sa scrieti<br>
functii cu cat mai putini parametrii sunteti noobs, de-aia va<br>
interzice la SD sa faceti asemenea abominatii. Dar este, asa cum a zis<br>
RD, o recomandare/guideline care admite exceptii.<br>
<br>
Sper c-am reusit sa demontez fake news-ul conform caruia globalele<br>
sunt diavolul pe pamant....Sunt o unealta asa cum e si tesla si<br>
trebuie sa ai grija sa nu iti dai cu ea in ... stiti voi continuarea.<br>
<br>
[1] <a href="https://ocw.cs.pub.ro/courses/so/laboratoare/resurse/die#alta_abordare" rel="noreferrer noreferrer" target="_blank">https://ocw.cs.pub.ro/courses/so/laboratoare/resurse/die#alta_abordare</a><br>
<br>
<br>
<br>
On Sun, 14 Apr 2019 at 22:59, Razvan Deaconescu via so<br>
<<a href="mailto:so@cursuri.cs.pub.ro" target="_blank" rel="noreferrer">so@cursuri.cs.pub.ro</a>> wrote:<br>
><br>
> "Alexandru-Ionuţ MÎNDRU (87849)" via so <<a href="mailto:so@cursuri.cs.pub.ro" target="_blank" rel="noreferrer">so@cursuri.cs.pub.ro</a>> writes:<br>
> > Eu cel puțin știu de la PC/SD din anul 1, nu mai știu exact care<br>
> > dintre cele 2. Era regula pentru teme să nu se folosească variabile<br>
> > globale, se scădea puncte pe treaba asta, fără a se explica de ce e<br>
> > greșit sau de ce să nu le folosim.<br>
><br>
> Well, there's your problem.<br>
><br>
> > Chiar și acum la tema 1 la PC spre exemplu, există această regulă.<br>
><br>
> O să discutăm cu cei de acolo.<br>
><br>
> > Cei drept acum nu am verificat strict pentru SO dacă există această<br>
> > regulă, dar am rămas cu acest lucru și presupun că și alții.<br>
><br>
> Există reguli și există recomandări. Regulile sunt foarte puține (citat<br>
> aproximativ Jack Sparrow). În dezvoltarea aplicațiilor sunt foarte<br>
> puține "golden rules". Luați recomandările, țineți-vă de ele, dar<br>
> admiteți când e o prostie să te ții de ele cu dinții doar pentru că "așa<br>
> e bine".<br>
><br>
> Exemple de recomandări, nu reguli, au excepții<br>
><br>
> * Nu folosiți variabile globale.<br>
><br>
> * Nu folosiți goto.<br>
><br>
> * Puneți funcțiile deasupra main-ului.<br>
><br>
> * Folosiți thread-uri, operații asincrone, expresii regulate, semnale.<br>
><br>
> * Faceți codul portabil.<br>
><br>
> Exemple de reguli sau lucruri care sunt mereu bune (nu știu să aibă<br>
> excepții în afara unor concursuri de genul "Obfuscated C contest").<br>
><br>
> * Să fie codul consecvent. Prost dar consecvent prost decât bine în n<br>
> feluri.<br>
><br>
> * Variabile și funcții denumite cu cap, nu tmp_var, do_stuff, my_var.<br>
><br>
> * Defensive programming: "Always code as if the guy who ends up<br>
> maintaining your code will be a violent psychopath who knows where you<br>
> live".<br>
><br>
> * Trecut codul prin verificatoare statice și dinamice.<br>
><br>
> * Făcut recenzie la cod.<br>
><br>
> Răzvan<br>
> _______________________________________________<br>
> <a href="http://ocw.cs.pub.ro/courses/so/info/lista-discutii" rel="noreferrer noreferrer" target="_blank">http://ocw.cs.pub.ro/courses/so/info/lista-discutii</a><br>
<br>
<br>
<br>
--<br>
Cu stimă,<br>
Mihai Bărbulescu<br>
_______________________________________________<br>
<a href="http://ocw.cs.pub.ro/courses/so/info/lista-discutii" rel="noreferrer noreferrer" target="_blank">http://ocw.cs.pub.ro/courses/so/info/lista-discutii</a></blockquote></div>