Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Return dilema...

[es] :: .NET :: Return dilema...

[ Pregleda: 2445 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

negyxo
Aleksandar Perkuchin

Član broj: 29751
Poruke: 897
212.200.215.*



+171 Profil

icon Return dilema...29.02.2008. u 20:03 - pre 158 meseci
Ovako

Koliko je po vama ispravna sledeca konstrukcija metoda:

Code:

bool Method()
{
    bool rs = SomeOtherMethod();

   if (rs)
   {
       rs = SomeOtherMethod1();
   }

   if (rs)
   {
       rs = SomeOtherMethod2()
   }

   if (rs)
   {
       rs = SomeOtherMethod3()
   }

   ...
   
   return rs;
}


Mislim da je poenta jasna. Znaci ne koristiti uopste return sem na kraju.
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4882
*.dynamic.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+629 Profil

icon Re: Return dilema...29.02.2008. u 21:29 - pre 158 meseci
A što ne ugnezdiš treći u drugi, a drugi u prvi uslov (blok)?
Tada bi imao potencijalno par provera manje (i ne tako bitno), ali se jasnije oslikava semantika sistema (bitnije) ...

// kopirano iz tvog primera i preuredjeno
Code:

bool Method()
{
   bool rs = SomeOtherMethod();
   if (rs)
   {
       rs = SomeOtherMethod1();
       if (rs)
       {
           rs = SomeOtherMethod2()
           if (rs)
           {
               rs = SomeOtherMethod3()
           }
       }
   }
   ...
   return rs;
}

 
Odgovor na temu

01011011
Avanade
CHICAGO, USA

Član broj: 561
Poruke: 2341
65.216.70.*

ICQ: 45747235
Sajt: www.snailtrail.net


+2 Profil

icon Re: Return dilema...29.02.2008. u 21:47 - pre 158 meseci
X Files mislim da ovo tvoje nije dobro zato sto ukoliko je prva metoda (netacna) false, ostale se nikada nece imati sanse pokrenuti. Nije mi jasno sta je inace pitanje ovoga glavnog sto je postavio pitanje... Da li si mislio koja je razlika izmedju return 4 puta u raznim if blokovima ili 1 put? Ako je to pitanje onda ti je bolje da uradis sve sam manje teksta, znaci izbacis ako vise kroistis rs kao globalni var i onda ga koristis...
 
Odgovor na temu

negyxo
Aleksandar Perkuchin

Član broj: 29751
Poruke: 897
212.200.215.*



+171 Profil

icon Re: Return dilema...29.02.2008. u 22:12 - pre 158 meseci
Jasno i naravno logicno.
Ali evo jos jednom objasnjenja, da bude jasnije sta sam mislio, nisam hteo odmah da pisem pros & cons nego da sami izvucete zakljuck. No stvar je u sledecem:

Code:

bool Method()
{
    bool rs = SomeOtherMethod();

   if (rs)
   {
       rs = SomeOtherMethod1();
   }

   if (rs)
   {
       rs = SomeOtherMethod2()
   }

   if (rs)
   {
       rs = SomeOtherMethod3()
   }

   ...
   
   return rs;
}


One tri tacke ne pretstavljaju dalju operaciju, nego ponavljanje iste konstrukcije, znaci jos par poziva na isti kalup. Znaci:

Code:

bool Method()
{
    bool rs = SomeOtherMethod();

   if (rs)
   {
       rs = SomeOtherMethod1();
   }
   if (rs)
   {
       rs = SomeOtherMethod2()
   }
   if (rs)
   {
       rs = SomeOtherMethod3()
   }
   if (rs)
   {
       rs = SomeOtherMethod4()
   }
   if (rs)
   {
       rs = SomeOtherMethod5()
   } 
   if (rs)
   {
       rs = SomeOtherMethod6()
   }
  
   return rs;
}


Poenta je u tome koliko je dobro izbegavati return false, ili true, samo zato da bi se napisao jedan return na kraju i to uvek.

Znaci cisto primera radi, sledece bi moglo da se napise i ovako:

Code:

bool Method()

   if (!SomeOtherMethod()) 
   {
      return false;
   }

   if (!SomeOtherMethod1()) 
   {
      return false;
   }

   if (!SomeOtherMethod2()) 
   {
      return false;
   }

   if (!SomeOtherMethod3()) 
   {
      return false;
   }
   ...

   return true;
}


Ovo su dosta proste metode i mozda ne oslikavaju zeljene namere ali me interesuje koliko bi bili spremeni da ne pisete metode bez i jednog return-a sem na kraju?

Cisto da i dam moj odgovor, moje misljenje je da je to samo komplikovanje (mislim bez return-a) nego da je potrebno pisati metodu u skladu sa problemom a ne praviti univerzalni srafciger.

[Ovu poruku je menjao negyxo dana 29.02.2008. u 23:27 GMT+1]
 
Odgovor na temu

01011011
Avanade
CHICAGO, USA

Član broj: 561
Poruke: 2341
65.216.70.*

ICQ: 45747235
Sajt: www.snailtrail.net


+2 Profil

icon Re: Return dilema...29.02.2008. u 22:27 - pre 158 meseci
Pozdrav,

sve uz avisnosti sta zelis da postignes... ovo sto si ti dao kao primjer, ja to tako nikad ne bih uradio.

Code:
bool Method()
{
    bool rs = SomeOtherMethod();

   if (rs)
   {
       rs = SomeOtherMethod1();
   }
   if (rs)
   {
       rs = SomeOtherMethod2()
   }
   if (rs)
   {
       rs = SomeOtherMethod3()
   }
   if (rs)
   {
       rs = SomeOtherMethod4()
   }
   if (rs)
   {
       rs = SomeOtherMethod5()
   } 
   if (rs)
   {
       rs = SomeOtherMethod6()
   }
  
   return rs;
}


Suludo je imati ovako nesto u kodu... barem sto se mene tice jako neuredno
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12706



+4688 Profil

icon Re: Return dilema...01.03.2008. u 00:15 - pre 158 meseci
Mislim da to zavisi od situacije i da ne treba forsirati. Ako ti u konkretnoj situaciji vise odgovara da imas return samo na kraju onda uradis tako, ako ne, onda onako kako odgovara. U ovom prikazanom slucaju i slicnim bih se potrudio da ti metodi koji se pozivaju mogu da se pozivaju nekako iterativno.

Inace, kod iz prva dva posta moze da se napise komplet' bez { i }, osim prve i poslednje, naravno :)
 
Odgovor na temu

Predrag Glumac
Luxembourg

Član broj: 167588
Poruke: 127
*.eunet.yu.



Profil

icon Re: Return dilema...01.03.2008. u 00:46 - pre 158 meseci
Tja, ja sam vise za brzinu tako da bih pre koristio metodu sa return u if iskazima, mada su razlike minorne, sem ako se metoda ne poziva iz neke petje. Zavisno od koliko metoda treba da pozivas i da li se pozivaju sekvencijalno kao u tvom primeru, ja bih umesto povratne vednosti koristio exception-e. Ukoliko neka metoda ne prodje baca exception, ostale metode se nece izvrsiti, pride mozes da uhvatis na kojoj metodi je puklo i zasto.
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4882
*.dynamic.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+629 Profil

icon Re: Return dilema...01.03.2008. u 08:16 - pre 158 meseci
Citat:
01011011: X Files mislim da ovo tvoje nije dobro zato sto ukoliko je prva metoda (netacna) false, ostale se nikada nece imati sanse pokrenuti.

A šta se događa sa ostalim funkcijama u njegovom primeru (da li će se izvršiti), ako je prvi poziv postavio rs na false ?
Ako je prvi uslov eliminatoran za drugi, a drugi eliminatoran za treci, i tako redom (njegov primer na to ukazuje zbog if (rs) {...}), onda rešenje koje sam dao ima smisla. Naravno, može da se optimizuje sintaksa kao što reče Shadowed.

Ako je broj funkcija prevelik, onda u C++ obično napravim niz pokazivača na funkcije i provera ide kroz petlju, a siguran sam da i .NET raspolaže nekom srodnom tehnikom.

Ipak, ono što vidim kao glavni 'nedostatak' prikazanih rešenja je što bool tip ne može da čuva dovoljno informacija o onome šta se zapravo desilo, a korisnika može da zanima. Sećam se situacije dok sam radio u jednoj firmi kada sam imao potrebu da pristupim nekom važnom fajlu, pa je prethodno bilo vrlo bitno da znam u kakvom je on 'stanju' i eventualno javim korisniku. Dakle, umesto FAJL NIJE DOSTUPAN, trebalo je reći i ZAŠTO nije dostupan.

Po sećanju (moguće da nisam tačno postavio redosled):
1) da_li_fajl_postoji() // <--- ovo je eliminatorno, jer ako nema fajla ništa dalje nije važno
2) da_li_je_fajl_readable() // <--- ovo je bilo bitno kada su aktuelne bile i 3,5'' diskete, fajl postoji ali ne može da se čita zbog nekog oštećenja
3) da_li_je_fajl_read_only() // <--- read only osobina
4) da_li_je_file_writable // <--- slčno kao pod 2
5) da_li_je_fajl_okupiran() // <--- već otvoren ekskluzivno od nekog drugog programa
itd...

U prikazanom sistemu je moguće da fajl bude recimo istovremeno i read-only i okupiran, pa je o trebalo sve to javiti. Tada bool tip nije bio dovoljan, pa se išlo na operacije sa bitovima da bi se zabeležilo stanje.

Što se tiče konkretnog pitanja u vezi return na jedom ili više mesta, moj stil je - na jednom. U konkretnom, pojednostavljenom primeru to je sve neočigledno, ali return usred nekog bloka može da zaobiđe neki deo koda koji ti je bio bitan.
 
Odgovor na temu

negyxo
Aleksandar Perkuchin

Član broj: 29751
Poruke: 897
212.200.215.*



+171 Profil

icon Re: Return dilema...01.03.2008. u 12:39 - pre 158 meseci
Dobro, nema potrebe da se ide toliko u offtopic. Nije bitno da li se izvrsava niz funkcija niti koja je povratna vrednost niti kako ce se handlovati greske. Moja je greska sto odmah nisam jasno napisao na sta mislim. Uglavnom, razlog zasto sam ovo napisao je sugestija koju sam dobio da je code jasniji ako se pise samo return na kraju i nigde vise u metodi, i to vazi za sve slucajeve, dok se ja sa tim ne mogu sloziti. Meni je prirodnije da vracam return u bloku kada znam da je sve sto je trebalo da se uradi - uradjeno, dok ima slucajeva kada pametim vracenu vrednost i na kraju vracam return ali to je, kao sto sam napomenuo, od slucaja do slucaja. Veci deo metoda koje sam pisao su pisane sa return tamo gde je potrebno dok je manji deo sa jednim return-om na kraju.
Pitao sam ovo jer sve kodove koje sam vidjao su vecinom napisani sa return naredbom koja se nalazi bilo gde u metodi (evo gledam Rotor-ov source code, Sharp Develop, MSDN...) i, iskreno, cudno mi je da taj pristup ne valja iako meni on deluje sasvim prirodno.
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4882
*.dynamic.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+629 Profil

icon Re: Return dilema...01.03.2008. u 14:06 - pre 158 meseci
Citat:

Uglavnom, razlog zasto sam ovo napisao je sugestija koju sam dobio da je code jasniji ako se pise samo return na kraju i nigde vise u metodi, i to vazi za sve slucajeve, dok se ja sa tim ne mogu sloziti.

Moje iskustvo govori da skriveni return može uticati da se neki bitan, završni deo koda nenamerno zaobiđe. Ali ako znaš šta radiš, onda nema problema :) Ipak, ja koristim stil sa jednim return, ali ne smatram da je to nešto preterano bitno da bih nekoga 'savetovao' da isto tako razmišlja. Prosto, vremenom mi se taj stil svideo.
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6006



+4618 Profil

icon Re: Return dilema...01.03.2008. u 16:28 - pre 158 meseci
Ta sigestija o jednom returnu stize od "strukturalnih zealota" po njihovoj teoriji bilo kakovo nestrukturalno uplitanje u tok izvrsavanja funkcije je jeres i treba je izbegavati, znaci bez return, bez goto, nikakvi exceptioni, itd. Na tebi je sad da li ces ili neces prihvatiti takvu ekstremnu praksu. Jedino sto treba da imas u vidu je da pracenje takve doktrine vuce sa sobom pad performansi, jer prevremeni return zamenjujes logickim proverama u ostatku metode sto vrlo brzo moze da postane veoma komplikovano ako postoji vise od par logickih varijabli, a prevremeni return moze da ti pomogne da bar jednu od tih varijabli izbacis iz provere. U principu ako postoji trigger za prekid funkcionisanja metoda i on je zadovoljen postedi sebe muke i uradi return.

inace (iako je offtopic, zgodno je napomenuti) ovaj tvoj kod je mogao i jednostavnije, preko "and also" operatora, ako rs postane false svi buduci andalso operateri nece evaluirati desnu stranu iskaza, tj nece pozvati metod:

Code:

bool Method()
{
    bool rs = SomeOtherMethod();
    rs = rs && SomeOtherMethod1();
    rs = rs && SomeOtherMethod2();
    rs = rs && SomeOtherMethod3();
   
   return rs;
}



Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

negyxo
Aleksandar Perkuchin

Član broj: 29751
Poruke: 897
212.200.215.*



+171 Profil

icon Re: Return dilema...01.03.2008. u 17:48 - pre 158 meseci
mmix ako budes dolazio za NS imas pice od mene

Znam sve to sto si napisao, primer koji sam napisao je bio u momentu, cisto demonstrativno da se vidi da je return na kraju mali overhead u pojedinim slucajevima ako se ne pisu ugnjezdeni if-ovi, a ugnezdeni if-ovi i bilo sta za mene moze da ima smisla do nekog 4-5-og level-a (mada u praksi gledam da ne bude vise od 3) sve ostalo smatram jako lose napisanim, jer je mnogo teze za citanje (i pisanje, bar meni), ali opet, ponavljam ovaj primer sto sam naveo to ne oslikava najbolje. Inace dobro primeceno za exception, i to mi je palo na pamet, jer i exception pravi prekid bilo gde u kodu pa opet se koristi sasvim normalno i ne predstavlja nikakvu "nejasnocu".
Inace, sugestija koju sam dobio je "a must", posto je upitanju posao, tako da nema mnogo odstupanja. I jos jednom na kraju, ovo je nesto sto mora uvek, znaci nije ni problem da se prihvati return samo jednom na kraju u vecini slucajeva, nego ovo mora bas uvek.

PS. Mali test koji bi magao svako da uradi je - da uzme i da pise nekih par dana bez return-a, osim na kraju, mislim da se tada najbolje vidi zasto u pojedinim situacijama nema smisla.
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6006



+4618 Profil

icon Re: Return dilema...01.03.2008. u 18:25 - pre 158 meseci
Pa pazi, ako je to zahtev koji ne mozes da izbegnes, mozda mozes da budes bezobrazan

Napravi samo jedan return i iznad njega labelu "KRAJ" i onda umesto da uradis prevremeni return, uradi goto kraj;
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

negyxo
Aleksandar Perkuchin

Član broj: 29751
Poruke: 897
212.200.215.*



+171 Profil

icon Re: Return dilema...01.03.2008. u 18:29 - pre 158 meseci
Kada bi to uradio, verovatno bi i ja dobio goto FindAnotherJob
 
Odgovor na temu

[es] :: .NET :: Return dilema...

[ Pregleda: 2445 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.