Was ist besser? switch oder if ?

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Guten Morgen Jungs und Mädels.


    Ich hätte mal eine etwas allgemeinere Frage vorallem an die PAWN-Experten unter uns.
    Mich würde interessieren ob es ein großartigen unterschied zwischen einem switch und einer if Anweisung?


    z.B
    Was währe besser?


    if (PlayerInfo[playerid][pMember] == 1 || PlayerInfo[playerid][pLeader] == 1)// LS Police spawn
    {
    SetPlayerToTeamColor(playerid);
    GivePlayerWeapons(playerid);
    rand = random(sizeof(gCopPlayerSpawns));
    SetPlayerPos(playerid, gCopPlayerSpawns[rand][0], gCopPlayerSpawns[rand][1], gCopPlayerSpawns[rand][2]); // Warp the player
    SetPlayerFacingAngle(playerid,random(360));
    SetPlayerInterior(playerid,3);
    PlayerInfo[playerid][pInt] = 0;
    SetPlayerSkin(playerid,PlayerInfo[playerid][pChar]);
    return 1;
    }


    oder


    switch(PlayerInfo[playerid][pMember])
    {
    case 1:
    {
    SetPlayerToTeamColor(playerid);
    GivePlayerWeapons(playerid);
    rand = random(sizeof(gCopPlayerSpawns));
    SetPlayerPos(playerid, gCopPlayerSpawns[rand][0], gCopPlayerSpawns[rand][1], gCopPlayerSpawns[rand][2]); // Warp the player
    SetPlayerFacingAngle(playerid,random(360));
    SetPlayerInterior(playerid,3);
    PlayerInfo[playerid][pInt] = 0;
    SetPlayerSkin(playerid,PlayerInfo[playerid][pChar]);
    return 1;
    }
    default:
    {
    switch(PlayerInfo[playerid][pLeader])
    {
    case 1:
    {
    SetPlayerToTeamColor(playerid);
    GivePlayerWeapons(playerid);
    rand = random(sizeof(gCopPlayerSpawns));
    SetPlayerPos(playerid, gCopPlayerSpawns[rand][0], gCopPlayerSpawns[rand][1], gCopPlayerSpawns[rand][2]); // Warp the player
    SetPlayerFacingAngle(playerid,random(360));
    SetPlayerInterior(playerid,3);
    PlayerInfo[playerid][pInt] = 0;
    SetPlayerSkin(playerid,PlayerInfo[playerid][pChar]);
    return 1;
    }
    }
    }
    }


    Abgesehen davon das die 2te Methode mehr Zeilen in Anspruch nimmt
    Ich habe mir Gedanken gemacht und bin der Auffassung das die 2te Methode mit switch besser währe
    den da macht er doch nur 1 Abfrage in dem "PlayerInfo[playerid][pMember]"
    und spring dann in den Case


    bei dem Beispiel währe natürlich die erste Methode einfacher
    aber wenn man es sieht auf 24 Abfragen
    if(member == 1 || leader == 1 )
    ...
    ...
    ..
    if(member == 24 || leader == 24)
    ..


    dann ist doch ein switch obtimaler oder nicht?
    Ich hoffe ich habe die Frage deutlich und verständlich ausgedrückt .


    Und würde mich über zahlreiche Meinungen freuen.


    Mit freundlichstem Gruß
    GeForce

  • ich habe von if-Abfragen besseres gehört^^ mal sehen was profis wie kaliber oder blackace oder mysteriöser unbekannter oder who ever dazu sagen^^

  • Ich denke das kommt auf die Anwendung an


    Wenn du nur eine Abfrage hast z.B
    if(pInfo[playerid][Level] >= 5)
    {
    ...
    }
    klappt es mit if wunderbar
    aber wenn du 20 oder mehr Möglichkeiten/Abfragen hast ist switch denke ich besser
    z.B
    switch(pInfo[playerid][checkpoint])
    {
    case 0:
    case 1:
    .
    .
    .
    }
    besser als
    if(pInfo[playerid][checkpoint] == 1)
    {


    }
    ...
    else if(pInfo[playerid][checkpoint] == 2)
    {


    }
    .
    .
    .


    Ich hoffe es ist halbwegs verständlich :D
    Hatte außerdem lange nichts mehr mit Pawn am Hut

  • Deutlich an Zeilen würdest du alleine sparen, wenn du die Member-Variable eines Leaders ebenfalls auf 1 stellst.
    D.h. beim LSPD-Leader trifft auch die Abfrage ''PlayerInfo[playerid][pMember] == 1'' zu.
    So könntest du beim Spawn die ganzen Leaderabfragen weglassen, dann wäre ein Switch mit Sicherheit einfacher. Beim Spawn macht es ja keinen Unterschied ob derjenige Leader oder Member ist.


    Ob jemand Leader ist brauchst du ja eig. nur bei den Leader-Befehlen abfragen...und da würde die Member-Abfrage keinen Sinn machen.

  • Also generell benutzt man ein Switch wenn es mehrere Fallunterscheidungen gibt. So kenne ich aus meinem Beruf und so wird es auch angewendet. Ich empfinde ein switch auch besser wartbar für die Arbeiten in der Zukunft.

    Zitat

    Allwissend bin ich nicht, doch viel ist mir bewusst.


    Johann Wolfgang von Goethe

  • Bringt aber nichts, wenn er Member nicht auf Fraktions Variable setzt. Dazu könnte er einfach auch ein Stock/Public machen und dort eine Fraktion abfrage erstellen.



    stock/Public IsPlayerInFraktion(playerid, frakid)
    {
    if(getmemberabfrage... == frakid || getleaderabfrage == frakid) return 1;
    }

  • hier wird alles recht gut erklärt
    http://wiki.sa-mp.com/wiki/Control_Structures#switch


    [quote]An important thing to note here is the different ways in which ifs and switches are processed:


    switch (SomeFunction())
    {
    case 1: {}
    case 2: {}
    case 3: {}
    }


    That will call SomeFunction() ONCE and compare it's result 3 times.


    if (SomeFunction() == 1) {}
    else if (SomeFunction() == 2) {}
    else if (SomeFunction() == 3) {}


    That will call SomeFunction() three times, which is very inefficient

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • ich finde switch besser, denn das ist schneller und sieht professioneller aus (by BlackAce).
    Ausserdem finde ich, sieht der auch ordentlicher aus ;)
    Hier zB ein kleiner Vergleich if/switch (wegen Ordentlichkeit):


    Spoiler anzeigen

    ///////////////////// IF-Abfragen
    if(dingens == 1 || dingens == 2 || dingens == 3)
    {
    SendClientMessage(playerid,Farbe_xD,"Du wurdest gebannt. (Fake)");
    Kick(playerid);
    return 1;
    }
    else if(dingens == 4 || dingens == 5 || dingens == 6)
    {
    SendClientMessage(i, Farbe_xD, "Falsche Antwort mein Lieber ;)");
    Ban(playerid);
    return 1;
    }
    else if(dingens == 7 || dingens == 8 || dingens == 9)
    {
    SendClientMessage(playerid,Color_Grey,"Richtige Antwort.");
    return 1;
    }

    Spoiler anzeigen
    ///////////////////// Switch/Case
    switch(dingens)
    {
    case 1..3: {
    SendClientMessage(playerid,Farbe_xD,"Du wurdest gebannt. (Fake)");
    Kick(playerid);
    return 1;
    }
    case 4..5: {
    SendClientMessage(i, Farbe_xD, "Falsche Antwort mein Lieber ;)");
    Ban(playerid);
    return 1;
    }
    case 6..9: {
    SendClientMessage(playerid,Color_Grey,"Richtige Antwort.");
    return 1;
    }
    }

  • switch hat das Problem,
    da es sehr statisch ist und keinerlei flexiblität bietet,
    deswegen ist es auch relativ schnell.


    Es wirkt ein wenig Professioneller, ist es aber nicht umbedingt ^^
    Man muss immer einen festen bezug haben, deswegen hat man bei den Dialogen nen recht guten Vorteil, wenn man switch case nutzt ;)

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Blackace also wenn man z.B. die Adminränge durchgeht kann man doch auch besser switch nutzen oder nicht? Dann wäre nämlich case 0: normaler Member und 1 halt Admin usw. Da hat man den festen bezug.


    Das geht nicht, aber wenn man z.B. mit wechselnden IDs arbeitet,
    Beispiel TextDraws

    public OnPlayerClickTextDraw(Text:clickedid)
    {
    switch(_:clickid)
    {
    case Textdraw1: //tu was
    case Textdraw2: //tu was
    }
    return;
    }
    Hier hast du keinen besten Bezuge, daher ist das da unbrauchbar ;)
    machst du das aber so


    public OnPlayerClickTextDraw(Text:clickedid)
    {
    switch(_:clickid)
    {
    case 1: //tu was
    case 2: //tu was
    }
    return;
    }
    Funktionert das weil du ihm so vorgibst, welche ID er zu prüfen hat.
    Im allgemeinen Gebrauch ist aber "Lösung" ziehmlich schlecht,
    da sich die IDs auch mal ändern können.
    Da bleibt also nur das gute alte if ;)

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Also sowas z.B. auf switch umzuschreiben wäre nicht so gut ;)



    if(playerid == 0) {
    //Funktion
    }
    else if(pID == 0) {
    //Funktion
    }
    else if(xID == 0) {
    //Funktion
    }


    Weil es keinen festen Bezug eben hat. Weil es heißt ja "switch(variable)"
    Dann bezieht sich das switch nur auf diese eine variable, weshalb es beim
    obrigen Beispiel schwachsinnig ist, da es 3 verschiedene Variablen sind.


    Also ist switch nicht immer sinnvoll.




    @BlackAce:
    Das geht doch ^^
    Was er meint sind die Adminränge, also sowas:

    Spoiler anzeigen
    stock RangName(playerid)
    {
    new lol[159];
    switch(PlayerInfo[playerid][pAdmin])
    {
    case 0:{lol="";}
    case 1:{lol="Probe-Supporter";}
    case 2:{lol="Supporter";}
    case 3:{lol="Moderator";}
    case 4:{lol="Super Moderator";}
    case 5:{lol="Administrator";}
    case 6:{lol="Serverleitung";}
    }
    return lol;
    }

  • Blackace wieso soll es nicht gehen?
    So ist es doch richtig und funktioniert. (Mal ein Beispiel aus meinem Script).


    switch (pInfo[playerid][pAdmin])
    {
    case 0:
    {
    format(str, sizeof(str), "[%d:%d:%02d] %s: %s", Stunde, Minute, Sekunde, Name, text);
    }
    case 1:
    {
    format(str, sizeof(str), "[%d:%d:%02d] Supporter %s: %s", Stunde, Minute, Sekunde, Name, text);
    }
    case 2:
    {
    format(str, sizeof(str), "[%d:%d:%02d] Admin %s: %s", Stunde, Minute, Sekunde, Name, text);
    }
    case 3:
    {
    format(str, sizeof(str), "[%d:%d:%02d] Moderator %s: %s", Stunde, Minute, Sekunde, Name, text);
    }
    case 4:
    {
    format(str, sizeof(str), "[%d:%d:%02d] Serverleiter %s: %s", Stunde, Minute, Sekunde, Name, text);
    }
    }

  • Also sowas z.B. auf switch umzuschreiben wäre nicht so gut ;)


    was du da hast, wäre nicht möglich, zumindest in dem Kontext.


    Nimmt man das aus dem Kontext ist das wiederrum möglich ^^


    Acrio
    So wie du es machst,
    hab ich doch gesagt geht es.
    Es wäre nur bei veränderlichen Dingen, nicht möglich.
    Siehe mein Beispiel ;)

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski


  • Möglich wäre das schon :rolleyes:
    Aber das wäre total unnötig, das zu machen:


    switch(playerid)
    {
    case 0:{
    //Funktion
    }
    }
    switch(pID)
    {
    case 0:{
    //Funktion
    }
    }
    switch(xID)
    {
    case 0:{
    //Funktion
    }
    }