Upotreba return u funkcijama - programerski stilovi
Davno kad sam na faxu imao Osnove programiranja insistiralo se da u funkciji sme da bude samo jedan return, na kraju funkcije. Medjutim sad dok sam pisao neki kod shvatio sam da ja to uopste vise ne postujem i da mi je mnogo pregledniji kod kad sve returne uradim sto pre (manje identacije, manje {} blokova)
Odnosno cini mi se da je to pravilo potpuna besmilica u modernim editorima koji imaju highlight search rezultata, pa je lako videti sve izlazne tacke iz funkcije, zapravo mnogo lakse nego traziti gde ce skociti neki break; Znaci pricam o: PHP kôd:
PHP kôd:
Ovo je php (ili javascript) u primeru, ali pitanje se odnosi na sve jezike... |
То су више правила из Фортранских дана када си могао да имаш не само више излаза из функције (и то на различита места!) већ и разне улазе.
|
Preporučujem ti da pročitaš "Code Complete" knjigu ako već nisi. Tamo možeš naći slične nedoumice i mnogo pravih korisnih saveta :)
U ovakvom primeru meni je svakako bolji prvi način i ja ga skoro uvek koristim, ali postoje nekada situacije kada koristim i drugi, pa ću dati primere... Problem kod drugog primera je što se vrlo lako da desiti da odeš u duboko ugnježdavanje, a ovakav stil kao u prvom primeru baš to sprečava. Nepotrebno je praviti taj drugi else blok u kome će biti iskodirana cela procedura, jer uglavnom unutar tog else bloka će stajati još neki if i za čas ti ode početak linije na sredinu monitora. Generalno, što imaš manje ugnježdenih blokova, to je kod čitljiviji. Mislim da je Ričard Stalman rekao da je dobar kod onaj koji nema više od 3 ugnježdena bloka. Međutim, drugi stil bih koristio kada zaista trebam neke realne podatke stavim u tu promenjivu $status. Tvoj primer je dosta jednostavan, ali recimo, ovo je sada izmišljeni primer kada je potrebno pratiti takav stil: PHP kôd:
|
^ +1
kao da sam ja pisao, ali bolje objasnjeno :) |
Ja se ne slažem za ugnježdavanje. Ta pravila su možda važila u vreme 14-inčnih monitora i u vreme kada se štedela memorija. Danas, kad skoro svi imaju 22-inča ili veće sa HD rezolucijom stvarno ne vidim problem da imam normalan if - else sa vitičastim zagradama i kada imam samo jednu liniju koda. Preglednije je i lako mogu da ispišem neki tekst za debug ili da dodam još jednu linju koda u blok po potrebi.
|
Kôd:
if($a == 'nesto') Kôd:
if ($a=='nesto') return false; |
ok, nije to sto sam izostavio par zagrada oko if bila poenta, neko voli da ih pise, neko ne... pricao sam o zahtevu da se koristi samo jedan return, radi preglednosti koda...
Zapravo, cela stvar mi je pala na pamet jer sam nedavno procitao na minecraft blogu text u kome autor pominje kako su mu na nekom intervjuu zamerili sto nije "skolovani programer", pa zato ne vodi dovoljno racuna o konvencijama i best-practices savetima (koje bi valjda naucio na faxu da nije samouk)... malo mi je to zazvucalo kao bull****, koliko god njihovi fakulteti bili bolji od nasih, jer ono sto su mene ucili na faxu pre 15 godina, a skolovao sam se za programera, nije bas toliko krucijalno, a mnogo toga mislim da nije ni tacno, bar ne vise (kao recimo ovo za jedan return) |
Citat:
Trudim se da odmah return-ujem ako to pojednostavljuje ostatak koda. Inače bi imao dodatna ugnježivanja ili administraciju result varijabli. To znači da mogu da mi se dese i jedan i drugi slučaj u istoj funkciji, ali ne mislim da je to loše. Ne jednom sam koristio goto iz istog razloga... od nedavno stavljam komentar // kacam rasan :) Osim naravno u situacijama kada je očigledno o čemu se radi (npr. @salebab-ov primer). Ja bih ga napisao ovako, prvo proveravam fail situacije i tako ih mentalno "brišem" i manje gledam gore-dole i uparujem zagrade :) PHP kôd:
|
Slazem se sa @dinosaurus, mislim da je to zastareo coding standard...
U svakom slucaju @degojs - mrzim kad neko tako napise if() uslov. Po nekom mom standardu pisem ga ovako UVEK ovako HTML kôd:
if($a == 'nesto'){ |
^ i ja to radim, ali više praktična stvar: možeš da staviš breakpoint na return :)
|
Ja UVEK stavljam zagrade u if. Jednostavno, mnogo je manja šansa da u brzini napraviš grešku ovog tipa:
Kôd:
if( $a == 'nesto' ) |
Citat:
Off Topic: U VS-u može da se stavi breakpoint na nivou karaktera, pojedinačnih bitova unutar karaktera, pa i na elektron koji menja stanje u poluprovodniku. :D |
1 Prilog(a)
Citat:
Off Topic: Da znaš da može na nivou nekih karaktera, evo recimo stalo je na "/" :P |
Off Topic: Pored toga breakpoint može da bude i uslovni, a postoji i import/export... Debugger-improvements |
Citat:
Verovatno zato i mnogi ozbiljni fw imaju neki coding guides (kako pisati uslove, imenovati promenjive ...)bilo da su Javascript, PHP, Ruby, kako bi naveli timove da pisu kod koji svako moze da cita, a ne da svako pise kako mu je volja. Ja u PHP-u cesto(zavisi od nekih faktora) definisem defaultne vrednosti promenjive, bilo da je niz ili int (mada opet radim i kao sto je gornji deo koda - tesko je izolovati i generalizovati, a nekada opet kada ima mnogo uslova imam i vise returna). Tako da bi ovo napisao verovatno i ovako: PHP kôd:
Mozda je to nekom manje citljivo, mozda vise, ali tim u kome radim je navikao da radi sa ovakvim nekim stilom pisanja. |
^jos samo da si dao ime funkcije: jsonGetUser() - i to je taj prepoznatljiv stil koji mnogi koriste :)
|
^ ja sam oduvek pisao funkcije sa donjom crtom ime_funkcije()
meni citljivije, a i blize jeziku u kojem pisem stalno (vecina native PHP funkcija ima taj stil ) i sad ne razumem zasto se fura taj CamelCase ili pak camelCase stil ... recimo: dugacko_ime_neke_funkcije () neToliKoDugackoIme() oba se citaju, ali prvo skaniram brze |
tasmaniski, možda, da je u pitanju metoda, ovde je u pitanju funkcija :P
_korso_, zanimljiva ideja sa default vrednostima, ali ja bih je izbegavao, deluje mi kao da dolazi do usporenja aplikacije kada 2x dodeljuješ vrednost, prvo default, pa ih onda prepisuješ, samo da bi se izbegao jedan else... |
Citat:
A i na danasnjem hw ne bih rekao da je ovo neki performance issue, pogotovo sto je verovatno zahtevnija operacija petlja/uslov nego dodeljivanje vrednosti. Na stranu koliko sam se bugova nagledao zato sto promenljiva nije inicijalizovana, a uslov nije prosao pa dobijamo Undefined variable... |
Citat:
Тај аргумент сам чуо сто пута али ми никако не иде у главу: идентација у твом случају просто "вришти" да нешто није у реду - осим ако си предуго програмирао у Python-у :) |
Kad ovako gledaš izdvojeno parče koda, i još pričamo na tu temu, jasno je da je greška. Ali kad se tako nešto nađe u nekom većem ugnježdavanju if-ova, nije teško da se previdi. Pošto sam od početka navikao da pišem sa zagradama, nisam lično imao problema, ali sam naleteo par puta na takvu situaciju kad sam (mlađim) kolegama pomagao da nađu bag.
A Python ne spominji, odmah sam se setio problema sa ifovima kad je jedna linija uvučena tabom a druga spejsevima i na ekranu izgledaju isto. Brrr... prođu mi trnci kad se setim toga. |
1 Prilog(a)
Off Topic: Citat:
|
Citat:
[Edit]Eто, нисам стигао ни да откуцам поруку а он се већ јавио :) [/edit] |
ovo sto je jablan rekao + pylint + expand na unixu + ...
Samo je malo teze da se upucas u nogu sa pajtonom, ali ako bas navalis... |
Citat:
Kôd:
if ( $a == 'nesto' ) return FALSE; |
Citat:
... .............. ... ............ ............ ........................... ............... Pa gde mi je onaj sto jede te tackice????!!!!! P.S. Rekoh ja, samo ako fontovi mogu da se promene, IDE i po :) |
Kad god pomislim da ne moram da stavim zagradu na if blok, setim se ovoga:
Kôd:
if (...) |
^Fazon je da primer koji sam naveo ima samo jednu kratku komandu iza if-a i to return koji izlazi iz funkcije.
I to je to. Ne vidim mnogo potrebe za: Kôd:
if (x==1) { Kôd:
if (x==1) return false; |
Što reče Korso, svako ima neki svoj stil.
Mene recimo mnogo više nerviraju ugneždavanja pa se u pisanju držim negativne logike: proveravam negativne uslove i odmah izlazim iz funkcije ako ih detektujem. Na ovaj način sam uštedeo dva ugneždenja u odnosu na originalnu funkciju. PHP kôd:
|
Citat:
|
Meni smeta, posebno sto ja uglavnom kucam npr. ovako:
a = b * ( c - 1 ) / foo( a, "Hello world" ); I onda kad mi ubaci tackicu za svaki space.. pa jos i strelice.. vasar pravi, ide mi na zivce :) |
^ Ne mora da ti ubacuje tačkicu za svaki spejs (ne znam za VS, sad pričam za vim), meni konkretno stavlja tačkice samo za trailing spejsove, i malo drugačije farba tabove od spejsova. Ne znam zašto sve što ja napišem shvataš uvredljivo.
|
Ne znam da li moze u VS samo za trailing, ali i da moze, ne treba mi, jednostvno.
P.S. Pa nije to ni bilo uvredljivo shvaceno, cak sam pokusao da duhovito odgovorim (pacman). |
@degojs: Perl za to ima specijalnu sintaxu:
Kôd:
print 42 if($nesto); EDIT: Ovo se odnosilo na poruku na prethodnoj strani, rasprava se odvija prebrzo za mene :) |
A koristite li ternarni operator, u jezicima koji ga podržavaju?
a = ( c == 3 ) ? "YES" : "NO"; Ako vidim da if/else mogu da svedem na taj oblik uvek ga i primenim, ali vidim da ga ne vole svi ljudi - možda im nije čitljivo? |
Jel ovo neki kviz? :)
@Gruja: Ja koristim, ali ga ne volim, nije mi to čisto. Ali je efikasno. @ivanhoe: Ruby je to pozajmio od perla (pored if ima i unless, kako bi se izbegle !(ovo && !ono) konstrukcije), ume da bude zgodno (a po meni je i čitljivo) i to često baš za fazone tipa: Kôd:
return unless user.is_admin? |
Meni je u perlu upotreba unless() umesto if(!) bila uvek malo konfuzna. Za razliku od if not, kod unless sam uvek morao da zastanem za milisekundu da razmislim sta znaci uslov... doduse super je za ovu drugu sintaxu:
Kôd:
return FALSE unless $ok; |
Citat:
Kôd:
val a = if c=3 then "Yes" else "No" |
Vreme je GMT +2. Trenutno vreme je 02:49. |
Powered by vBulletin® Verzija 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright © DevProTalk. All Rights Reserved.