Je komt anders over alsof een compiler + unittests het wel zo'n beetje is wat je nodig hebt.
Ik weet niet wat voor ide`s jullie voor .net hebben, maar intellij idea, eclipse, jbuilder, codeguide/x-develop doen niet alleen syntactische check maar ook semantische check. Semantiek bestaat er op verschillende nivo`s. int a = true is iets dat mijn programmeeromgeving eruit vist. Alles wat een compiler eruit kan vissen, vissen moderne ide`s er ook al uit. Je hoeft dan niet meer te controleren.
Je verwart syntax bugs met semantische bugs. Iets niet ophogen haalt jouw IDE er niet uit, een algorithme achterstevoren implementeren ook niet, iets vergeten te saven ook niet. Dat zijn wel fouten. int a = true kan syntactisch ook fout zijn, ik zie dat niet echt als semantische error checking.
Stel dat we php als voorbeeld nemen. Als ik de php code kan compileren heb ik sneller een systeem goed draaiend dan als ik het niet kan.
Je moet beter lezen, ik zei ook dat dat langer gaat duren, en geloof me, ik weet waarover ik het heb, na jaren asp gekrast te hebben van tijd tot tijd

. Daarin vervloek je ook vbscript wanneer je 3 schermen diep ineens een syntax fout tegenkomt.
Uiteindelijk zullen er evenveel bugs in zitten (stel dat je het een jaar hebt draaien). Maar door de compilatie slag (in ieder geval de code helemaal door laten fluiten) heb ik het systeem sneller bugvrij.
Uit de lucht gegrepen conclusie. Je bespaart tijd met het eruit halen van de syntaxfoutjes, klopt. Maar als je nakijkt wat je schrijft, haal je die er zelf ook al aardig snel uit (of door de color coding), en wat ookal gezegd is hierboven, bij gebrek aan tools gebruik je de middelen die je resten. Ik weet niet of je het tijdperk van de commandline C debugger nog kent, maar dan weet je dat je soms ook met een compiler gewoon zeer spartaans moet gaan testen, maar dat dat wel werkt.
Dus de enige tijd die jij bespaart is de syntaxfoutjes eruit halen. Na een paar keer testen heb je die er wel uit. Het voordeel van scriptingtalen is weer dat je de pagina / script in een editor ernaast open hebt, en met een paar aanpassingen en een save ben je weer klaar, daar bespaart de scripter weer tijd, hij hoeft niet te compileren. Maar beide analogieen gaan mank aan het feit dat het voorbij gaat aan het feit dat fouten IN de code pas aan het licht komen door het nakijken van je code of je wel het juiste hebt geimplementeerd. Als jij quicksort moet bouwen en jij bouwt een foute quicksort want je hebt bv het algorithme verkeerd begrepen zodanig dat bij een even aantal entries het fout gaat, en jouw unittest test met oneven aantal entries en het sorteert, kan jij niet concluderen dat het goed is, je snapt nl. (stel) dat algoritme niet.
Dit scenario heeft niets met scripting of compilers te maken, maar met de projectie van wat je MOET maken op wat je het geschreven in executeerbare vorm.
Verder moet je er ook rekening mee houden dat er nog wel eens iets aan code wil veranderen. Met een compiler en unit tests heb ik hier minder last van.. ik zal minder snel runtime bugs voor de kiezen krijgen...
Met late binding heb je ook minder last van wijzigingen, ik denk zelfs minder dan met strong typed code.
Maar je maakt het een wedstrijd tussen scripting vs. compiled code, wat onzin is. De fouten die in de code blijven zitten zijn niet syntactisch van aard, dus het onderscheid boeit niet.
Ik snap gewoon niet dat jullie het niet begrijpen. Dat die hard scripters het niet willen begrijpen kan ik em voorstellen. Maar dat had ik van jou niet verwacht.
Wat snap ik niet? Ik wilde alleen maar aangeven dat de discussie niet moet ontaarden in gezemel over "jij gebruikt geen compiler en/of unittests dus je code is minder goed" of daaromtrent want daar komt het zolangzamerhand wel op neer, en dat is dus echt onzin.
Menigeen hier begint gewoon met kloppen van code en heeft niet meer dan een vaag idee van wat hij/zij denkt te moeten implementeren. Na afloop kijkt de programmeur niet in detail na wat hij heeft gebouwd met wat hij had moeten bouwen (een gecontrolleerd! algorithme) zodat hij semantische fouten kan opsporen (bugs), het zou ook niet zinvol zijn, het algoritme zit in de persoon's hoofd en staat niet vast zwart op wit.
Je kunt dan die code wel door een compiler trekken en controlleren met een unittest maar als jij ook die unittest schrijft test jij je code zoals jij denkt hoe het algoritme moet werken, niet zoals het wellicht zou moeten werken en tegen alle pre-/post condities. Je syntaxfoutjes zijn dan wellicht wel weg (alhoewel ook in java je runtime casting hebt die menig uurtje kosten) en je unittest zegt dat het goed is maar of het WERKELIJK goed is is maar de vraag. Een unittest zegt mij echt geen ene biet.
Voorbeeldje hebben? nhibernate's v0.3 alpha liep door bijna alle unittests heen (stuk of 300 dacht ik) maar intern was die code echt een zootje en menig "What does this do?" comment kwam je tegen. Solide code, bugfree? Geen idee. Maar ik zou de unittests en compiler niet vertrouwen voor 100%. Want wat als jij het gebruikt in situatie X die niet gecovered wordt door een unittest?
TDD kan goed werken, wanneer je eerst met mocks alleen je tests schrijft, je algorithmen controlleert en wanneer je alles hebt gecontrolleerd tot implementatie van je mocks overgaat. Wie doet dat in dat detail?
.oisyn schreef op dinsdag 22 februari 2005 @ 12:50:
En uiteraard bestaan er nog wel meer fouten, van belang is imho echter zoveel mogelijk bugs in een zo vroeg stadium te exposen zodat ze opgelost kunnen worden. Een semantische controle (compilatie) helpt daar gigantisch bij.
Compilatie is geen semantische controle. het controlleert op syntax en genereert code aan de hand van rules, weet jij ook

Semantische controle zou zijn het testen van pre/post condities bijvoorbeeld.
In talen zonder generics heb je veel fouten die zijn gerelateerd aan het gebruik van 'general' data structures zoals een list van object objects. At compiletime kunnen die niet worden getest op type safety. At runtime wel en dan heb je dezelfde problemen als bij late bounded talen zoals de meeste scripting talen. In C heb je dat bv ook, in C#, in java maar in C++ met templates weer niet.
Men snapt kennelijk niet dat 'bugs' meer is dan syntactische errors oplossen. Een compiler is erg zinvol voor tijdsbesparing, maar ook maar tot op zekere hoogte.
[
Voor 10% gewijzigd door
EfBe op 22-02-2005 13:05
]