Hoofdcategorieën
Topicacties

[ALG] Waarom zijn if statements zonder body toegestaan?

Pagina: 1 2 3 4 last

Reageer Nieuw Topic
Berichten: 485
Reg. datum: 17 november 2002

Visual Studio geeft ook een warning...

Dit is het "Grijze Gebied" waar fout overgaat in stijl denk ik...

Athlon64 X2 4850e | Foxconn C51XEM2AA | 4 x 1024MB DDR2800 GEiL + Crucial | Nvidia GeForce 8600GT/SILENT | WD 500GB SATA2 | Phillips 16x8x48

Moutarde apres le diner
Berichten: 1.890
Reg. datum: 26 februari 2002

quote:
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.
Je zet nu duidelijk de taalbouwersbril op ;) Dit gaat enkel over parsen maar functioneel schiet je er echt niets mee op. Met andere woorden: mijn software wordt er niet beter van.

Religion has no place in public schools the way facts have no place in organized religion

Berichten: 376
Reg. datum: 07 november 2002

quote:
mark platvoet schreef op dinsdag 22 juli 2008 @ 15:18:
[...]
Je zet nu duidelijk de taalbouwersbril op ;) Dit gaat enkel over parsen maar functioneel schiet je er echt niets mee op. Met andere woorden: mijn software wordt er niet beter van.
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.

Blijft over de vraag of een empty statement überhaupt zinvol is (ik kan zo geen voorbeeld bedenken waar ik een empty statement als beste oplossing zou gebruiken).

Herko_ter_Horst wijzigde dit bericht 22-07-2008 15:48 (4%)

 
Berichten: 3.959
Reg. datum: 04 november 2000

quote:
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.
Een Delphi programmeur ziet die extra '=' vaak over het hoofd in z'n (bij mij) C# code, en zelfs als je de knop naar de gebruikte taal hebt omgezet is dat nauwelijks te voorkomen.

Gerelateerd voorbeeldje: in Delphi is standaard F5 een breakpoint aan/uit zetten, en F9 runnen vanuit de debugger. In VS is dat precies andersom. Geen probleem als je een dag of zo in 1 van die IDE's werkt, maar wanneer ik op een dag vaak moet wisselen tussen IDE's dan run ik in Delphi applicatie met F5 F5 F9, en een VS project met F9 F9 F5.

Heeft niks te maken met het kennen van de taal of IDE, maar gewoon met "dat wat je zonet gewend was".

"Bonken op de muur helpt niet, een goedgericht nekschot wel" - Sjaak Bral

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
10
if_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 staat ;) mogelijk te maken.
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:
1
for (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:
1
for (i=0; (i<N) && (a[i] > 0); i++) { /* empty */ };

Zo kan het statisch gecheckt worden en is duidelijk dat e.e.a. bedoeld is.
 
Berichten: 5.880
Reg. datum: 02 februari 2004

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:
1
for (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:
1
for (i=0; (i<N) && (a[i] > 0); i++) { /* empty */ };

Zo kan het statisch gecheckt worden en is duidelijk dat e.e.a. bedoeld is.
Een while loop met boolean vind ik toch duidelijker en netter
code:
1
2
3
4
5
6
boolean found = false;
int index = 0;
while(!found)
{
    if(a[index++]>0) found = true;
}

Liever iets meer typen dan kortere onduidelijke code :)
quote:
farlane schreef op woensdag 23 juli 2008 @ 14:35:
[...]


En het feit dat jouw code alle elementen doorloopt tot a.length maakt niets uit?
Jawel, wat er eerst stond was ook niet de bedoeling, ik heb het aangepast O-)

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!

Burn your lie into me
Berichten: 3.106
Reg. datum: 07 maart 2000

quote:
Haan schreef op woensdag 23 juli 2008 @ 14:15:
Liever iets meer typen dan kortere onduidelijke code :)
En het feit dat jouw code alle elementen doorloopt tot a.length maakt niets uit?

Penance can't absolve your sin. All your belief cannot absolve your sin.

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.
Nunchaku-ka

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);
}
?>

Berichten: 376
Reg. datum: 07 november 2002

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.
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
3
if(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.

Herko_ter_Horst wijzigde dit bericht 23-07-2008 14:59 (8%)

 
Berichten: 376
Reg. datum: 07 november 2002

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);
}
?>

Verkeerde topic?
 
Berichten: 5.880
Reg. datum: 02 februari 2004

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è ;)

En volgens mij mag je het public keyword ook weglaten in een interface, omdat die sowieso altijd public methoden bevat. correct me if I'm wrong offcourse

Kater? Eerst water, de rest komt later
Bouw mee aan Tweak City! Klik hier voor meer info!

Berichten: 155
Reg. datum: 10 september 2004

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:
1
for (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:
1
for (i=0; (i<N) && (a[i] > 0); i++) { /* empty */ };

Zo kan het statisch gecheckt worden en is duidelijk dat e.e.a. bedoeld is.
[ALG] Waarom zijn if statements zonder body toegestaan?
 
Berichten: 167
Reg. datum: 30 september 2005

Om het topic een beetje on-topic en algemeen te houden: in Oracle PL/SQL is het niet toegestaan...onderstaande code compileert simpelweg niet:
code:
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;
/

Het is dus niet altijd zo dat een lege body een valide constructie is.

To be and not to be....that's relativity

Burn your lie into me
Berichten: 3.106
Reg. datum: 07 maart 2000

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).
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.

Penance can't absolve your sin. All your belief cannot absolve your sin.

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
6
boolean 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 O-)
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.

Je bent nog wel even bezig met je code te tunen totdat die precies doet wat ik wilde, en dan heb je alsnog redelijk onleesbare code.

Dan heb ik liever mijn regel code met twee regels commentaar dan jouw code.

Maar toegegeven, mijn code maakt wel gebruik van wat C finesses en 15+ jaar ervaring, zoals dat de i++ niet meer wordt gedaan als de conditie niet meer geldig is. En reken maar dat het in die 15 jaar regelmatig niet meteen goed is gegaan.

Ook vind ik een for loop een betere keuze hier, omdat de bewijslast van de correctheid van het programma van een for-loop eenvoudiger is dan van een while loop.

Verder ging de originele vraag over if statements, en daarin kan ik me voorstellen dat je minder staat te springen om zij-effecten.
 
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.
Een redelijk favoriete quote:
C combineert de snelheid van assembly met de leesbaarheid van assembly. :)

Maar ik was ook al met m'n for-loop in C teveel afgedwaald van de originele if in Java.
 
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
3
if(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.
Eens...

De enige reden die ik kan bedenken is dat het een syntax betreft die afgeleid is van C.
Berichten: 376
Reg. datum: 07 november 2002

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.
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.

Mijn "sanity check" is vaak om te proberen de code in natuurlijke taal voor te lezen (zoveel mogelijk). Leg dat naast wat je eigenlijk bedoelt met de code. Hoe meer de twee overeen komen, hoe groter de kans dat de code ook voor anderen duidelijk is.

Wat is het doel van de code:
quote:
als de file pointer een legale waarde bevatA, sluit dan de fileB
Wat staat er in de oorspronkelijke code:
quote:
als fp null is(1), of anders(2) als de aanroep van fclose(fp) true retourneert(3) (4), doe dan niks(5)
Wat staat er in de door mij geposte versie:
quote:
als fp niet null is(6), roep dan fclose(fp) aan(7)
Mentale stappen voor de vertaling van natuurlijke taal naar code die je altijd zult moeten doorlopen:

A: 'legaal' betekent voor een file pointer "niet null"
B: een file sluiten gaat via de fclose() method op de file pointer

Mentale stappen bij het lezen van deze code:

1: het tegengestelde van A
2: ('anders' vergeet je gauw mee te nemen)
3. Als fclose() true teruggeeft? Maar fclose() geeft toch een int terug? Oh ja die wordt gecast...
4. B, als side-effect
5. Niks? Ja maar... Oh wacht, fclose() was de bedoeling...

vs.

6. A
7. B

Herko_ter_Horst wijzigde dit bericht 23-07-2008 18:08 (34%)

 
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).
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.

PrisonerOfPain wijzigde dit bericht 23-07-2008 18:26 (14%)

 
Berichten: 376
Reg. datum: 07 november 2002

quote:
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.
C is dan ook niet de taal waarin ik werk :) Overigens is fopen() is geen onderdeel van de taal, maar een onderdeel van een standaard-library.

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.

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.

Herko_ter_Horst wijzigde dit bericht 23-07-2008 19:35 (25%)

 
quote:
Herko_ter_Horst schreef op woensdag 23 juli 2008 @ 19:15:
[...]

C is dan ook niet de taal waarin ik werk :) Overigens is fopen() is geen onderdeel van de taal, maar een onderdeel van een standaard-library.
Toch is het allebei onderdeel van dezelfde standaard ;). Verder is het natuurlijk onzin om te verwachtten dat je een willekeurig persoon op een project kan gooien en kan verwachtten 'ie er mee om kan gaan. Mijn punt was dus ook dat als je niets van een bepaalde omgeving af weet (dat kan de stdlib zijn, maar ook ZF, Lucene, Smalltalk of het bedrijfsframework) je simpelweg geen aannames kan maken over zulke statements in het programma.
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.
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:
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.
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 ook ;)
 
Berichten: 5.880
Reg. datum: 02 februari 2004

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.
offtopic:
Het was ook maar een snel voorbeeldje, geen weldoordachte en uitvoerig geteste productiecode ;)

Kater? Eerst water, de rest komt later
Bouw mee aan Tweak City! Klik hier voor meer info!


Acties: [view][quote]


Door: crisp
Devver / Moderator WEB
Papa van Jeremy \o/
Berichten: 31.046
Reg. datum: 24 februari 2000

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.
In sommige talen kan dat wel:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function doSomething()
{
    alert('something');

    return true;
}

function doSomethingElse()
{
    alert('something else');

    return false;
}

function dontDoThis()
{
    alert('not doing this');

    return true;
}

doSomething() && doSomethingElse() && dontDoThis();

;)
Burn your lie into me
Berichten: 3.106
Reg. datum: 07 maart 2000

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.
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.

Je haalt echter ook een tweetal eigenschappen aan die je mijns inziens als C programmeur ( het voorbeeld ging immers over een stukje C ) gewoon moet weten en herkennen.

Penance can't absolve your sin. All your belief cannot absolve your sin.

Pagina: 1 2 3 4 last



VNU Media logo Powered by True

© 1998 - 2008 Tweakers.net - Alle rechten voorbehouden

Uitgever van: