if-else használata

Fórumok

Arra lennék kíváncsi, hogy ki miként gondolja jónak az if-else szerkezet használatát.
Az if-else szerkezet használatára rengeteg ajánlás született az évek során.
Ezeket megpróbálom összeszedni, ha valakinek még jut az eszébe, akkor azokat is örömmel várom:

  1. Ha csak lehet else-t ne használjunk, mert nehezen érthető lesz a kód! Ez főként hosszú if-es részeknél lehet, illetve egymásba ágyazottaknál.
    pl.
    
    if (cond1) {
      if (cond2) {
        if (cond3) {
        } else {
        }
      } else {
      }
    } else {
    }
    
  2. Az előző pont egyik megoldásaként szokták ajánlani, hogy az összes ágára külön if készüljön.
    pl.
    
    if (cond1 && cond2 && cond3) {
    }
    if (cond1 && cond2 && !cond3) {
    }
    if (cond1 && !cond2) {
    }
    if (!cond1) {
    }
    
  3. Ha használunk is else-t, akkor se használjunk egymásba ágyazott if-es szerkezetet!
  4. Funkcionális programozást kedvelők szerint if-et egyáltalán ne használjunk, mert az side effect-et okoz, hanem csak az if-else-es ternary operátort (vagy ? : más nyelvekben)
  5. if-ekben return-nel térjünk vissza a függvényből, így laposan (flat) tartható a struktúra. Ez szembe megy az egy függvény egy kilépési pont elvnek.
    pl.
    
    if (cond1) {
      return;
    }
    ...
    
  6. if-else-ek helyett hacsak tudunk használjunk switch-et vagy pattern matching-et.
  7. Többszörös típus vizsgálat helyett használjuk az OO polimorfizmusát.
  8. Minden if után szerepeljen else ág is, akár üresen is, hogy lehessen látni, hogy nem felejtődött el.

Ha valaki kedvet érez, akkor refaktorálhatja a kedvenc nyelvén a Gilded Rose Kata-t, amiben rengeteg egymásba ágyazott if-else szerkezet van.
A feladat röviden:

  1. Tesztek írása minden estre.
  2. Kód refaktorálása, hogy könnyen érthető és módosítható legyen.
  3. Új funkció hozzáadása: "Conjured" elemek kezelése

Hozzászólások

Egymasba agyazott if-else-ek is eleg jol kovethetoek, ha az egyiptomi stilus helyett a normalisat hasznalod. Ha hosszu, oda tudod kommentelni, hogy ez epp melyike.
A masik, voltam olyan helyen, ahol policy miatt kotelezo volt a {} kitetele akkor is, ha egy utasias voot benne. Adott esetben segithet.
Ha azonos feltetelek menten agazol el, a switch-case is jo, opcionalisan "bitfieldekkel".

--
"Ne kúrd el mégegyszer a karakterkészletet, mert akkor ez a file is conflictolni fog a merge serveren és ez azért eléggé bosszantó!"

Mint tudjuk mindennek van előnye és hátránya. Lehet egy elv bármilyen tökéletes a program olvashatósága (érthetősége), karbantarthatósága, hibamentessége, thread safety-sége, ... mellett, ha az adott programozási nyelven nehéz megvalósítani, vagy a projekten résztvevők nem tudják jól alkalmazni, vagy a megvalósításnak nagyobb az erőforrás igénye (CPU, memória), mint ami elfogadható (és még lehetnek egyéb szempontok is).

Ezeket az elveket szerintem jó időnként átbeszélni, melyik mikor jó, mikor rossz.

Előfordult pár olyan eset, amikor üzemeltetők számára készítettem apróbb szkripteket (VBScript, PowerShell), amikben használtam kommenteket.

Ez inkább dokumentációnak tűnik, az meg lehet benne (kvázi ez az, ami a használójának szól). Ha olyan komment lenne benne, ami a működését magyarázza, az nem jó, mert a kódnak kell olyannak lennie, hogy könnyen érthető legyen (kvázi ez az, ami a karbantartójának szól).

Ja, persze, ezzel egyetértek, viszont a függvény dokumentációja ebben az esetben nem hagyható el. Ugyancsak akkor, ha pl. egy komolyabb
matek számítás van, akkor érdemes odaírni, hogy végülis mi a csodát számolunk, és miért úgy, ahogy. Egyéb esetben én sem szoktam megjegyzést
írni.

Dehogynem írunk kommentet. Csak nem olyan kommentet, amit a kód strukturálásával és a változók/függvények jó elnevezésével ki lehet fejezni.
Olyan kommentet leírunk például, ami azt magyarázza, miért így működik az implementáció. Meg olyat, ami megmagyarázza, hogy miért is van erre szükség (például egy 3rd party hívás bugjának elfedésekor).
De trivialitásokat nem írunk le kommentben.

Az implementáció magyarázására inkább a unit test-ek valók, mint a kommentek. Ezeknek tartalmazniuk kell egy ideális esetet (ú.n. happy path, amikor minden jól fut le), illetve a corner case-eket (beleértve a hibakezelés tesztelését is). Így szükségtelenné válik az implementáció magyarázata. A kommentekkel többnyire csak a baj van: ha például refaktorálod a kódot, akaratodon kívül érvényüket veszíthetik, és onnantól hazugságot állítanak.

A unit teszt nem szabad, hogy implementációt teszteljen. A unit teszt alacsonyszintű specifikációnak való megfelelést (viselkedést) tesztel, szokták is mondani, hogy a legalacsonyabbszintű, legrészletesebb specifikáció olyan, mint a kód. Bizony. Igazából a unit tesztek halmaza nem más, mint egyfajta formális specifikáció.

A komment is a kód része (leírod azt, amit nem tudsz kifejezni kódban - a miértet, és nem a mit), ezért amikor refaktorálsz, a kommentet is refaktorálni kell. Tök alap.

"Egymasba agyazott if-else-ek is eleg jol kovethetoek"

"Ha hosszu, oda tudod kommentelni, hogy ez epp melyike."

A kedvencem, amikor egy 50-100 soros metodusban van 8 beagyazas szint, orombodotta...

----------------------
"ONE OF THESE DAYS I'M GOING TO CUT YOU INTO LITTLE PIECES!!!$E$%#$#%^*^"
--> YouTube csatornám

Én (és más kollégáim is) az 5. pontban leírtakat használjuk.

A lapos struktúra olvashatóbb, és könnyebb megérteni, illetve utólag módosítani, mint a rahedli if/else ágat. Ez pedig fontosabb annál, hogy ne legyen több kilépési pont.

Nekem az az olvashatóbb, ha egy kilépési pont van, és ki tudok abból indulni, hogy nem lép ki valahol vizsgálat közben.
Én azt szeretem, ha az if lefed minden esetet és az else ágakban látom mik a lehetséges variációk. Tehát a második, de else-ekkel kapcsolva, return nélkül. Igaz, én nem írok minden nap kódot.

"Nekem az az olvashatóbb, ha egy kilépési pont van,"

Az egy kilepesi pont egy nagyon regi elv, akkoriban nem szamitott gaznak a hosszu metodus. Egy max 5 soros metodusban nem lesz elonye. Tovabba manapsag minden normalis IDE meg tudja jelolni neked a kilepesi pontokat, eclipse meg IDEA-ban peldaul ha raallsz a visszateritett ertekre, megjeloli a return-okat.

"és ki tudok abból indulni, hogy nem lép ki valahol vizsgálat közben."

Hat vizsgalodhatsz tovabb, hogy meggyozodj, hogy a kilepesig meg nem tortenik semmi mas. Ha ott egy return lenne, abbahagyhatnad a vizsgalodast, mert a szamodra erdekes ag veget ert.

----------------------
"ONE OF THESE DAYS I'M GOING TO CUT YOU INTO LITTLE PIECES!!!$E$%#$#%^*^"
--> YouTube csatornám

Részben korfüggő, igen. Kezdetben a memória és a tároló (pl.: lyukkártya) mérete szabott gátat a kód méretének. Ekkoriban a tömörség volt a szempont (lásd például a korai programozási könyveket, mind például a Kernighan-féle C könyv), nem pedig az olvashatóság. A technika fejlődésével a memória ár/érték mutatója drasztikusan emelkedni kezdett, így lehetővé vált a hosszabb kódok írása. Előbb utóbb pedig olyan kódok születtek, amelyekhez évek múltán is hozzá kellett nyúlni.

Az utólagos módosítások melléktermékeként megszülettek bizonyos alapelvek (pl.: clean code), amelyek betartásával könnyebb olyan kódot írni, ami kommentek használata nélkül is egyértelművé teszi a kód szándékát, lehetővé téve azt, hogy akár több év távlatából is könnyen meg lehessen módosítani. A mostani elvek szerintem már eléggé kiforrottak, nem hiszem, hogy el fognak avulni.

„A fizika fontosabb alaptörvényeit és tényeit már mind felfedezték. A jelen pillanatban az alapok olyan erõsek, hogy az a lehetõség, hogy új felfedezések valaha is kiszorítsák õket, rendkívül távolinak látszik... A jövõ felfedezései az eredményeket legfeljebb a hatodik tizedesjegyben befolyásolhatják.”
--
blogom

Azért a hajónapló kedvéért tegyük hozzá, hogy ezt a kijelentést még az 1900-as évek elején tették (nem személyeskedés, de az a Michelson , aki olyat akart mérni, ami nincs is :) - persze a nagy tudósok is tévednek).
Azóta a klasszikus ("emberléptékű") fizika valóban nem sokat fejlődött és nem is igen szorult igazításra (még mindig érvényes és helytálló az évezredes Arkhimédesz-törvény, a fél évezredes Newton- és Kepler törvények, az évszázados Ohm-törvény).
Viszont ez a "legfeljebb hatodik tizedesjegy" tartalmazza többek között a relativitáselméletet, kvantummechanikát, atomfizikát, azaz pl. a gravitációs hullámokat (pontosabban a létezéséről való tudást), a Merkúr pályájának változásának magyarázatát (klasszikus fizika ui. itt csődöt mond), PET-et (nem a palackot), az informatikát és Hiroshimát.

szerintem aki hallotta a fenti idézetet (többnyire fizika órán), az van annyira tájékozott, hogy a körülötte lévő bekezdések lényegét is ismeri Simonyi Károly könyvéből...
aki meg nem, hát... ha értelmesebb, akkor megfelelő forráskritikával kezeli a mondatot, ha meg nem, akkor a te magyarázatod sem hatja meg.

no, mindegy.
--
blogom

A mostani elvek szerintem már eléggé kiforrottak, nem hiszem, hogy el fognak avulni.

Van sok elv, ami kiforrott és sokan megelégedéssel használják. Rengeteg van, amin máig is vitatkoznak, olyan is, amit a többség rossznak gondol.
Eleve sokféle programozási nyelv van és egy elv egyik programozási nyelvnél működik, egy másiknál nem igazán.
Pl. 4. Funkcionális programozást kedvelők szerint if-et egyáltalán ne használjunk, mert az side effect-et okoz, hanem csak az if-else-es ternary operátort (vagy ? : más nyelvekben)

Funkcionális programozási nyelveknél ezt könnyű alkalmazni (, mert pl. nem is tudsz mást tenni, Haskell), más nyelveknél ez nehézségekbe ütközhet.

vagy pl. 5. if-ekben return-nel térjünk vissza a függvényből, így laposan (flat) tartható a struktúra. Ez szembe megy az egy függvény egy kilépési pont elvnek.

Itt két elv ütközik egymással. Mind a két elvnek, a mostani hozzászólások alapján is, megvan a létjogosultsága. Ha az elsőt betartod, akkor a másodikat nem, bár a try-finally szerkezettel ez is valamelyest biztosítható. Fordítva működhet a dolog, ha át tudod úgy alakítani a programot, hogy lapos maradjon a struktúra és csak egy kilépési pont legyen.

Én úgy gondolom, hogy bármelyik juniornál tapasztaltabb, tudni fogja azt, hogy ezen elvek közül melyik értelmes az általa használt nyelveken. Ha máshogy nem, tapasztaltabb kollégáktól megtanulja, hogy egy adott nyelven bizonyos feladatokat hogyan lehetszokás megvalósítani. Ahol a szokás lehet a nyelvre jellemző pattern, vagy adott esetben ezt felülbíráló céges konvenciók.

Bizony. Egyfelol fejlodnek rengeteget az IDE-k. A kilencvenes evekben a primitiv VC++-ban hasznos volt az osztalyok adattagjait m_-el prefixelni, manapsag viszont barmilyen IDE ezeket meg tudja jelolni mas szinnel/bolddal, felesleges csak ezert hozzacsapni par karaktert. Aztan idonkent megjelennek nagyon befolyasos iromanyok ebben a temaban, amelyek visszahatnak a tobbseg velemenyere. Pl. a '90-es evek elejen Code Complete-ben a szerzo max 100-200 soros metodusokat javasolt, a 2000-es evekben Clean Code-ban Uncle Bob viszont sokkal rovidebbeket megspekelve egy csomo egyeb tanaccsal is, ami sokak szerint sokkal olvashatobb kodot eredmenyez...

----------------------
"ONE OF THESE DAYS I'M GOING TO CUT YOU INTO LITTLE PIECES!!!$E$%#$#%^*^"
--> YouTube csatornám

Ez kimaradt, most vettem fel:

8. Minden if után szerepeljen else ág is, akár üresen is, hogy lehessen látni, hogy nem felejtődött el.

(Bár ilyet még nem láttam a való életben, hogy bárki is alkalmazná)


if (there_is_accounting_for_tastes) {
if (flame_war_wanted) {
start_an_if_else_topic();
if (gigantic_war_needed) {
build_yet_another_method();
reason_why_all_else_fails();
}
} else {
break_a_bottle_of_wine();
}
} else {
do_whatever_you_want();
}


switch (false) {
case ($there_is_accounting_for_tastes): do_whatever_you_want();  break;
case ($flame_war_wanted): break_a_bottle_of_wine();  break;
case ($gigantic_war_needed): start_an_if_else_topic(); break;
default: 
         start_an_if_else_topic();
	 build_yet_another_method();
	 reason_why_all_else_fails(); 
	 break;
};

:P

5-ös, Return fast, Fail fast.
Ahogy tudjuk, hogy elértük a végeredményt vagy hibára futottunk, azonnal return / exception.
Szépen látható debuggoláskor is, hogy meddig jut el a végrehajtás a függvényben.

Tódítanám még a kérdést egy kollégámmal folytatott vita alapján.
Ha ezek az ifek függvényben vannak, akkor a lokális változót kötelező-e a deklarációnál inicializálni.
vagy
Elegendő az egyes ágakban.

A problematika abban rejlik, hogy a változót talán nem is használjuk minden ágban. (és/vagy) Elfelejtünk valamilyen ágon értéket adni és kész a baj. Vagy a program logikájából következik, hogy ha nem kap értéket a változó, az azért van, mert azon az ágon úgy sem használjuk.

Ez talán vetekszik az üres else ág kiírásával.

Ez például egy lényegi kérdés. Én amellett vagyok, hogy a használatkor kell deklarálni a változót és egyből inicializálni is. Ha két ágon ugyanabban a szerepben szerepel a változó, mondjuk belül kap értéket, akkor az if előtt deklarálom és inicializálatlanul hagyom, hiszen az inicializálatlan változókért a fordító szól (Java).

De ha C projekt van, akkor már teljesen más a szitu, mert ott általában a standardok megszabják, hogy a függvény elején kell deklarálni mindent. Ami szerintem marhaság, de hát ez a szabvány, ezért fizetnek, úgyhogy nem pampogok.

A standardoknak néha nem csak a szépség az oka. Régen az "egy kijárat" a struktúrált programozásból és az enter-leave technikából adódott, esetleg így lehetett megtakarítani +1 menetet a fordításban. Ugyanakkor megdöbbenéssel tapasztaltam, hogy Clipper esetén a public az utasítás. A függvény elmegy a változóval és berakja a public pool-ba. Gondolom itt nagy szerepe volt az interpreteres futtatásnak is.

Ez én elképzelésem mindig az, hogy az elején szeretem látni az összes változót. Mondjuk a memória felhasználás, vagy hasonló assemblerből örökölt beidegződés miatt. A kód írásakor meg ellenőrzöm az összes ágat. Ha valamelyik ágban hiányzik az egyébként szükséges értékadás, akkor biztosan nem készültem még el. ;)

Bocsi az abszolút pszeudo kódért!
Mi az, hogy metódus? Ilyesmiről nem volt szó.

Vitatható az "ajto" meghatározásának a helye, meg a lokális változó C szintaxisa, meg akár a program értelme - talán rossz a példa.
Saját szavaimmal: Ha nem törtek be, miért inicializálnám az ajtót? Ha a szintaxis megengedi, akkor előre írom, hogy lássam a használt lokális változókat. Nem végzek felesleges műveletet sem az inicializálással, de azt sem akarom leírni, hogy "print nemtörtekbe, NULL".

function hol_törtek_be()
local ajto
if betörtek
 if ajto1
  ajto=ajto1
 else
 if ajto2
  ajto=ajto2
 else
  ajto=nemtudom

 print betörtek, ajto
else
 print nemtörtekbe
endif

Azért ebben a pici kódban tirviálisan nincs szerepe. Ha meg ki akarom írni "nemtörtekbe, egyikajtónsem" akkor fel kell venni mégegyszer. Mondjuk ebből már nem látszik a helyes út.

Viszont nem volt szó a nyelvről. A példám jó C-ben is, a szerinted logikus megoldás meg csak C++ és attól felfelé, vagy assemblerben(!) működik, bár az utóbbiban csúnya lesz.

Igaz, de nem felel meg az én assembler járású agyamnak.
(A példám meg rossz, mert a const miatt mindig igazad lesz.)
A függvény elején meg nemtudom, hogy lesz-e "nemtudom", és emiatt kerülöm a felesleges értékadást, mert
- felesleges
- + futásidő
- + foglalás

Ez bizonyára betegség, de AIX alatt is az assembler kód méretét néztem, - bár nem abban írtam a programot - és sikerült is néha döbbenetesen gyorsítani. Igaz, ez csak egy pointer, de ha nincs "kioptimalizálva", akkor egy felesleges utasítás, thread csere esetén meg egy regiszterrel többet kell menteni.

Ne értsd félre, nem vitatkozom, csak elmondtam az agymenésemet. ;)

Ez a függvény túl sok mindent csinál.
Egyszerre két dolgot.



function betortek() {
return betörtek
}

function melyikAjto() {
if ajto1
  return ajto1
else if ajto2
  return ajto2
else
  return nemtudom
}

function hol_törtek_be() {
local betörtek = betortek();
if(betörtek) {
 local ajto = melyikAjto();
 print betörtek, ajto
} else {
 print nemtörtekbe
}
}

Itt minden változó csak abban a szkópban van definiálva, ahol felhasználásra is kerül.

A hol_tortek_be kérdésre már csak akkor kéne válaszolni, ha már eldőlt, hogy betörtek. Ehhez mit szólsz?

function print_security_status()
if betörtek
print betörtek ide: hova_tortek_be()
else
print nemtörtekbe
endif

function int hova_tortek_be()
if ajto1 return ajto1
if ajto2 return ajto2
return nemtom

Belinkelnéd a kicsit feljebbet? Olvasgattam a szálat, de most nem találom. Pszeudokódok mennek itt, miért kell inline-olni?

Nekem első szempont az olvashatóság, a karbantartható kód írása. Sokkal több idő megy el az olvasással, mint az írással.

Ha a performance nem ok, akkor először megkeresem azt a helyet, ahol a legtöbbet nyerhetek, ez általában nem egy függvényhívás, hanem valami memóriaterület fölösleges lefoglalása vagy algoritmikus hiba, valami más erőforrás nem optimális használata, stb.

Továbbá én írom-olvasom a forráskódot, és hogy a fordító ezt a metódust inlineolja-e, az már legyen opció a fordítónak, ne nekem, a humán résztvevőnek.

Ezek szerint kódot kerestél. :) Ez az agymenés.
Én alacsonyabb szinten dolgozom. Az erőforrás használatát is optimalizálom. Néha eljutottam olyan mélységig ;), ahol már egyértelműen odaírták: ehez ne nyúlj! Vagy ezen a rendszeren ne használd a register deklarációt! Mégis sikerrel jártam.

Hogyan kapcsolódik az if szerkezethez? A fenti esetben is néhány if volt a kritikus részen, ugyanígy lehetett agyalni rajta. A kód rövid, fordító meg nagyon jó volt, mégis meg tudtam támogatni egy-két ötlettel, ami rengeteget gyorsított a futáson. Ráadásul a kód csak pár sor volt, látszólag nem volt mit agyalni rajta. Nem volt rosszabb, mint az olyan próbálkozás, hogy hogyan tudsz leírni egy sort algoritmust max két sorban, persze vagy 20 egyenlőségjellel. :)

Nomármost, ennyi erőlködés után két helyen futtatva ugyanazt az algoritmust, kár lenne egy hívásra pazarolni az időt. Hát innen jön az inline, pont a hegyezés miatt.

Az első tíz-/százezer kódsor után ki fog ez alakulni magától... de persze nem szükségképpen lesz azonos mások tapasztalatával.

Én például ilyesmiket szűrtem le [Megj: nem itt akarom megvitatni őket], hogy:

- Ne csesszük el a függvény paramétereit, mert elrontjuk a debuggolást

- Minden részeredmény kerüljön változóba, hogy könnyebb legyen debuggolni

- Minden függvénynek egy kilépési pontja legyen, ott lehet az erőforrás-felszabadítás meg a naplózás, valamint oda lehet tenni a megállási pontot a debuggerben

- Abból még sosem lett baj, ha egy komponens külön forrásprogramba került, még akkor sem, ha úgy indult, hogy 'ez csak pár sor lesz' [mindig úgy indul]

- Próbáljunk a 'valószínű' helyett a 'biztos'-ra célozni a programozásnál [kedvenc példám: először lekérdezem a dátumot, aztán az időt -- nem valószínű, hogy pont a kettő között legyen éjfél]

- Az inicializálatlan/felszabadított pointer legyen NULL, még akkor is, ha 'biztos, hogy ebben a helyzetben ebből nem lehet gond'. Lehet, hogy holnap éjjel valaki másnak kell hozzányúlnia, és azután már lehet gond.

- Próbáljuk a 'definíciót' és az 'implementációt' a lehető legjobban szétválasztani [például: typedef struct semmközödhozzá *MyHandle;]

- A valóságban nincs olyan, hogy a forrásprogramban 'átdefiniálom a TAB-karaktert'. Olyan van, hogy 'átdefiniálom az indentációt'.

- Az exception-ök fő előnye, hogy tönkrevágják a program-szerkezetet. Ugyanez igaz az ON ERROR GOTO szerű hibakezelésre.

- Próbáljunk mindig warningmentes fordítást produkálni [pl: -W -Wall -Werror], néha egy-egy warning hülyeség ugyan (pl a dlsym-visszaadott értékével kapcsolatos hiszti), de a legtöbb hasznos, megszívlelendő

- Az OO nagyobbrészt parasztvakítás, kisebbrészt szintaktika

- Ha a W-rendszernek olyan típusai vannak, hogy 'Wchar', 'Wint', 'Wpointer', akkor kezdhetünk arra gondolni hogy a fejlesztőkön erőt vett a hatalmi téboly.

- Ha X komponens azt állítja, hogy felülről kompatibilis Y komponenssel, akkor szinte biztos, hogy ez csak a leggyakrabban használt funkciókra vonatkozik, de lehet, hogy azokra is csak fenntartásokkal [pl: OpenSSL-1.1 vs 1.0.x]

- Ha egy program 'megkönnyíti' a programozó dolgát, az a nemtriviális esetekben megnehezítést jelent [például a 64-bites Windows system32-es kavarása]

- Nagyon sok szép módszer, szabály és technika létezik, ezek egyrésze triviális [pl: rajzoljunk köröket, és húzzunk a körök közé nyilakat], másrésze butaság, a harmadik része hasznos, de olyan sok van belőlük, hogy nem lehet mindet követni; ha kérdezik, bátran mondjad, hogy eddig a BUSH-módszertan elveit követted (ahol minden betű jelent valamit), de már tervezel áttérni a BRUSH-módszertanra, ami még ütősebb.

En azt gondolom, hogy ha ennyi ifed van egy fuggvenyben (1 es 2), akkor valahol valamit ki kellene szervezni. Tehat pl. van egy fuggvenyed, ami az egyik ilyen osszetett feltetelt vizsgalja es az alapjan ter vissza true-val vagy false-al. Ennek az az elonye, hogy konnyen tesztelheto, es olvashato is. (Mar ha szansz 10 masodpercet a fuggveny nev kigondolasara.)

--
Pásztor János
Sole Proprietor @ Opsbears
Development Lead @ IXOLIT
Refaktor Magazin

+1
Én is azt gondolom, hogy azok az esetek refaktorálásért kiáltanak.
Én a 4. pontot tartom a legjobbnak, ha csak lehet azt az elvet kellene követni. Sajnos sokszor nincs idő, lehetőség (pl. nyelvi akadályok), képzettség azt követni.

az ilyeneket miert nem a prog.hu -n beszelitek meg ?

sub

~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~
Fedora 24

A 2-es es 6-os pont kombinalva = erlangos verzio: pattern match a feltetelekre a fuggveny fejleceben, szukseg szerint guardokkal diszitve. A legspecifikusabb matchtol haladsz a kevesbe specifikus fele: kulon elonye, hogy ha egy feltetelre nincs match, akkor szepen elcrashel a process a megfelelo hibauzenettel a megfelelo fuggvenyre hivatkozva, nem pedig neman tovabbfut (ez jo!). Dialyzer elvileg szol forditasi idoben, ha nem teljeskoru a match (konfiguralhato).

A mellekhatasa, hogy matcheles kozben ki is bontjuk a kapott strukturat, igy ket legyet utunk egy csapasra. Pattern matching for president!

Ha egyszerubb a szerkezet, akkor esetleg olvashatobb egy case struktura, de az nagyon konnyen tulburjanzik (foleg az altalanosan elfogadott 80 karakteres sorszelesseg betartasaval), szoval csak ovatosan.

ui: micsoda? nincs erlang verzio a peldakodbol? hat ezt surgosen potolni kell :)

Körülményektől függ, hogy hogyan áttekinthetőbb.
Alapesetben az 1.-et (egymásba ágyazott if-ek) használom. 1-est könnyebb végigkövetni, a 2-esben az "!" kirakását könnyebb elrontani.

Ha hosszabb a kód, áttérek a 2-esre (össze &&-elt feltételek), viszont akkor arra törekszem, hogy az összetett feltételt kiemeljem:
bool ertelmesNev = cond1 && cond2 && cond3;
if (értelmesnév) ...

Másik változat, sem többszörös behúzás, sem összetett feltétel:
if (!cond1) {
} else if (!cond2) {
} else if (!cond3) {
} else {
}

8. Minden if után szerepeljen else ág is, akár üresen is, hogy lehessen látni, hogy nem felejtődött el.
Akkor meg azt nem lehet látni, hogy miért üres az else - elfelejtődött, avagy szándékosan üres.

Nem hasznalok else-t. Ternary operatort csak akkor ha nagyon rovid hozza a feltetel es a kod.