if... else
Een vraagje over vergelijkingen. Wat zet je eigenlijk in je "if" en wat in je "else". Ik heb ooit geleerd dat je in de "if" datgene zet wat de standaardsituatie is en in de "else" datgene wat de uitzondering is. Dan krijg je dus:
Code (php)
1
2
3
4
5
2
3
4
5
if ( standaardsituatie ) {
// doe hetgene dat standaard is
} else {
// doe de uitzondering
}
// doe hetgene dat standaard is
} else {
// doe de uitzondering
}
Nu vraag ik me 2 dingen af:
1) Is het inderdaad de juiste manier om de standaardsituatie in de "if" te zetten en de uitzonderingssituatie in de "else"?
2) Wanneer spreek je eigenlijk over een standaardsituatie? Stel dat je een formulier POST dan zet je meestal de POST-controle en formulierafhandeling in de "if". En in de "else" toon je het formulier. Maaaar... is de standaardsituatie eigenlijk niet het tonen van het formulier in plaats van de formulierafhandeling? Met andere woorden zou het niet moeten zijn:
Hoe kijken jullie hier tegenaan? Ik ben erg benieuwd naar jullie reacties.
Wat dat betreft is dan if ( !formulier gepost ) 'trager' dan if ( formulier gepost ), omdat er nog 1 extra operatie gedaan wordt...
Maar dat is allemaal theorie en daar hoef je je in dit geval niet mee bezig te houden (tenzij je miljoenen if-jes doorloopt...)
Zelf vind ik het prettig om het langste blok (de meeste regels code) in de if te doen en de kortere in de else.
Waarom is if ( !formulier gepost ) 'trager' dan if ( formulier gepost )?
Het gaat mij totaal niet om de snelheidswinst. Dat is niet waarom ik de vraag stel. Het gaat mij om de logica. Wat zet je waar?
Jij kiest dus er voor om het langste deel in de if te zetten. Ik heb zelf ooit gehoord dat je de standaardsituatie in de if moet zetten, dus ik ben benieuwd hoe anderen daar tegenaan kijken. Persoonlijk denk ik niet dat de lengte van je code doorslaggevend zou moeten zijn.
Toevoeging op 27/12/2011 09:47:14:
Ozzie PHP op 27/12/2011 09:42:20:
Waarom is if ( !formulier gepost ) 'trager' dan if ( formulier gepost )?
Omdat de NOT (uitroepteken) toch een extra handeling is voor de processor.
Je geeft zelf al aan: wat is standaard? Een formulier tonen met foutweergave kan in jouw voorbeeld niet: het formulier is verzonden, dus de else. Formulier met foutmelding kan dan nooit getoond worden...
if (formulier gepost) else (toon formulier)
Net als Mark al zegt zul je er vrijwel niets van merken en hanteer je wat je zelf het meest prettig vindt.
Daarnaast moet je voor een controlestructuur met if eigenlijk altijd (if...else) of (if...elsif...else) gebruiken ipv enkel een 'losse' if. Maar dan vraag ik me altijd af wat je moet doen met een knop uitloggen.
if (uitloggen) else (haha je blijft lekker ingelogd)
@Obelix: dit was puur een voorbeeldje. Het gaat mij om de achterliggende gedachte.
@Wolf: volgens mij kun je toch ook losse if's gebruiken? Waarom zou dat niet kunnen? Bijvoorbeeld:
if($admin==true) {
// toon extra edit-knopje
}
Zou toch gewoon kunnen?
Ik had twee variabelen met uren en minuten. Die wilde ik laten zien op het scherm in een AM/PM notatie, terwijl de uren in 0-23 gegeven waren. Hierbij zijn er twee uitzonderingen die je moet afhandelen 0:00 en 12:00. De standaard zegt dan om niet 0:00 AM te gebruiken maar "0:00 midnight" en "0:00 noon". Dit zijn dus uitzonderingen, maar ik vang die als eerste af zodat mijn if/else als volgt wordt:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
if (uren == 0 && minuten == 0){
//midnight
} else if (uren == 12 && minuten == 0){
//noon
} else if (uren < 12){
//AM
} else if (uren >= 12){
//PM
}
//midnight
} else if (uren == 12 && minuten == 0){
//noon
} else if (uren < 12){
//AM
} else if (uren >= 12){
//PM
}
Dus niet de standaard eerst, maar de uitzondering eerst. Als je in dit geval de standaard eerst neemt wordt je code alleen maar complexer.
Situatie is dus bepalend voor mij, niet een "standaard".
Ik gebruik zelf ook losse if's. Dat gaf ik ook aan in mijn verhaal. Zolang alles klopt en niet merkbaar is is het m.i. oké.
Ozzie PHP op 27/12/2011 10:28:45:
Dat kan ook ja.
Ik zelf doe het gewoon heel willekeurig. Ik denk er niet bij na. Ik schrijf als eerst wat mijn bedoeling was met het stukje code en daarna wat het geval is als het niet zo is.
Ozzie PHP:
En waarom is NOT een extra handeling voor de processor? Hij moet toch altijd evalueren of iets WEL of NIET waar is? Dat is toch niet per definitie meer handeling lijkt me? Is toch gewoon evalueren of het 0 of 1 is?
Stel dat we dit hebben:
Dan gaat de server eerst $_SERVER['REQUEST_METHOD'] == 'POST' uitvoeren. Stel het formulier is gepost, dan komt hier true uit. Vervolgens wordt !true uitgevoerd en dat wordt false en dan gaan we naar de else.
Als we de NOT weg halen wordt er eerst $_SERVER['REQUEST_METHOD'] == 'POST' uitgevoerd. Hier komt true uit en PHP voert de if code uit.
Het omzetten van true in false is dus een extra handeling en die kost -zoals Mark al zei- een paar nanoseconde minder tijd.
Wouter J op 27/12/2011 10:42:59:
Ik vraag me altijd af waarom je je hier zo druk over kunt maken. Natuurlijk, je moet altijd heel goed nadenken bij wat je nou precies voor code schrijft. Maar zo erg nadenken...
Ik zelf doe het gewoon heel willekeurig. Ik denk er niet bij na. Ik schrijf als eerst wat mijn bedoeling was met het stukje code en daarna wat het geval is als het niet zo is.
Ik zelf doe het gewoon heel willekeurig. Ik denk er niet bij na. Ik schrijf als eerst wat mijn bedoeling was met het stukje code en daarna wat het geval is als het niet zo is.
Ik maak me er niet druk om ;) Ik vraag me gewoon af of er een bepaalde "regel" geldt voor het schrijven van een if-else vergelijking. Net zoals op een gelijkwaardige kruising rechts voorrang heeft, zo vraag ik me af of je een if-else vergelijking op een bepaalde manier "moet" invullen.
Wouter J op 27/12/2011 10:42:59:
Stel dat we dit hebben:
Dan gaat de server eerst $_SERVER['REQUEST_METHOD'] == 'POST' uitvoeren. Stel het formulier is gepost, dan komt hier true uit. Vervolgens wordt !true uitgevoerd en dat wordt false en dan gaan we naar de else.
Als we de NOT weg halen wordt er eerst $_SERVER['REQUEST_METHOD'] == 'POST' uitgevoerd. Hier komt true uit en PHP voert de if code uit.
Het omzetten van true in false is dus een extra handeling en die kost -zoals Mark al zei- een paar nanoseconde minder tijd.
Dan gaat de server eerst $_SERVER['REQUEST_METHOD'] == 'POST' uitvoeren. Stel het formulier is gepost, dan komt hier true uit. Vervolgens wordt !true uitgevoerd en dat wordt false en dan gaan we naar de else.
Als we de NOT weg halen wordt er eerst $_SERVER['REQUEST_METHOD'] == 'POST' uitgevoerd. Hier komt true uit en PHP voert de if code uit.
Het omzetten van true in false is dus een extra handeling en die kost -zoals Mark al zei- een paar nanoseconde minder tijd.
Ah, oké... ik snap 'm :)
Gewijzigd op 27/12/2011 10:51:28 door Ozzie PHP
Ozzie PHP op 27/12/2011 09:58:11:
@Obelix: dit was puur een voorbeeldje. Het gaat mij om de achterliggende gedachte.
Maar ik denk dat je daarmee al laat zien dat de if/else volgorde afhankelijk is van een situatie en niet gebaseerd ia op regels.
Ozzie PHP op 27/12/2011 09:58:11:
@SanThe: op welke manier ben je het met Mark eens? Dat je het langste deel in de if zet? En waarom is NOT een extra handeling voor de processor? Hij moet toch altijd evalueren of iets WEL of NIET waar is? Dat is toch niet per definitie meer handeling lijkt me? Is toch gewoon evalueren of het 0 of 1 is?
Zoals Wouter al netjes met een voorbeeld heeft uitgelegd: Normaal geeft een if true of false. Met de ! ervoor wordt dat NOT true of NOT false en dat is net een (zeer snel trouwens) stapje extra voor de processor.
Ah oké, is dan de conclusie dat we in de "if" geen negatieve vergelijkingen moeten gebruiken?
Dat lijkt me weer overdreven. Ik denk dat de conclussie is dat het een stap meer is voor de processor. Niets meer niets minder. In verreweg de meeste scripts die jij zult schrijven zal je nooit een dusdanig performance probleem krijgen dat je zelfs dit soort stapjes nog moet zien te voorkomen.
okeej, maar de conclusie is dan dus eigenlijk dat er geen regels voor zijn en dat het afhankelijk van de situatie is?
Ik zou er niet wakker van liggen als ik weet dat ik ergens een NOT in een script hebt gebruikt.
Ook is het dat je in de if geen negatieve vergelijking mag gebruiken niet helemaal juist. Want hoe wil je bijv. dit doen:
Code (php)
Er is gewoon geen regel. Doe het zo dat jij je lekker erbij voelt en dat je het script begrijpt.
Gewijzigd op 27/12/2011 11:43:39 door Wouter J
Ozzie PHP op 27/12/2011 11:42:08:
okeej, maar de conclusie is dan dus eigenlijk dat er geen regels voor zijn en dat het afhankelijk van de situatie is?
Vanuit php zelf? - nee.
Vanuit de programmeurs community? - nee
Vanuit je werkgever? - misschien wel...
Werkelijk, als er een regel is voor zaken als dit, dan is het dat je je moet houden aan de conventies die gelden voor de applicatie die je aan het ontwikkelen bent. Voor if/else structuren en het gebruik van ! heb ik dat soort conventies nog nooit gezien, maar er zullen er ongetwijfeld wel een paar zijn. Als je voor je zelf iets aan het ontwikkelen bent zou ik er me niet druk over maken.
Overigens, ik vind het op zich wel goede vragen. Het feit dat je nadenkt over standaarden, conventies en hoe je bepaalde taken het snelst danwel meest efficient kunt uitvoeren is niets mis mee.
Oké, thanks voor jullie reacties. Ik ben weer een stukje wijzer :)