If-ek...a programozás Pistikéi
2013-12-04T13:06:17+01:00
2014-01-17T22:02:58+01:00
2022-07-19T02:07:39+02:00
  • Koszonom koszonom koszonom, es akkor meg nem is ittam sorrrot mint mosstt...
    Mi ez a rohadtnagy mandarin reklam itt a prog.hu-n? :DDD
    Mutasd a teljes hozzászólást!
  • soha nem érezném magam amit rosszul mert egy adott környezetben mások a szokások, weben szinte minden frameworknak, cms-nek, library-nak megvan a saját programing/ coding style-ja (hívja mindenki úgy ahogyan akarja, még ebben sincs konkrét megegyezés :D )

    igazából nem érzem úgy hogy magyarázkodnom kellene, le írtam azt a stílust amit én előszeretettel használok, nálam (és valószínűleg nálad is - nem sértés) sokkal okosabb emberek is vitatkoznak ezen. csak írd be google-ba: "else after return" 

    a swich és "if else if else" példánál meg csak annyi a lényeg, hogy én ha egy adott problémára több megoldás létezik akkor én elkötelezem magam valamelyik mellet így 
    nekem a kód később garantáltan olvasható lesz, hiszen a swich és az if átjárhatóságát leszűkítettem (érsd: egy 100 soros kód részelt első sora swich-el kezdődik tudom. hogy egyes feltétel teljesülésekor több vagy kevesebb blok fut le benne)

    off:
    még régről emlékszem itt egy szinte vérig menő vitára a tabulátor vagy 2-4 space használatát illetően, kicsi ez is arra hajaz....

    szerk:
    KisJ: php/javaScript
    Mutasd a teljes hozzászólást!
  • Legyszives ird le, hogy te melyik forditora/nyelvre gondolsz...
    Mutasd a teljes hozzászólást!
  • Láttuk ám a máshogy működö konzisztens IF-elést. 
    Mutasd a teljes hozzászólást!


  • igen személyeskedek, mert aki igénytelen a kódszövegét tekintve, az "megérdemli", hogy szóljanak neki,

    és ebben is különbözünk egymástól, hogy én bevállalom ezt, és nem fogom személyeskedő hangnemben számon kérni azt, hogy ugyan már miért személyeskedsz,
    persze értelek én, mondhatod azt, hogy "amilyen az adjonisten, olyan a fogadjisten,
    és igen erről van szó,

    nem is értem, hogy foglalkozhat olyan valaki programozással, vagy bármi egyébbel, aki a kiadott "munkáját", jelen esetben hozzászólását átnézve és észrevéve, hogy valami nem stimmel, valamilyen korrigálandót talál benne, akkor azt nem próbálja meg javítani, hanem majd a többiek úgy is megértik, mert nem az a lényeg, hanem az, amit egyébként csak csak gondolt...

    ha szarul érzed magad, azért mert próbálják felhívni rá a figyelmedet, hogy egy adott környezetben/közösségben mások a szokások, akkor az a te bajod, a közösséget nem nagyon fogja érdekelni, ha meg te meg vagy győződve, hogy igazad van, akkor meg csak újabb problémákat csinálsz magadnak, ha görcsölsz rajta, akkor legyél már annyira f.sz. gyerek, hogy tényleg azt gondold, és úgy is tegyél, hogy neked van igazad,

    on topic

    a különböző kódolási szokások nem véletlenül alakulnak ki, az ember, a biológiai gép is törekszik a rendre, nyilván gyorsabb/könnyebb feldolgozni egy olyan kódszöveget, amiben felfedezhető a rend, mind amelyikben nem, kivéve persze, ha valakinek vannak olyan tanult, felvett sémái, ami alapján az utóbbit is könnyen tudja értelmezni, de ez a többiek szempontjából rossz beidegződésnek számít, hiszen pont arról van szó, hogy a nála nagyobb rendszerbe "rosszul" illeszkedik ezáltal,

    a rendet pld. a ritmus teremtheti meg, ennek meg egyik alappillére az ismétlődés, de természetesen nem a monotonitás, ezért is van szerintem is igaza Wo Hu-nak, és sajnos azt kell írnom, hogy real_het ellenvéleménye szerintem ezért nem jó, bocsánat pálinkafőző-gpu-arc-zongorás-szintén-fraktál-mániás real_het, de szerintem ez nálad is egy "rossz" beidegződés, vagy az is lehet, hogy talán valamilyen szokás miatt "ragaszkodsz" hozzá,

    ezért is írjuk a {} jeleket oda-ahova, hogy megmaradjon a ritmus, nyilván persze itt vannak "iskolák", hogy a kezdő jelet hova is tegyük, de a lényeg az, hogy következetesek maradjunk, és egy adott rendszerben, pld. egy munkahelyen alkalmazkodjunk az ottani konvenciókhoz, és feleslegesen ne lázadozzunk emiatt, mert semmi értelme,
    persze valaki felvetheti azt, hogy nono, ez magasabb szinthez kötődik, azaz inkább az adott programozási nyelv "határozza meg", azaz, ha valahol nem tartják be a külső konvenciókat (a világméretű közösség azért nagyobb úr, mint a munkahelyi), akkor csak magukkal csesznek ki, és igenis váltani kell minél hamarabb, azaz "lázadni" kell, (vagy persze "meg lehet mutatni" a világnak, oszt vagy elbukunk vagy nem...)

    szerintem a kódszöveg átláthatóságot az is jellemzi, hogy bizonyos részeit "kitakarva" mit is gondolsz róla,
    az else-s példádon szerintem ezt jól megfigyelhetjük,

    ha az általad szörnyűnek tartott kódban "kitakarod" a feltételt, akkor annyit tudsz a kódról mondani, hogy bizonyos feltétel teljesülésekor egy adott értéket kapunk vissza, ha meg nem teljesül a feltétel, akkor meg egy másik értéket,

    mielőtt rávágnád, hogy működésileg a te általad javasolt is ugyanezt csinálja, emiatt meg ráhúzható arra is az előbbi magyarázat, arra én azt mondanám igen, mert a return miatt így fog működni az is, de pont ezt akarom mondani, hogy ekkor már egy újabb tudás szükségeltetett a kód értelmezéséhez, amit az agyadnak fel kellett dolgoznia, és bármennyire is azt gondolod, hogy ez semmiség, pont az ilyenek "vonják el a figyelmedet" szerintem,

    ha esetleg a feltétel teljesülése esetén végrehajtandót "takarnád ki", akkor meg nyilván az első esetben tudhatod, hogy ott is egy return-ek kell lennie (feltéve, hogy olyan a nyelv, hogy a visszatéréshez egyértelmű a return használata (kell vagy nem kell)), és, mint az előbbiből kiderült ehhez persze az agyadnak dolgoznia kell, de a másik, te általad preferált esetben meg valójában semmire nem tudsz ez esetben következtetni,

    a többi esetet már le sem írom, gondold végig őket,

    és akkor láthatod, hogy a szimmetria is egy fontos rendező elv, azaz szerintem az if/else szerkezet jobb megoldás,

    persze írhatod azt, hogy ez a "kitakarósdi" egy h.ly.s.g, semmi értelme, hiszen csak látom, felfogom azt ami az előbbi/következő x sorban van, gondold így, a te dolgod,

    "azt a lovat kell ütni, amelyik húz"
    Mutasd a teljes hozzászólást!
  • Az inkonzisztens break-elés switchekben legalább olyan ronda, mint az ifes megvalósítás :)
    Mutasd a teljes hozzászólást!
  • Many programming languages such as C/C++, C#, Java, and Pascal


    Ez nagy általánosságban igaz.
    Mutasd a teljes hozzászólást!
  • lemaradtam arról, hogy c/c++/c# fordító játszik csak :D
    azt hittem a téma általános, és nem programnyelv specifikus, my bad :)
    Mutasd a teljes hozzászólást!
  • return (field==HierarchyElementField.ID)?this.ID:(field==HierarchyElementField.ParentID)?this.ParentElementId:(field==HierarchyElementField.ElementType)?this.ElementType:(field==HierarchyElementField.Number1)?this.ExtraFields[0]:(field==HierarchyElementField.Number2)?this.ExtraFields[1]:0;
    muhhhahahahahaaa
    Mutasd a teljes hozzászólást!
  • "<-- ez nekem (és lehet csak nekem és az összes szakmailag alkalmatlan kóklernek ) if és else if és végül else..."

    Korekt a definíciód.

    Neketek ez valóban IF.

    Másoknak...
    http://www.codeproject.com/Articles/100473/Something-You-May-Not-Kno..


    De próbálj meg case-ba irni nem konstans értéket és rá fogsz jönni miböl adódhat eltérés.
    Mutasd a teljes hozzászólást!
  • if (field == HierarchyElementField.ID ) return this.ID; if (field == HierarchyElementField.ParentID ) return this.ParentElementId; if (field == HierarchyElementField.ElementType) return this.ElementType; if (field == HierarchyElementField.Number1 ) return this.ExtraFields[0]; if (field == HierarchyElementField.Number2 ) return this.ExtraFields[1];

    Szegeny if-et nem engeded átláthatónak látszani.  (Persze ettôl ez még redundansabb, mint a switch, de legalabb atlathato)
    Mutasd a teljes hozzászólást!
  • kicsit off de hülyére röhögtem magam a topik címén 
    Mutasd a teljes hozzászólást!
  • A switch haszna az if-else-szel szemben, hogy már első ránézésre látni fogod (meg az utánad következő fejlesztő is), hogy egyetlen változót értékelsz ki, annak az értéke alapján választasz egy lehetséges utat.
    Míg az if-else-nél amikor először rápillantasz, nem biztos hogy feltűnik, hogy mindig ugyanazt a változót vizsgálod.

    switch (field) { case HierarchyElementField.ID: return this.ID; case HierarchyElementField.ParentID: return this.ParentElementId; case HierarchyElementField.ElementType: return this.ElementType; case HierarchyElementField.Number1: return this.ExtraFields[0]; case HierarchyElementField.Number2: return this.ExtraFields[1]; }


    vs.

    if (field == HierarchyElementField.ID) { return this.ID; } if (field == HierarchyElementField.ParentID) { return this.ParentElementId; } if (field == HierarchyElementField.ElementType) { return this.ElementType; } if (field == HierarchyElementField.Number1) { return this.ExtraFields[0]; } if (field == HierarchyElementField.Number2) { return this.ExtraFields[1]; }


    Szerinted melyik átláthatóbb? Utóbbinak mi az előnye az előbbivel szemben?
    (A return miatt nem írtam else-eket, azzal még nehezebb lenne rápillantva látni, miről is van szó.)
    Mutasd a teljes hozzászólást!
  • szbzs2: egy vitaindító fórumban személyeskedsz, gratulálok!!! - de amúgy ne gondold személyes támadásnak amit írtam, nem célom bántani sem  téged sem a nézőpontodat... :) más: copy&paste én a sor végére írom a  {-t a többi meg jöt magától, lehet azért nem foglalkoztam vele, mert hittem(reméltem), hogy a lényeg így is átmegy...

    KisJ:
    az általam ismert program/script nyelvekben:
    ha minden!!! case break-ben végződik nekem az if és else if... (mármint egy az egyben átírható ezért ott az if else if.et használnám és csak a lentebb írt példában nyúlnék a swich-hez - az ilyen szintű megkülönböztetés bár lehet önkényes, de számomra növeli az olvashatóságot)

    a swich-es példámat azért írtam hogy mutassak egy esetet ahol van értelme a swich-nek if helyett...

    de ha:
    swich a {
    case 1:
    log("1");
    break;
    case 2:
    log("2");
    break;
    default:
    log("def");
    }

    <-- ez nekem (és lehet csak nekem és az összes szakmailag alkalmatlan kóklernek ) if és else if és végül else...

    szerk: amúgy meg @-om az egészbe el se hiszem hogy még mindig ott tartunk hogy: "van az általános etalon nézőpont: ami az enyém és mindenki más idióta retardált szakmailag alkalmatlan barom aki nem így gondolja..." és még én érezzem szárul magamat, hogy valakit "provokálok" :D 

    szerk2: ja amúgy meg ha provokálásnak vesz bárki is 10sor programkódot hááát....
    Mutasd a teljes hozzászólást!
  • "az valóban egy if else if stb..."

    Ez butaság.
    De amúgy érdekelne, hogy mire alapozod ezt a kijelentésedet...
    Javaslom az állapotgép, ugrótábla kifejezéseknek utánanézni.
    Mutasd a teljes hozzászólást!
  • Az if igenis káros, tessék elhinni!
    The-Percent-Conversion


    Nem tudom mi a bajod azzal a kóddal.
    Én (pl. itt a prog.hu-n) válaszként is láttam már ilyen logikát:
    if x=1 then msgbox "egy" end if if x=2 then msgbox "kettő" end if if x=3 then msgbox "három" end if
    Mutasd a teljes hozzászólást!
  • te most provokálod az embert?

    a continue neked nem szörnyűség? (főleg contiune-nak írva),

    egyszer is utánagondoltál-e, vagy megnézted-e, hogy az általad írt kódból mi generálódik? lásd pld. az else-s példádat, szerinted miért nem pont az a szörnyű, amit te jónak találsz? (persze szerintem sem szép ahogyan írtad, mert felesleges az utasításblokk, de...)

    a switch/case-es felvetésedre: azt gondolom tudod, hogy egy sor nyelvben nem lehet(ett) a case-ben csak fordítási időben kiértékelhető kifejezés, szerinted, ha a "motorháztető alatt" ugyanaz lenne, mint az if/else-nél, akkor miért lenne ez a megkötés?

    nem akarlak bántani, de eléggé következetlen vagy, például a break-et teljesen "értelmetlenül" indentálod a case alá, a C#-os példádban is - gondolom nem csak szerintem - hasonlóan kiismerhetetlen, hogy a {-t mikor rakod új sorba, és mikor a végére, a for blokkjának lezáróját meg miért oda húzod be, az else-snél mikor hagysz szóközt és mikor nem, stb.

    szerinted, aki ilyen kódszövegeket ír, amiket te most ide rittyentettél, annak mennyire lehet adni a véleményére ebben a témában, legalábbis egy kódszöveg átláthatóságát tekintve?
    Mutasd a teljes hozzászólást!
  • ja és mgé egy gondolat

    az a swich nem swich amiben minden case-ben break van...
    az valóban egy if else if stb...

    a swich el el lehet kerülni if ismétléseket...

    int a = float(rand()*5+1); swich a { case 1: log("1"); case 2: log("2"); break; case 3: log("3"); break; case 5: //<--- öt! log("5"); case 4: log("4"); break; default: log("def"); }

    ez ugyan az mint 

    int a = float(rand()*5+1); if(a == 1){ log("1"); log("2"); }else if(a == 2){ log("2"); }else if(a == 3){ log("3"); }else if(a == 5){ log("5"); log("4"); }else if(a == 4){ log("4"); } else { log("def"); }
    és akkor most cseréljük ki a log("4")-t  :)
    Mutasd a teljes hozzászólást!
  • erről talán nem eset szó de szerintem nem az if használata szokot gondolt okozna hanem az ELSE !!!

    legalábbis a legtöbb programban nem egyszer találkozok ilyen szörnyűséggel:

    function foo($i) { if($i == 1) { return "egy vagyok"; } else { return "nem vagyok egy"; } }
    az esle felesleges így ugyan az történik:

    function foo($i) { if($i == 1) { return "egy vagyok"; } return "nem vagyok egy"; }


    ez alapján (nem vagyok jó c#ban ):

    public void DoFizzBuzz() { for (int i = 1; i <= 100; i++) { bool fizz = i % 3 == 0; bool buzz = i % 5 == 0; if (fizz && buzz) { Console.WriteLine ("FizzBuzz"); contiune; } if (fizz) { Console.WriteLine ("Fizz"); contiune; } if (buzz) { Console.WriteLine ("Buzz"); contiune; } Console.WriteLine (i); } }
    véleményem szerint így a kód jobban olvashatóbb (nekem :P)...  ha meg a teljesítményen van a lényeg nagyon sok szép kreatív megoldást írták előttem :)
    Mutasd a teljes hozzászólást!
  • Itt nem az 'if'-ek léáte vagy megvalósítása a kérdéses.

    Az alap elmélet "szekvencia, iteráció, szelekció" egyértelművé teszi, hogy az 'if' szükséges elem, a megvalósítás technikája (pl. case) másodlagos, szintaxis cukor. Ezek "csak" megkönnyítik és biztonságosabbá teszik a munkát.

    A kérdés "veleje", hogy el kell tudni döntenie egy profinak, hogy mikor kell más utat keresni (megfelelőbb algoritmus, programozási technika) és mikor kell az if-et használni (és akkor is mennyire szegmentálni a kódot, pl. külső függvényekbe kiszervezéssel).

    Mutasd a teljes hozzászólást!
  • Lehet belőle ugrótábla is bizonyos esetekben, és olyankor assembly szinten se lesz benne "if" (feltételes ugrás), csak indirekt ugrás. Az indirekt ugrás már inkább valami "számított GOTO"-nak felelne meg, ha feltétlen magas szintű megfelelőt keresünk neki.
    Mutasd a teljes hozzászólást!
  • egy switch/case-ből mi is lesz a bugyrok mélyén?


    A bugyrok mélyén, Assembly szinten lényegében ugyanaz lesz mintha if+goto-t használnánk. JNZ, JNE és a többi jump utasítás. Szóval a legtisztább már rögtön Goto-t használni mindenhol
    Mutasd a teljes hozzászólást!
  • kicsit "hergeljem" a nagyérdeműt: mi is az az if?

    esetszétválasztás?

    egy explicit és implicit (mondjuk aritmetikai) módszer miben különbözik egymástól?

    C-ben mondjuk egy switch/case-ből mi is lesz a bugyrok mélyén?

    persze én is azt mondom, hogy a "jó programszöveg" könnyen átlátható (is), és egy aritmetikait (mondjuk tömbös indexelést) gyorsabban felfogok, mint az "if"-ek sokaságát, főleg, ha jól egymásba is vannak ágyazva, hiába az indentálás, meg "biztonságosabbnak" is tartom az előbbit, de ... (végeredményben "ugyanarról" van szó, vagyis nem, mert minket a kódszöveg érdekel "elsősorban"),

    a ternary operátort is jobban szeretem, mint az if-et, ez valami "perverzió" lehet nálam (is)?
    Mutasd a teljes hozzászólást!
  • JS:

    for(var i=1;i<=100;i++){var f=!(i%3),b=!i%5);console.log(f&&b?"FizzBuzz":f?"Fizz":b?"Buzz":i)}
    Mutasd a teljes hozzászólást!
  • "a szorgalmas tudatlanok"


    Hát igen, a politikából/társadalomtudományok világából hallottuk már a megfelelőjét.

    "Ha a butaság szorgalommal párosul..."

    Mondjuk a világot (nem én találtam ki, de tetszik) a lusta emberek vitték és viszik előre.

    Már a kereket is egy lusta ember találta ki, aki utált cipekedni.

    Sajnos ez úgy csapódik le nálam, hogy amint "megfejtettem" egy problémát, elvesztem az érdeklődést, és onnan keservesebb a munka.

    Mutasd a teljes hozzászólást!
  • Nem tudom, nálad mi számít rendes nyelvnek és illegális dolognak, de pl. Pythonban csont ugyanezen az elven meg lehet írni a feladatot:
    msg = ['{0}', 'Fizz', 'Buzz', 'FizzBuzz'] for i in range(1, 101): print msg[((i%3)==0) + 2*((i%5)==0)].format(i)

    De Javában is egyedül az implicit boolean->int konverzió az illegális, azt viszont kellően pihent módszerekkel körbe lehet hackelni:
    String[] msg = {"%d\n", "Fizz\n", "Buzz\n", "FizzBuzz\n"}; for (int i=1; i<=100; i++) { System.out.format(msg[3 - Math.min(i%3, 1) - 2*Math.min(i%5, 1)], i); }
    Mutasd a teljes hozzászólást!
  • ilyesmire gondoltam. ezek a megoldások amúgy már-már nem is pistikés tákolások, hanem teljesen nulla hozzáértésről tanúskodnak. szóval ejha, ez a sok if meglehetősen gány - majdnem a wtf oldalhoz hasonlatos már. az elemtöltöttség kijelző kódon például sokáig vinnyogtam
    amúgy a te kódod - szemben az egyel korábbi megoldással pont rávilágít egy korábbi nagy dilemmára: ram vs cpu. utóbbi időben mindkettőből annyira sok van, hogy el is felejtjük ennek jelentőségét. teszt során, amikor egyszer lefut a kód akkor nem érződik sem lassúnak, sem nagy memóriaigényűnek, és még el is végzi amit kell - így hát bekerül éles környezetbe. na ott aztán a többi társával együtt meghozzák - a manapság éppen átélt - gigabyte méretű szoftverek világát.
    és még egy dologra nagyon jól rávilágítottál: szerintem a jó programozó szeret programozni, de emellett végtelenül lusta. kétszer ugyanazt, vagy 90%-ban hasonló kódsort nem gépel be.
    tehát talán kimondhatjuk hogy nem az if-ek a világ ellenségei, hanem a szorgalmas tudatlanok. őket tiltsuk be.
    L
    Mutasd a teljes hozzászólást!
  • nekem ez tetszik legjobban:
    char *msg[] = {"%i\n", "Fizz\n", "Buzz\n", "FizzBuzz\n"}; for(int i=1; i<=100; i++) printf(msg[((i%3)==0)+2*((i%5)==0)], i);
    tudom, hogy "rendes" nyelveken nem lehet megcsinálni, tele van illegális dolgokkal, pont ez benne a szép
    És nincs benne if
    Mutasd a teljes hozzászólást!
  • Fixing Delphi - The Daily WTF
    Itt nem csak az if a káros, hanem a szoveges muveletekkel vegzett aritmetika.

    Inkabb a szorgalom a káros, amikor az a hu1yeseggel társul.

    (de rég olvastam dailyWtf-et, most lesz mit bepotolni)
    Mutasd a teljes hozzászólást!
  • "ezúton újra megkérném a témaindítót hogy mutasson olyan kódrészletet ami láttán azt mondjuk hogy "ejha, ez a sok if tényleg pistikés megoldás""


    Én írok egy példát.
    Valós, gyakorlati (sokszor használtam annó) C/C++ esetén.

    Most pszeudo kódot írok, nincs kedvem régi forrásokat átturkálni, szintaxisra ügyelni.

    A feladat: karakter konverzió.

    Tipikus megoldás 1 (nagyon pistikés):
    if (c == 'á') c = 'a'; else if (c == 'é') c = 'e' ....

    Tipikus megoldás 2 (még mindig kicsit pistikés):
    Felvesz két stringet és azt használja mint adatot.
    char * source = "áé...."; char * target = 'ae...."; while (char * in = inStr; (*in); in++) { int pos = pos(source, *in); // hanyadik karakteren találja meg a source stringben if (pos >= 0) { *in = *(target + pos); } }

    Aztán az én általam használt megoldás.
    Felvesz egy konverziós táblát, annak módosítja a megfelelő karaktereit és azt használja.
    // ezt ugye egyszer megcsinálni valahol char konv[256]; for (int i = 0; i < 256; i++) { konv[i] = i; } konv['é'] = 'e'; konv['á'] = 'a'; // innen meg az ezerszer futó kód while (char * in = inStr; (*in); in++) { *in = konv[*in]; }

    Vagyis mégegyszer: adatszerkezet+algoritmus-->program (=megoldás)

    Gyorsabb, átláthatóbb, ésszerűbb és aztán ugye az olyan 'járulékos' hatások, hogy másként kell konvertálni, több konverziós táblát lehessen használni stb.
    Ha nem az előbbi 'frappáns' megoldást használjuk, akkor beindul az if-hell

    Megjegyzem ez nem nagy találmány, sokan használják a karakterrel indexelést, kapásból pl. a c lib, amikor pl. isChar, isNum stb. megoldást ad.
    Én annó a BTrieve adatkezelő libből 'tanultam el', ott volt valami ilyen az egyéni rendezési szempontok definíciójához.
    Csak átadtál egy konverziós táblát, hogy milyen karaktersorrend szerint rendezzen.
    Mutasd a teljes hozzászólást!
abcd