Reg. datum: 17 november 2002
Athlon64 X2 4850e | Foxconn C51XEM2AA | 4 x 1024MB DDR2800 GEiL + Crucial | Nvidia GeForce 8600GT/SILENT | WD 500GB SATA2 | Phillips 16x8x48
Forum » Devschuur® » Programming » [ALG] Waarom zijn if statements zonder body toegestaan?
Athlon64 X2 4850e | Foxconn C51XEM2AA | 4 x 1024MB DDR2800 GEiL + Crucial | Nvidia GeForce 8600GT/SILENT | WD 500GB SATA2 | Phillips 16x8x48
Je zet nu duidelijk de taalbouwersbril opquote:Herko_ter_Horst schreef op dinsdag 22 juli 2008 @ 15:11:
Juist in het geval van een taal wil je een zo eenduidig en eenvoudig mogelijke syntax. Elke uitzondering levert meer problemen op (niet alleen in programmeertalen, hetzelfde zie je in het Nederlands), met name bij het parsen.
Religion has no place in public schools the way facts have no place in organized religion
Dat zou ik niet zomaar durven te zeggen. Naast het feit dat het lastiger te parsen is, is het voor jou als programmeur ook lastiger om alle uitzonderingen te onthouden. In plaats van overal dezelfde constructie te kunnen gebruiken ("statement") moet je bij een if ineens een "after_if_statement" gebruiken, bij een for een "after_for_statement" etc. Dat zou best eens gevolgen kunnen hebben voor de kwaliteit van je software.quote:mark platvoet schreef op dinsdag 22 juli 2008 @ 15:18:
[...]
Je zet nu duidelijk de taalbouwersbril opDit gaat enkel over parsen maar functioneel schiet je er echt niets mee op. Met andere woorden: mijn software wordt er niet beter van.
Herko_ter_Horst wijzigde dit bericht 22-07-2008 15:48 (4%)
En een vaak lastig te vinden bug wanneer je zowel in Delphi/Pascal als in C(++, #)/Java programmeert: in Delphi is '==' '=', en '=' ':='. En als dan die andere taal assignments toestaat in if, for, while, etc. statements dan is 't meestal heel erg lastig om 't te debuggen.quote:Herko_ter_Horst schreef op dinsdag 22 juli 2008 @ 11:58:
= vs == is nog zo'n leuke
"Bonken op de muur helpt niet, een goedgericht nekschot wel" - Sjaak Bral
Volgende stukje vind ik niet echt een ranzige manier om danwel de eerste index i te vinden met a[i] <= 0,quote:Herko_ter_Horst schreef op dinsdag 22 juli 2008 @ 11:41:
[...]
Nee, eerder:
code:
1 for(;doSomethingWithUglySideEffect(););
De reden dat het toegestaan is, is volgens mij wat Janoz hierboven zegt puur de syntax-definitie (stukje BNF):
code:
1 2 3 4 5 6 7 8 9 10if_statement ::= "if" "(" expression ")" statement ..... // blah, blah statement ::= ( expression ";" ) | ...... // blah, blah | ( ";" )
; is dus een legaal statement. Een uitzondering maken voor situaties waarin dat (waarschijnlijk) niet is wat je wilt is het mindere kwaad in zo'n geval (wil je dat wel, dan verhoog je "onnodig" de complexiteit van de syntax). Het heeft dus NIET tot doel het soort vieze constructies waar dit topic inmiddels vol mee staatmogelijk te maken.
1 | for (i=0; (i<N) && (a[i] > 0); i++) ; |
1 | for (i=0; (i<N) && (a[i] > 0); i++) { /* empty */ }; |
Een while loop met boolean vind ik toch duidelijker en netterquote:pkuppens schreef op woensdag 23 juli 2008 @ 13:37:
[...]
Volgende stukje vind ik niet echt een ranzige manier om danwel de eerste index i te vinden met a[i] <= 0,
danwel uit het array te lopen met i == N:
C:
1for (i=0; (i<N) && (a[i] > 0); i++) ;
Ik moet zeggen dat de coding standard die wij hanteren wel een explicitiete empty statement vereist:
C:
1for (i=0; (i<N) && (a[i] > 0); i++) { /* empty */ };
Zo kan het statisch gecheckt worden en is duidelijk dat e.e.a. bedoeld is.
1
2
3
4
5
6
| boolean found = false;
int index = 0;
while(!found)
{
if(a[index++]>0) found = true;
} |
Jawel, wat er eerst stond was ook niet de bedoeling, ik heb het aangepastquote:farlane schreef op woensdag 23 juli 2008 @ 14:35:
[...]
En het feit dat jouw code alle elementen doorloopt tot a.length maakt niets uit?
Haan wijzigde dit bericht 23-07-2008 14:41 (18%)
Kater? Eerst water, de rest komt later
Bouw mee aan Tweak City! Klik hier voor meer info!
En het feit dat jouw code alle elementen doorloopt tot a.length maakt niets uit?quote:
Penance can't absolve your sin. All your belief cannot absolve your sin.
1
2
3
| FILE fp //doe iets waardoor je misschien wel of niet een file pointer hebt. if(fp == null || fclose(fp)); |
| <?php
|
Heb je het topic gelezen? Een voorbeeld als dit is al diverse keren voorbij gekomen en volgens mij zijn de meeste posters het er over eens dat dit niet de duidelijkste manier om zoiets op te schrijven. Ik vind het veel duidelijker om te schrijven:quote:The - DDD schreef op woensdag 23 juli 2008 @ 14:39:
Is gewoon heel simpel...
Een lege body is in een aantal gevallen een valide constructie. Ik kan me voorstellen dat een if statement zelf een dusdanig side effect heeft dat een body niet noodzakelijk is.
In C is het volkomen normaal om te schrijven:
code:
1 2 3 FILE fp //doe iets waardoor je misschien wel of niet een file pointer hebt. if(fp == null || fclose(fp));
Waarom dat er ooit ingekomen is weet ik niet. Maar mijns inziens is het van belang dat een programmeer taal niet voor interpretatie vatbaar is. Dat er dan een paar edge cases zijn (al dan niet met reden), lig ik niet wakker van.
1
2
3
| if(fp != null) {
fclose(fp);
} |
Herko_ter_Horst wijzigde dit bericht 23-07-2008 14:59 (8%)
Verkeerde topic?quote:ZktaS schreef op woensdag 23 juli 2008 @ 14:48:
En wat natuurlijk ook mogelijk is, is het definiëren van een functie in een interface
PHP:
1
2
3<?php
interface iExample {
public function mijnFunctie($szVar);
}
?>
Maar dat heeft vrij weinig met het if-statement te maken hèquote:ZktaS schreef op woensdag 23 juli 2008 @ 14:48:
En wat natuurlijk ook mogelijk is, is het definiëren van een functie in een interface
PHP:
1
2
3<?php
interface iExample {
public function mijnFunctie($szVar);
}
?>
Kater? Eerst water, de rest komt later
Bouw mee aan Tweak City! Klik hier voor meer info!
[ALG] Waarom zijn if statements zonder body toegestaan?quote:pkuppens schreef op woensdag 23 juli 2008 @ 13:37:
[...]
Volgende stukje vind ik niet echt een ranzige manier om danwel de eerste index i te vinden met a[i] <= 0,
danwel uit het array te lopen met i == N:
C:
1for (i=0; (i<N) && (a[i] > 0); i++) ;
Ik moet zeggen dat de coding standard die wij hanteren wel een explicitiete empty statement vereist:
C:
1for (i=0; (i<N) && (a[i] > 0); i++) { /* empty */ };
Zo kan het statisch gecheckt worden en is duidelijk dat e.e.a. bedoeld is.
1
2
3
4
5
6
7
8
9
| CREATE OR REPLACE PROCEDURE TEST IS
BEGIN
IF (sysdate>to_date('16/09/1975','dd/mm/yyyy'))
THEN
END IF;
END;
/ |
To be and not to be....that's relativity
Volgens mij zijn short-circuit en het casten van een type naar een booleaanse waarde behoorlijk expliciet in C, als je daar geen gebruik van zou mogen maken omdat het onduidelijk zou zijn kun je 50% van de C software afschrijven.quote:Herko_ter_Horst schreef op woensdag 23 juli 2008 @ 14:54:
Nu maak je m.i. gebruik van maar liefst drie impliciete eigenschappen bij elkaar die extra mentale verwerkingskracht vergen om te snappen: short-circuit van boolean expressies, een leeg statement en het feit dat fpclose() blijkbaar een boolean retourneert (terwijl je daar verder niks mee doet).
Penance can't absolve your sin. All your belief cannot absolve your sin.
Ik haal wel 2 serieuze bugs uit jouw programma.quote:Haan schreef op woensdag 23 juli 2008 @ 14:15:
[...]
Een while loop met boolean vind ik toch duidelijker en netter
code:
1 2 3 4 5 6boolean found = false; int index = 0; while(!found) { if(a[index++]>0) found = true; }
Liever iets meer typen dan kortere onduidelijke code
[...]
Jawel, wat er eerst stond was ook niet de bedoeling, ik heb het aangepast
Een redelijk favoriete quote:quote:farlane schreef op woensdag 23 juli 2008 @ 15:11:
[...]
Volgens mij zijn short-circuit en het casten van een type naar een booleaanse waarde behoorlijk expliciet in C, als je daar geen gebruik van zou mogen maken omdat het onduidelijk zou zijn kun je 50% van de C software afschrijven.
Afgezien van dat zou ik deze manier ook niet kiezen in dit geval.
Eens...quote:Herko_ter_Horst schreef op woensdag 23 juli 2008 @ 14:54:
[...]
Heb je het topic gelezen? Een voorbeeld als dit is al diverse keren voorbij gekomen en volgens mij zijn de meeste posters het er over eens dat dit niet de duidelijkste manier om zoiets op te schrijven. Ik vind het veel duidelijker om te schrijven:
code:
1 2 3if(fp != null) { fclose(fp); }
Nu maak je m.i. gebruik van maar liefst drie impliciete eigenschappen bij elkaar die extra mentale verwerkingskracht vergen om te snappen: short-circuit van boolean expressies, een leeg statement en het feit dat fpclose() blijkbaar een boolean retourneert (terwijl je daar verder niks mee doet).
Plus het feit dat je erg makkelijk over een leeg statement heen leest waardoor je kunt denken dat het eerstvolgende niet-lege statement wordt "beschermd" door de if.
Dat was niet mijn punt: natuurlijk is het gedrag expliciet gedefinieerd ergens. Het punt is dat er gebruik wordt maakt van gedrag dat niet direct en triviaal afleesbaar is uit de code om iets korter op te kunnen schrijven. Het feit dat fclose() een int teruggeeft die gecast moet worden naar een boolean maakt het alleen maar lelijker (ik wist dat niet en ging er vanuit dat fclose() een boolean zou retourneren; in Java werkt deze constructie niet eens met een int). De bedoeling van de code raakt compleet ondergesneeuwd in de "slimme truukjes" van de programmeur.quote:farlane schreef op woensdag 23 juli 2008 @ 15:11:
[...]
Volgens mij zijn short-circuit en het casten van een type naar een booleaanse waarde behoorlijk expliciet in C, als je daar geen gebruik van zou mogen maken omdat het onduidelijk zou zijn kun je 50% van de C software afschrijven.
Afgezien van dat zou ik deze manier ook niet kiezen in dit geval.
Wat staat er in de oorspronkelijke code:quote:als de file pointer een legale waarde bevatA, sluit dan de fileB
Wat staat er in de door mij geposte versie:quote:als fp null is(1), of anders(2) als de aanroep van fclose(fp) true retourneert(3) (4), doe dan niks(5)
Mentale stappen voor de vertaling van natuurlijke taal naar code die je altijd zult moeten doorlopen:quote:als fp niet null is(6), roep dan fclose(fp) aan(7)
Herko_ter_Horst wijzigde dit bericht 23-07-2008 18:08 (34%)
Als je dit soort dingen niet weet van de taal waarin je werkt ben je wat mij betreft niet geschikt om je werk te doen. Sterker nog, er hoeft niet eens gecast te worden omdat de if-statement niet expliciet met bools werkt maar met 0 en niet 0.quote:Herko_ter_Horst schreef op woensdag 23 juli 2008 @ 17:21:
(ik wist dat niet en ging er vanuit dat fclose() een boolean zou retourneren; in Java werkt deze constructie niet eens met een int).
PrisonerOfPain wijzigde dit bericht 23-07-2008 18:26 (14%)
C is dan ook niet de taal waarin ik werkquote:PrisonerOfPain schreef op woensdag 23 juli 2008 @ 18:22:
[...]
Als je dit soort dingen niet weet van de taal waarin je werkt ben je wat mij betreft niet geschikt om je werk te doen. Sterker nog, er hoeft niet eens gecast te worden omdat de if-statement niet expliciet met bools werkt maar met 0 en niet 0.
Herko_ter_Horst wijzigde dit bericht 23-07-2008 19:35 (25%)
Toch is het allebei onderdeel van dezelfde standaardquote:Herko_ter_Horst schreef op woensdag 23 juli 2008 @ 19:15:
[...]
C is dan ook niet de taal waarin ik werkOverigens is fopen() is geen onderdeel van de taal, maar een onderdeel van een standaard-library.
Als programmeur (en zeker in C) dien je sowieso altijd op de hoede te zijn. Programmacode is dan ook geen simpel romannetje, maar een droge juridische tekst. Als je niet precies weet wat er staat heb je gewoon een probleem. Zelfs als je alles zo duidelijk en netjes mogelijk opschrijft heb je gewoon nog voor de hand liggende basiskennis nodig.quote:Uit jouw flame reactie begrijp ik dat het zeer onwaarschijnlijk is dat een C programmeur dit niet zou weten, maar het gaat ook niet om deze specifieke functie (je hebt de [ALG] prefix voor dit topic gezien, alsmede de voorbeeldcode in diverse talen in de rest van dit topic, neem ik aan?).
Het gaat om het aantal mentale stappen dat je moet maken om de code te overzien.
Het punt dat ik probeerde te maken was dan ook niet dat jou code op een willekeurige welke manier minder leesbaar was; het punt was dat je sowieso moet weten wat je aan het doen bent hoe eenvoudig het er dan ook uit ziet. Je vergiste je immers zelf ookquote:Dus bedankt voor het versterken van mijn punt: ook zonder die kennis (die NIETS met het op te lossen "probleem" te maken heeft) is "mijn" versie van dezelfde code duidelijk.
quote:pkuppens schreef op woensdag 23 juli 2008 @ 16:25:
[...]
Ik haal wel 2 serieuze bugs uit jouw programma.
1. als je array geen getal > 0 bevat loop je uit je array
2. je index met postfix geeft de gewenste waarde +1 terug.
<knip>etc.
Kater? Eerst water, de rest komt later
Bouw mee aan Tweak City! Klik hier voor meer info!
In sommige talen kan dat wel:quote:Janoz schreef op dinsdag 22 juli 2008 @ 11:46:
nee, dat dacht ik even, maar ik heb net ff snel wat gechecked en dat blijkt niet zo te zijn.
1 | function doSomething()
|
Laten we voorop stellen dat in dit ( gemaakt ) voorbeeld ik het helemaal met je eens ben dat de versie die jij gebruikt veel duidelijker is.quote:Herko_ter_Horst schreef op woensdag 23 juli 2008 @ 17:21:
Dat was niet mijn punt: natuurlijk is het gedrag expliciet gedefinieerd ergens. Het punt is dat er gebruik wordt maakt van gedrag dat niet direct en triviaal afleesbaar is uit de code om iets korter op te kunnen schrijven.
Penance can't absolve your sin. All your belief cannot absolve your sin.