Bekijk het eens zo...
Uit Yapf
Veel problemen kun je oplossen of voorkomen door het probleem anders te benaderen. Hier volgen een paar van die dingen waarvan je na een paar uur debuggen denkt duh...
Inhoud |
Algemeen
- Murphy zegt: alles wat fout kan gaan zal misgaan op het meest vervelende moment.
Als je weet dat iets kan gebeuren, dek jezelf er dan ook tegen in. Denk niet dat het niet zal gebeuren want alles wat kan gebeuren zal gebeuren. Het kan soms even duren, maar het zal. Al bouw je maar een suffe foutmelding in die de boel stopzet voordat het fout gaat, maar doe er iets aan!
- De kans dat iets gebeurt is zo klein...
Het gaat niet om wat de kans is dat het gebeurt maar om wat de gevolgen zijn wanneer het gebeurt. De kans dat je een auto ongeluk krijgt is vrij klein, maar toch doe je een gordel om want je weet dat je bij een aanrijding zonder gordel met je kop door de voorruit zult gaan. Parachutisten hebben twee parachutes, niet omdat de eerste zovaak faalt maar omdat ze het zonder parachute niet overleven.
Als jouw applicatie het risico loopt dat een op de tienduizend klanten een foute factuur krijgen dan kun je er vergif op innemen dat dat zal gebeuren bij een hele grote factuur van een hele lastige klant. De paar minuten die meestal nodig zijn om dat risico af te vangen zijn het echt *meer* dan waard.
- Het zijn er vijf, en het zullen er nooit meer worden.
...tot het er wel meer worden, en wat gebeurt er dan? Bouw geen beperkingen in op aannames, alleen op feiten.
- Een persoon kan maar één keer geboren worden dus er hoeft maar één veld voor geboortedatum te zijn, dat is een feit (tot reincarnatie bewezen wordt).
- De snelkassa bij de supermarkt staat maximaal tien producten toe, tot de rij te lang wordt en dan gaan ze over naar acht of vijf. Er is geen harde reden waarom dat tien zou blijven.
- Lesuren op school lopen altijd van 9:00 tot 9:55, altijd.... nouja, tenzij ze een tropenrooster draaien, of er een staking in het openbaarvervoer is, of de leiding liever om 9:05 begint. Er is geen harde reden waarom men om 9:00 begint.
Logica
Kijk eens naar het tegenovergestelde
Bij logica gaat het erom dat iets wel of niet waar is. Dat iets kan een waarde in een database zijn, maar het kan ook de uitkomst van een berekening zijn. Als het lastig is om te zien of het false is, kijk dan eens of het eenvoudiger is om te zien of het niet-true is.
Voorbeeld:
Als je wilt weten of een string begint met een getal dan kun je kijken of het eerste teken wel een getal is, door te controleren of het een 0,1,2, t/m 9 is. Dat is nogal wat werk.
Het tegenovergestelde is juist heel eenvoudig te controleren want alles wat niet met een nul begint komt in alphametische sortering voor de nul, dus $string < '0'. Voor de andere kant is het wat lastiger want $string > '9' zou ook '91' overslaan. Dit los je op door te kijken naar het teken dat na '9' komt in de ASCII tabel en dat is de dubbelepunt en die doet zelf ook nog mee.
In totaal wordt het dus: if (!($string < '0' or $string >= ':')) En dat is aanzienlijk minder werk voor zowel jou als de computer, terwijl het exact hetzelfde resultaat oplevert.
SQL
INNER JOIN ipv IN
Een IN statement werkt alsvolgt:
SELECT * FROM tabel WHERE x IN (SELECT y FROM anderetabel);
Dit levert voor SQL nogal wat werk op omdat x moet worden vergeleken met alle waarden van y.
Het is in sommige gevallen veel efficienter om het te herschrijven naar een JOIN:
SELECT * FROM tabel INNER JOIN anderetabel ON x=y;
LEFT JOIN ipv NOT IN
Selecteer de records die niet in de andere tabel/query voorkomen:
SELECT * FROM tabel WHERE x NOT IN (SELECT y FROM anderetabel);
En dat is het zelfde als een LEFT JOIN met een IS NULL voorwaarde op een kolom uit de rechter tabel:
SELECT * FROM tabel LEFT JOIN anderetabel ON x=y WHERE anderetabel.y IS NULL;
Veelgebruikte principes
- Herhaalt een agendapunt zich elke week, of horen de agendapunten van de verschillende weken tot dezelfde groep agendapunten?