zdar mam jeden teoreticky dotaz. vela krat som cital ze je "nepekne" pouzivat globalne premenne v tele funkcie. rad by som vedel co na to nejaky skusenejsi vyvojary. pripadne teda vas nazor na tuto "programatorsku cnost"
Fórum › Offtopic
Dobra vychova programatora
jo, jde o víc věcí (ale zkušený vývojař nejsem):
1.) funkci, která má jen vstup a výstup a nepoužívá nic z vnějšku, můžeš snadno použít v jiném programu. stačí zkopírovat. co potřebuje z globálních ji předej parametrem a máš to.
2.) je to přehlednější. máš hlavní funkci a ta volá podprogramy. víš, co se kde s čím děje a snáz se debugguje.
3.) globální proměnné je dobré používat na udržování dat nutných v celém běhu, lokální pro potřeby právě běžící fce. takže globální upravovat jen jako výstup nějaké fce (návratová hodnota nebo parametr odkazem), číst jako parametr lokální proměnné.
ale z každého pravidla existuje vyjímka. pokud je to nesmyslné plýtvání pamětí, pracuj s globální proměnnou (nebo můžeš použít parametr odkazem).
1b) Například používáš rozsáhlou knihovnu, ve které máš nějaké globální proměnné. Rozhodneš se tuto knihovnu využít s jinou knihovnou, která taky používá globální proměnné, a naneštěstí stejně pojmenované...
mephi píše:- expertovi do zdrojakov vela ludi nechodi
Expertovy chodi do kodu viac ludi ako by si si myslel ;)
Globalne premenne vo funkciach? No zalezi od pouzitia. Napriklad v klasickom Cecku je bezne pouzivat globalnu premennu errno. Taktiez rozne file descriptory alebo v C++ cin cou cerr.. Lenze to su take tie ako to povedat, proste standardizovane premenne ktore maju svoje opodstatnenie. Niekedy s pohladu funkcnosti je treba nieco vysunut ako globalnu premennu. Tu je lebsie pouzivat Singletony(ak ide o OOP). Napriklad trieda reprezentujuca konfiguraciu aplikacie alebo logovane alebo nejaky language-dictionary. Tieto veci sa vecsinou mozu pouzivat kdekolvek v kode a predavat si ich argumentom by zase nebolo velmi pekne. To by potom snad kazda funkcia mala ako povinny parameter odkaz na tu triedu.
Vydel som vsak kod ktory pouzival hojne globalnych premennych aj tam kde nemusel. Toho cloveka co to napisal nakopat do zadku a nikdy ho nepustit ku klavesnici. Neskutocne zle sa ten kod lustil. Proste vsade tam boli nejake premenne a clovek ani za boha nevedel odkial sa tam tie data beru, kde sa presne plnia, kde sa dalej pouzivaju..
Moj nazor teda je: radsej sa tomu vyhnut!
To sn3d: zameslel som sa nad tym ked som otvaral viac adresarov. mal som dinamicke pole ukazatelov na dir_deskriptory (tzn **DIR) potreboval som to pole dostat do funkcie ktore ho podavala dalsej funkcii. pole mohlo dinamicky menit rozmer a teda aj polohu v pameti. tak mi nezostalo nic ine bud globalna premenna alebo viacnasobne volanie odkazom (v tomto pripade som mal teda ****DIR)
olgo píše:#
# To sn3d: zameslel som sa nad tym ked som otvaral viac adresarov. mal som dinamicke pole ukazatelov na dir_deskriptory (tzn **DIR) potreboval som to pole dostat do funkcie ktore ho podavala dalsej funkcii. pole mohlo dinamicky menit rozmer a teda aj polohu v pameti. tak mi nezostalo nic ine bud globalna premenna alebo viacnasobne volanie odkazom (v tomto pripade som mal teda ****DIR)
No myslim, ze resenim by byl treba spojovy seznam ne? Ten sice muze mit prvky ruzne rozhazene po pameti, ale prvni prvek zustava vzdy na stejne adrese, coz ti staci na predani reference. Zatimco pokud prealokujes cele pole, tak muze byt umisteno nekam jinam. Mozna jsem te spatne pochopil, neuvedl si jazyk o ktery jde, tak me ber kdyztak s rezervou.
To Tomcat: pochopils to dobre. ja ale pridavam a odoberam prvky iba z koniec pola (v podstate fifo) a bol by dost velky problem sa pokazde prekusavat az na konic zoznamu. okrem ineho kedze je to pole ukazatelov velkost by sa zdvojnasobila. takto mi staci jedent int na index posledneho prvku.
EDIT: je to ciste c
hmm ale ved mozes pouzit kruhovy obojstranny zoznam. Cize kazdy prvok pola bude odkazovat na ten pred nim a na ten za nim. S tym ze prvy bude ukazovat na posledny a naopak posledny na prvy.
Inac osobne. Este ked je **premenna (aj pri takychto pripadoch by som radsej uz pouzil typedef koli prehladnosti) tak je to v poriadku ale Hardcore typu ***premenna alebo ****premenna uz zavana zlym navrhom.Takemu by som sa tiez snazil vyhnut.
A ako som spominal. Ak potrebujes mat teda pristup k tomu polu dri descriptorov z aplikacie a ide o OOP jazyk tak si vytvor Singletonovu triedu.
olgo píše:#
# To Tomcat: pochopils to dobre. ja ale pridavam a odoberam prvky iba z koniec pola (v podstate fifo) a bol by dost velky problem sa pokazde prekusavat az na konic zoznamu. okrem ineho kedze je to pole ukazatelov velkost by sa zdvojnasobila. takto mi staci jedent int na index posledneho prvku.#
##
#EDIT: je to ciste c
No tak v tom pripade bych asi pouzil bud oboustranny seznam, jak rika kolega, coz te bude stat neco pameti, nebo bych to poresil nulovym prvek. Tzn. mit v tom spojaku jeden nulty prazdny prvek, ktery bych nemenil (aby zustavala reference) a za nej cpal jednosmerne prvky do FIFO. Je otazkou, zda to co do citelnosti nebude horsi, nez ta globalni promenna a v C bych skoro rekl, ze i jo. V C bych se jim osobne ani moc nebranil - ale v C sem toho vskutku moc nenapsal.
To sn3d: ono samotny problem implementacie je vyrieseni bavime sa tu len o "krase" kodu. dik za rady ale vsetci mame svoje postupy :). trosku som to upravil a vyzera to uz trochu k svetu. misim ze zostanem u globalnych premmenych
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Dobrá kniha o C/C++ — založil ospaly.stanislav
Je Dictionary dobrá volba? — založil JiriVavru
Dobra kniha k Cčku — založil fixa
Fakt dobra HRA — založil wollverin
Dobrá kniha o Assembleru — založil blop
Moderátoři diskuze