DevProTalk

DevProTalk (http://www.devprotalk.com/index.php)
-   Programiranje (http://www.devprotalk.com/forumdisplay.php?f=23)
-   -   Upotreba return u funkcijama - programerski stilovi (http://www.devprotalk.com/showthread.php?t=10705)

ivanhoe 18. 01. 2012. 22:01

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:

function bla() {

    if(
$a == 'nesto')
        return 
FALSE
    
    
do_something();

    return 
TRUE;


vs. "skolskog" pristupa:

PHP kôd:

function bla() {

    if(
$a != 'nesto') {
        
do_something();
        
$status TRUE;

    } else {
        
$status FALSE;
    }

    return 
$status;


Sta je po vama pravilniji i citljiviji kod? Kako vi pisete?

Ovo je php (ili javascript) u primeru, ali pitanje se odnosi na sve jezike...

Dragi Tata 18. 01. 2012. 22:42

То су више правила из Фортранских дана када си могао да имаш не само више излаза из функције (и то на различита места!) већ и разне улазе.

salebab 18. 01. 2012. 23:15

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:

function json_get_user() {
  if(!empty(
$_POST['user_id'])) {
    
$user UserFactory::getById($_POST['user_id']);
    if(!empty(
$user)) {
       
$result['data'] = $user;
       
$result['status'] = 'ok';
    } else {
       
$result['status'] = 'fail';
       
$result['msg'] = 'User not exists';
    }
  } else {
    
$result['status'] = 'fail';
    
$result['msg'] = 'There is no user id';
  }

  return 
json_decode($result);



robi-bobi 19. 01. 2012. 00:38

^ +1
kao da sam ja pisao, ali bolje objasnjeno :)

BluesRocker 19. 01. 2012. 02:00

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.

degojs 19. 01. 2012. 06:42

Kôd:

if($a == 'nesto')
        return FALSE;

Ja to stavim u jednu liniju:

Kôd:

if ($a=='nesto') return false;

ivanhoe 19. 01. 2012. 07:30

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)

srdjan 19. 01. 2012. 10:12

Citat:

Originalno napisao ivanhoe (Napišite 104486)
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...

Meni je čitljivost uvek pre nečije akademske definicije "lepote" koda.

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:

function json_get_user() {
  if(empty(
$_POST['user_id'])) {
    
$result['status'] = 'fail';
    
$result['msg'] = 'There is no user id';
  }
  else {
    
$user UserFactory::getById($_POST['user_id']);
    if(empty(
$user)) {
       
$result['status'] = 'fail';
       
$result['msg'] = 'User not exists';
    } else {
       
$result['data'] = $user;
       
$result['status'] = 'ok';
    }
  }

  return 
json_decode($result);



tasmaniski 19. 01. 2012. 10:13

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'){
    return FALSE;
}

e sad to moze biti samo moje misljenje, ali koliko znam dosta standarda zabranjuje takvo pisanje if uslova... (pricam o C orijentisanim jezicima)

srdjan 19. 01. 2012. 10:21

^ i ja to radim, ali više praktična stvar: možeš da staviš breakpoint na return :)

Gruja 19. 01. 2012. 10:51

Ja UVEK stavljam zagrade u if. Jednostavno, mnogo je manja šansa da u brzini napraviš grešku ovog tipa:

Kôd:

if( $a == 'nesto' )
    print(a);
    return FALSE;  // Ovo nije više deo if


jablan 19. 01. 2012. 10:52

Citat:

Originalno napisao srdjan (Napišite 104489)
^ i ja to radim, ali više praktična stvar: možeš da staviš breakpoint na return :)

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

srdjan 19. 01. 2012. 11:44

1 Prilog(a)
Citat:

Originalno napisao jablan (Napišite 104493)
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

Off Topic:
Da znaš da može na nivou nekih karaktera, evo recimo stalo je na "/" :P

BraMom 19. 01. 2012. 12:37

Off Topic:
Pored toga breakpoint može da bude i uslovni, a postoji i import/export...
Debugger-improvements

_korso_ 19. 01. 2012. 13:22

Citat:

Originalno napisao srdjan (Napišite 104487)
PHP kôd:

function json_get_user() {
    
$user UserFactory::getById($_POST['user_id']);
    if(empty(
$user)) {
       
$result['status'] = 'fail';
       
$result['msg'] = 'User not exists';
    } else {
       
$result['data'] = $user;
       
$result['status'] = 'ok';
    }



Svako ima svoje navike i svoje tumacenje sta je citljivo sta ne.
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:

function json_get_user() {
    
$user UserFactory::getById($_POST['user_id']);
    
$result = array('status' => 'fail''data' => 'User not exists');

    if(!empty(
$user)) {
       
$result['data'] = $user;
       
$result['status'] = 'ok';
    }


Eliminisem jedan else, vidim gde je definisana promenjiva i ako ne prodje uslov imace *uvek* ove izdvojene vrednosti.
Mozda je to nekom manje citljivo, mozda vise, ali tim u kome radim je navikao da radi sa ovakvim nekim stilom pisanja.

tasmaniski 19. 01. 2012. 14:08

^jos samo da si dao ime funkcije: jsonGetUser() - i to je taj prepoznatljiv stil koji mnogi koriste :)

robi-bobi 19. 01. 2012. 14:31

^ 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

salebab 19. 01. 2012. 14:35

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...

_korso_ 19. 01. 2012. 15:10

Citat:

Originalno napisao salebab (Napišite 104507)
_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...

Hm... Sve zavisi i od situacije kao sto rekoh gore kada se to koristi ili neke varijacije na temu. Isuvise je situacija da bi mogao da generalizujem. Inace kao performance freak veoma drzim to takvih stvari.
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...

Dragi Tata 19. 01. 2012. 15:15

Citat:

Originalno napisao Gruja (Napišite 104491)
Ja UVEK stavljam zagrade u if. Jednostavno, mnogo je manja šansa da u brzini napraviš grešku ovog tipa:

Kôd:

if( $a == 'nesto' )
    print(a);
    return FALSE;  // Ovo nije više deo if



Тај аргумент сам чуо сто пута али ми никако не иде у главу: идентација у твом случају просто "вришти" да нешто није у реду - осим ако си предуго програмирао у Python-у :)

Gruja 19. 01. 2012. 15:34

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.

jablan 19. 01. 2012. 15:46

1 Prilog(a)
Off Topic:
Citat:

Originalno napisao Gruja (Napišite 104512)
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.

http://vim.wikia.com/wiki/Highlight_...tchars_options



Dragi Tata 19. 01. 2012. 15:47

Citat:

Originalno napisao Gruja (Napišite 104512)
A Python ne spominji

Е сад ћу лепо да наручим кокице и да чекам да се јави Јаблан :D

[Edit]Eто, нисам стигао ни да откуцам поруку а он се већ јавио :) [/edit]

djipko 19. 01. 2012. 16:33

ovo sto je jablan rekao + pylint + expand na unixu + ...

Samo je malo teze da se upucas u nogu sa pajtonom, ali ako bas navalis...

degojs 19. 01. 2012. 16:36

Citat:

Originalno napisao Gruja (Napišite 104491)
Ja UVEK stavljam zagrade u if. Jednostavno, mnogo je manja šansa da u brzini napraviš grešku ovog tipa:

Kôd:

if( $a == 'nesto' )
    print(a);
    return FALSE;  // Ovo nije više deo if


Da, ali to je razlicito od:

Kôd:

if ( $a == 'nesto' ) return FALSE;

print(a);

Ne bi trebalo da imas problem.. Ne secam se da mi se ikad desila greska koju si opisao, a stoji da moze da se desi.

degojs 19. 01. 2012. 16:39

Citat:

Originalno napisao jablan (Napišite 104514)

Sjajno kad ima 2 linije koda, inace kad ustanes od kompjutera i krenes kuci, a ono pred ocima:

...
..............
...
............
............
...........................
...............

Pa gde mi je onaj sto jede te tackice????!!!!!


P.S.
Rekoh ja, samo ako fontovi mogu da se promene, IDE i po :)

japan 19. 01. 2012. 16:45

Kad god pomislim da ne moram da stavim zagradu na if blok, setim se ovoga:
Kôd:

if (...)
  if (...)
      print a;
else
  print b;

:)

degojs 19. 01. 2012. 16:58

^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) {
  return false;
}
print(x);

umesto
Kôd:

if (x==1) return false;

print(x);


Miroslav Ćurčić 19. 01. 2012. 17:12

Š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:

function json_get_user() {
  if (empty(
$_POST['user_id'])) {
    return 
json_decode(array(
       
'status' => 'fail',
       
'msg' => 'There is no user id',
    ));
  }
  
$user UserFactory::getById($_POST['user_id']);
  if (empty(
$user)) {
    return 
json_decode(array(
        
'status' => 'fail',
        
'msg' => 'User not exists',
    ));  
  }
  return 
json_decode(array(
    
'data' => $user,
    
'status' => 'ok',
  ));



Dragi Tata 19. 01. 2012. 18:16

Citat:

Originalno napisao degojs (Napišite 104518)
Sjajno kad ima 2 linije koda, inace kad ustanes od kompjutera i krenes kuci, a ono pred ocima:

...
..............
...
............
............

Ја ту опцију користим и на VS. Не волим "невидљиве" кодове.

degojs 19. 01. 2012. 18:57

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 :)

jablan 19. 01. 2012. 19:01

^ 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.

degojs 19. 01. 2012. 19:03

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).

ivanhoe 19. 01. 2012. 19:54

@degojs: Perl za to ima specijalnu sintaxu:
Kôd:

print 42 if($nesto);
koja je meni jako zgodna, jednom kad naviknes mozak...

EDIT: Ovo se odnosilo na poruku na prethodnoj strani, rasprava se odvija prebrzo za mene :)

Gruja 19. 01. 2012. 20:54

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?

jablan 19. 01. 2012. 21:24

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?

ivanhoe 19. 01. 2012. 22:16

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;
Ovako mi je mnogo jasnije, jer je nekako u skladu sa engleskom gramatikom da unless bude iza akcije, a ne ispred (I'm weird I know...)

Dragi Tata 19. 01. 2012. 22:33

Citat:

Originalno napisao Gruja (Napišite 104538)
A koristite li ternarni operator, u jezicima koji ga podržavaju?

a = ( c == 3 ) ? "YES" : "NO";

Користим, мада више волим језике (ML) у којима је if израз па онда лепо урадиш нешто као:

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.

Mišljenja, saveti, izjave, ponude ili druge informacije ili sadržaji nastali na Sajtu su vlasništvo onoga ko ih je kreirao, a ne DevProTalk.com, tako da ne morate da se oslanjate na njih.
Autori poruka su jedini odgovorni za ovakve sadržaje. DevProTalk.com ne garantuje tačnost, kompletnost ili upotrebnu vrednost informacija, stavova, saveta ili datih izjava. Ne postoje uslovi pod kojima bi mi bili odgovorni za štetu ili gubitak koji je posledica bilo čijeg oslanjanja na nepouzdane informacije, ili bilo kakve informacije nastale kroz komunikaciju između registrovanih članova.
Web sajt može sadržavati linkove na druge web sajtove na Internetu ili neke druge sadržaje. Ne kontrolišemo niti podržavamo te druge web sajtove, niti smo pregledali bilo kakve sadržaje na takvim sajtovima. Mi nećemo biti odgovorni za legalnost, tačnost ili prikladnost bilo kog sadržaja, oglasa, proizvoda, usluga ili informacije lociranim na ili distribuiranih kroz druge web sajtove, niti za bilo kakvu štetu nastalu kao posledica takvih informacija. DevProTalk.com drži i čuva druga prava vlasništva na web sajtu. Web sajt sadrže materijale zaštićene copyright-om, zaštitne znakove i druge informacije o pravu vlasništva ili softver. Članovi mogu poslatu informacije zaštićene pravima vlasništva njihovih nosilaca i ona ostaju zaštićena bez obzira da li su oni koji prenose te informacije to naveli ili ne. Osim informacija koje su u javnom vlasništvu ili za koje dobijete dozvolu, nemate pravo da kopirate, modifikujete ili na bilo koji način menjate, objavljujete, prenosite, distribuirate, izvršavate, prikazujete ili prodajte bilo koju informaciju zaštićenu pravima vlasništva. Slanjem informacija ili sadržaja na bilo koji deo DevProTalk.com, Vi automatski dozvoljavate i predstavljate garanciju da imate pravo da dozvolite DevProTalk.com ili članovima DevProTalk.com bespovratnu, kontinualnu, neograničenu, globalnu dozvolu da koriste, kopiraju, izvršavaju, prikazuju i distribuiraju takve informacije i sadržaje i da iz takvih sadžaja koriste bilo koji deo u bilo koje svrhe, kao i pravo i dozvolu da koriste gore navedene sadržaje. Svi zaštitni znakovi (trademarks), logotipi, oznake usluga, firme ili imena proizvoda koji se pominju na ovom web sajtu su vlasništvo kojim raspolažu njihovi vlasnici.