[alg] slechtste prog voorbeelden. Overzicht Volgende deel Laatste deel

Dit topic is onderdeel van een reeks. Ga naar het meest recente topic in deze reeks.

Pagina: 1 ... 9 ... 11 Laatste
Acties:
  • 18.978 views sinds 30-01-2008

Acties:
  • 0 Henk 'm!

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Daar denkt guru Fowler anders over ;) Replace Nested Conditional with Guard Clauses

En nu heeft MF niet altijd gelijk, maar ik vind de Guard Clause aanpak weer netter. Achja, smaak.

edit:
Spuit 11 8)7

[ Voor 5% gewijzigd door kenneth op 07-01-2006 15:09 ]

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


Acties:
  • 0 Henk 'm!

  • Ivo
  • Registratie: Juni 2001
  • Laatst online: 14-01 18:01

Ivo

Een beetje vaardige coder met kennis van boolse algebra moet dit kunnen begrijpen en zo nee dan is haakjes toevoegen geen punt ;)
Ik ken mijn boolse algebra wel hoor en juist daar hebben de AND en de OR gelijkwaardige precedentie. Misschien dat het in de meeste talen dan wel zo is dat de AND voor gaat, toch vind ik het niet net.

whoami: Dat zeg ik toch?

[ Voor 5% gewijzigd door Ivo op 08-01-2006 01:52 ]


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Nu online
Ivo schreef op zaterdag 07 januari 2006 @ 18:03:
[...]

Ik ken mijn boolse algebra wel hoor en juist daar hebben de AND en de OR gelijkwaardige precedentie. Misschien dat het in de meeste talen dan wel zo is dat de AND voor gaat, toch vind ik het niet net.
Tja, en toch is het gewoon duidelijker en leesbaarder met die haakjes. Het neemt gewoon alle twijfel weg.

[ Voor 5% gewijzigd door whoami op 07-01-2006 18:43 ]

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 12:38

Cyphax

Moderator LNX
Ik heb er zelf nog wel eentje, en het is nog wel een eigen brouwsel van een tijd terug: beetje zelfspot op z'n tijd is ook wel leuk... van een stageopdracht, waarin ik een query heb gemaakt om van testresultaten onbekende waarden alsnog uit te rekenen.
Needless to say, dit gedeelte van een bepaalde query HAD wat makkelijker gekund:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
round(getp(abs(round(ttest(
compounds.geo_mean, 
                            vehicles.geo_mean, 
                            compounds.stddev_log, 
                            vehicles.stddev_log, 
                            compounds.sample_number, 
                            vehicles.sample_number
                            ),
1)), 
                                floor(getdf(
                                compounds.stddev_log, 
                                vehicles.stddev_log, 
                                compounds.sample_number, 
                                vehicles.sample_number)) + 
                                    case round(mod(getdf(
                                              compounds.stddev_log, 
                                              vehicles.stddev_log, 
                                              compounds.sample_number, 
                                              vehicles.sample_number),
                                              floor(getdf(
                                                    compounds.stddev_log, 
                                                    vehicles.stddev_log, 
                                                    compounds.sample_number,
                                                    vehicles.sample_number
))),1) 
                                    when 0.0 then 0 
                                    when 0.1 then 0 
                                    when 0.2 then 0 
                                    when 0.3 then 0.5 
                                    when 0.4 then 0.5 
                                    when 0.5 then 0.5 
                                    when 0.6 then 0.5 
                                    when 0.7 then 0.5 
                                    when 0.8 then 1 
                                    when 0.9 then 1 
                                    when 1.0 then 1 
                                end) * 2, 15) pval

Ik hoorde de (Oracle) testserver drie verdiepingen lager vloeken...
(uiteraard is de rest van de query nog groter, en getp() en ttest() zijn stored procs die ook weer vanalles uitrekenen, en de tabel waarmee gerekend werd had ook nog enkele miljoenen records. Alle 16 processoren waren een nachtje ofzo zoet en de gealloceerde ruimte voor de nieuwe tabel was met 10GB toch te krap. :+).
Gelukkig was het een query die maar eenmalig uitgevoerd hoefde te worden om een nieuwe tabel te creeeren, heh. De beheerder van die server kon z'n lachen haast niet inhouden en had nog nooit zo'n load op z'n server gezien. Hoe zou dat toch komen?

Saved by the buoyancy of citrus


Acties:
  • 0 Henk 'm!

  • ikke007
  • Registratie: Juni 2001
  • Laatst online: 02-09 21:51
Om maar wat zelfspot toe te passen:
Delphi:
1
2
if not FEMailsArray[FEmailPointer].IsGelezen then
  FEMailsArray[FEmailPointer].SetGelezen(true);


Tot op de dag van vandaag weet ik niet wat ik hiermee wilde bereiken

Lets remove all security labels and let the problem of stupidity solve itself


Acties:
  • 0 Henk 'm!

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Ivo schreef op zaterdag 07 januari 2006 @ 18:03:
Ik ken mijn boolse algebra wel hoor en juist daar hebben de AND en de OR gelijkwaardige precedentie. Misschien dat het in de meeste talen dan wel zo is dat de AND voor gaat, toch vind ik het niet net.
And is vergelijkbaar met *, or met +. Zo onlogisch is het niet IMO.

Acties:
  • 0 Henk 'm!

  • simon
  • Registratie: Maart 2002
  • Laatst online: 08-09 19:03
Van een bekende van me, programmeur, hoorde ik dat een vriend van hem werkte aan een editor, en elke regel zo inladde:

String a = "inhoud van regel 1";
String b = "inhoud van regel 2";
String c = "inhoud van regel 3";

Dat houdt natuurlijk op :P Dus wat dee hij dan, aa, ab, ac. Maar dat werd natuurlijk een enorme rotzooi als je grote bestanden had vond ie :P

|>


Acties:
  • 0 Henk 'm!

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Visual Basic:
1
2
3
4
5
6
7
Dim teller As String
 
teller = 1
Do While teller < 6
    ' ....
    teller = teller + 1
Loop


Symbolisch voor de rest van de code :/
... die ik nu moet onderhouden ;(

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 12:38

Cyphax

Moderator LNX
kenneth schreef op dinsdag 17 januari 2006 @ 16:09:
Visual Basic:
1
2
3
4
5
6
7
Dim teller As String
 
teller = 1
Do While teller < 6
    ' ....
    teller = teller + 1
Loop


Symbolisch voor de rest van de code :/
... die ik nu moet onderhouden ;(
Dat vind ik niet echt "slecht" (okee behalve die teller As String) of onleesbaar eerlijk gezegd. :)
Het is ook niet optimaal natuurlijk, maar toch. :)
Of ging het je om die rare toewijzing van teller als String?
(ik ken VB niet, VBScript wel maar daar geef je helemaal geen datatype mee bij declaratie :+)

Saved by the buoyancy of citrus


Acties:
  • 0 Henk 'm!

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Cyphax schreef op dinsdag 17 januari 2006 @ 16:26:
Dat vind ik niet echt "slecht" (okee behalve die teller As String) of onleesbaar eerlijk gezegd. :)
Het is ook niet optimaal natuurlijk, maar toch. :)
Of ging het je om die rare toewijzing van teller als String?
(ik ken VB niet, VBScript wel maar daar geef je helemaal geen datatype mee bij declaratie :+)
Ik denk dat het gaat om het gebruik van do ... while in plaats van for.

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 13:29
Hiervoor is de For-Next toch bedoeld? ;)

Acties:
  • 0 Henk 'm!

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

String en For-Next ja :)

Ach, ik had ook de shitload aan globale variabelen kunnen c/p-en, of functies die meer doen dan hun signature doet vermoeden, enz, enz :/

Edit: ik vergeet de project_a, project_b, project_c etc. velden! Who needs 2NF anyways!

[ Voor 22% gewijzigd door kenneth op 17-01-2006 16:52 ]

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


Acties:
  • 0 Henk 'm!

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

En functies hebben geen return value, nee, ze wijzigen een globale variabele die vervolgens weer door de caller wordt teruggelezen :|

Ik wil naar huis :'(

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


Acties:
  • 0 Henk 'm!

  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Deze kwam ik vandaag tegen:
Java:
1
2
3
4
5
6
7
} catch (Throwable e) {
        try {
            e.printStackTrace();
        } catch (Throwable ex) {
            ex.printStackTrace();
        }
}

nice eh

Acties:
  • 0 Henk 'm!

  • Whizzy
  • Registratie: Juni 1999
  • Laatst online: 04-09 20:50
Ik kwam laatst dit tegen...

code:
1
2
3
if ( null == amount) {
    amount = null;
}


serieus... }:O :D

If it still works, tweak it ! until it is broke.. then start over again..


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 09-09 15:29
-FoX- schreef op woensdag 08 februari 2006 @ 15:47:
Deze kwam ik vandaag tegen:
Java:
1
2
3
4
5
6
7
} catch (Throwable e) {
        try {
            e.printStackTrace();
        } catch (Throwable ex) {
            ex.printStackTrace();
        }
}

nice eh
Slordig inderdaad; wat als regel 5 throwt? Gelukkig is de fout makkelijk te herstellen:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
} catch (Throwable e) {
    try {
        e.printStackTrace();
    } catch (Throwable ex) {
        try {
            ex.printStackTrace();
        } catch (Throwable exc) {
            try {
                exc.printStackTrace();
            } catch (Throwable exce) {
                try {
                    exce.printStackTrace();
                } catch (Throwable excep) {
                    try {
                        excep.printStackTrace();
                    } catch (Throwable except) {
                        try {
                            except.printStackTrace();
                        } catch (Throwable excepti) {
                            try {
                                excepti.printStackTrace();
                            } catch (Throwable exceptio) {
                                try {
                                    exceptio.printStackTrace();
                                } catch (Throwable exception) {
                                    // If this fails, I give up!
                                    exception.printStackTrace();
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

Of recursief:
Java:
1
2
3
4
5
6
7
8
void printStackTrace(Throwable e)
{
    try {
        e.printStackTrace();
    } catch(Throwable ex) {   
        printStackTrace(ex);
    }
}

[ Voor 3% gewijzigd door Soultaker op 08-02-2006 15:57 ]


Acties:
  • 0 Henk 'm!

  • Whizzy
  • Registratie: Juni 1999
  • Laatst online: 04-09 20:50
:D :'( :D

If it still works, tweak it ! until it is broke.. then start over again..


Acties:
  • 0 Henk 'm!

  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Whizzy schreef op woensdag 08 februari 2006 @ 15:54:
Ik kwam laatst dit tegen...

code:
1
2
3
if ( null == amount) {
    amount = null;
}


serieus... }:O :D
Ohja, zo eentje ben ik overlaatst ook nog tegengekomen:
Java:
1
2
3
4
5
if (object != null) {
  // do stuff
} else {
  object.setStatus(false);
}

tjaa..

Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 12:38

Cyphax

Moderator LNX
Dat MOET gewoon een keer mis gaan.
Iedereen weet toch dat je dat minstens 6 keer ofzo moet afvangen.
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
catch (Throwable e)
{
  try {
    e.printStackTrace();
  }
  catch (Throwable ex) {
    try {
      ex.printStackTrace();
    }
    catch (Throwable ex2) {
      try {
        ex2.printStackTrace();
      }
      catch (Throwable ex3) {
        try {
          ex3.printStackTrace();
        }
        catch (Throwable ex4) {
          try {
            ex4.printStackTrace();
          }
          catch (Throwable ex5) {
            try {
              ex4.printStackTrace();
            }
            catch (Throwable ex6) {
              // ignore ex6
              System.meltdown();
            }
          }
        }
      }
    }
  }
}

Verder vind ik het wel netjes, ik doe dat altijd zo. Met variabelen ook:
Java:
1
2
3
4
5
6
7
8
9
string a;
try
{
  a = "hello world";
}
catch (Throwable ex)
{
  a = "hello world";
}

Je wilt toch wel zeker weten dat het goed gaat uiteindelijk, toch?
:+
Oh ja gewoon, Soultaker. :D
2 zielen 1 gedachte, maar die recursieve gaat me duidelijk te ver :+

[ Voor 7% gewijzigd door Cyphax op 08-02-2006 16:18 ]

Saved by the buoyancy of citrus


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 09-09 15:29
The Daily WTF is wel leuk, maar ze ondermijnen hun geloofwaardigheid enigzins door regelmatig met hele slechte voorbeelden te komen. Dan plaatsen ze dingen die twijfelachtig overkomen, maar als je er over nadenkt eigenlijk heel redelijk zijn en dan wordt het een potje met z'n allen lachen om die 'domme' ontwikkelaars. Ik denk dat iedereen bij gebrek aan tijd, kennis of motivatie regelmatig suboptimale oplossingen creëert; The Daily WTF zou zich moeten beperken tot de voorbeelden die zo absurd zijn dat je je afvraagt hoe de auteur in godsnaam software-ontwikkelaar is geworden.

Voorbeelden van slechte WTF's op alleen de voorpagina al: Drive-By Architecture waarin ze een slecht ingescand schema uit z'n context rukken om degene die het getekend heeft weg te zetten als een idioot. (Wie wel eens met een whiteboard erbij met een stel collega's overlegd heeft, weet dat er aan het bord op het einde absoluut niet af te leiden is waarover allemaal gesproken is - een voor een voorbijganger onbegrijpelijk schema betekent absoluut niet dat het overleg niet nuttig of van inhoudelijk laag nivo was.)

Of deze foutmeldingen, waarbij ze de foutmelding "Communication Error with Programmer" wegzetten alsof dat zou suggereren dat de software-ontwikkelaar bedoelt wordt, terwijl het programma in kwestie gewoon een stuk software is om een hardware programmer (want zo héét dat ding) aan te sturen.

Maar goed, ze zijn vaak wel leuk om ter afwisseling te lezen...

[ Voor 4% gewijzigd door Soultaker op 09-02-2006 03:19 ]


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 10-09 08:45

Bosmonster

*zucht*

Zolang er geen beter alternatief is voor The Daily WTF zullen we het toch daar maar mee moeten doen.

Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 12:38

Cyphax

Moderator LNX
Soultaker schreef op donderdag 09 februari 2006 @ 03:19:
The Daily WTF is wel leuk, maar ze ondermijnen hun geloofwaardigheid enigzins door regelmatig met hele slechte voorbeelden te komen. Dan plaatsen ze dingen die twijfelachtig overkomen, maar als je er over nadenkt eigenlijk heel redelijk zijn en dan wordt het een potje met z'n allen lachen om die 'domme' ontwikkelaars. Ik denk dat iedereen bij gebrek aan tijd, kennis of motivatie regelmatig suboptimale oplossingen creëert; The Daily WTF zou zich moeten beperken tot de voorbeelden die zo absurd zijn dat je je afvraagt hoe de auteur in godsnaam software-ontwikkelaar is geworden.

Voorbeelden van slechte WTF's op alleen de voorpagina al: Drive-By Architecture waarin ze een slecht ingescand schema uit z'n context rukken om degene die het getekend heeft weg te zetten als een idioot. (Wie wel eens met een whiteboard erbij met een stel collega's overlegd heeft, weet dat er aan het bord op het einde absoluut niet af te leiden is waarover allemaal gesproken is - een voor een voorbijganger onbegrijpelijk schema betekent absoluut niet dat het overleg niet nuttig of van inhoudelijk laag nivo was.)

Of deze foutmeldingen, waarbij ze de foutmelding "Communication Error with Programmer" wegzetten alsof dat zou suggereren dat de software-ontwikkelaar bedoelt wordt, terwijl het programma in kwestie gewoon een stuk software is om een hardware programmer (want zo héét dat ding) aan te sturen.

Maar goed, ze zijn vaak wel leuk om ter afwisseling te lezen...
Los van het feit dat je dat hier ook ziet in dit draadje, af en toe: Ik zie je eerste voorbeeld niet als "afschilderen als idioot" (opzettelijk) omdat het veel leuker is om het veel milder op te vatten en mensen niet uit te lachen maar ermee te lachen. :P
Inderdaad, er staan vaak WTF's op die het predikaat "WTF" niet waard zijn (in eerste, danwel tweede instantie) maar er staan een paar mooie tussen waar ik smakelijk om heb gelachen, al dan niet om sommige van de reacties...
function Batman()
function Batman()(again)
#include "pascal.h"
1, 1 or 1, or if you really want, 1
Do it! Do it! Do it! (voorbeeldje van wat Soultaker bedoelde maar toch grappig)
En natuurlijk de legendarische If i++ increments...

[ Voor 13% gewijzigd door Cyphax op 09-02-2006 08:46 ]

Saved by the buoyancy of citrus


Acties:
  • 0 Henk 'm!

  • Lethalis
  • Registratie: April 2002
  • Niet online
XTerm schreef op zaterdag 29 maart 2003 @ 12:54:
Dit stond overlaast op /. en is me bijgebleven :P
code:
1
2
3
gets(userEntry);
     if (memcmp(userEntry, correctPassword, strlen(userEntry)) != 0)
         return (BAD_PASSWORD);
Ik moet wel lachen om stukjes code in dit topic, maar deze is echt te cool :)

Waar ik altijd de grootste blunders tegenkom, is bij code die SQL aanroept.

Heel dom voorbeeld (verzonnen, het gaat om het idee):

cmd.CommandText = "SELECT customer.id FROM customer WHERE customer.[name] = @name";
// ..
int id = (int) cmd.ExecuteScalar();

cmd.CommandText = "SELECT * FROM order WHERE order.customer_id = @id"
// .. code die orders inleest

Oftewel: onnodige roundtrips :)

Ask yourself if you are happy and then you cease to be.


Acties:
  • 0 Henk 'm!

Verwijderd

Cyphax schreef op donderdag 09 februari 2006 @ 08:32:
maar er staan een paar mooie tussen waar ik smakelijk om heb gelachen, al dan niet om sommige van de reacties...
Mijn absolute favoriet blijft toch de Brillant Paula bean [sic]:

http://thedailywtf.com/forums/40043/ShowPost.aspx

Nog nooit zo gelachen om iets wat eigenlijk zo flauw is. :D

Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 10-09 23:49

TeeDee

CQB 241

Verwijderd schreef op donderdag 09 februari 2006 @ 12:07:
[...]
Mijn absolute favoriet blijft toch de Brillant Paula bean [sic]:
http://thedailywtf.com/forums/40043/ShowPost.aspx
Nog nooit zo gelachen om iets wat eigenlijk zo flauw is. :D
Offtopic:
Mjah, feit is gewoon dat ik dit echt niet kan geloven. Ik bedoel, als je een paar maanden aan zo'n systeem zit, en de weekly reports alleen mondeling doorneemt zit er wat chronisch fout in je bedrijfsvoering.

Buiten dat is het wel een geestig stukkie code netulèk.

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Neit echt slecht dit, maar toch wel een van de meest vreemde functies die ik heb geschreven... duidelijk wat er gebeurt toch?

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
void PerspectiveNPoint::getPolynomialDirect(int p1, int p2, int p3, std::vector<NumType>& result) const {
    result.push_back(
        Power(Power(distance(p1,p2),2) + Power(distance(p1,p3) - distance(p2,p3),2) -
        2*distance(p1,p2)*((-1 + 2*Power(angle(p2,p3),2))*distance(p1,p3) + distance(p2,p3)),2)
    );

    result.push_back(
        8*((-1 + angle(p1,p2)*angle(p1,p3)*angle(p2,p3) + Power(angle(p2,p3),2) +
                Power(angle(p1,p3),2)*(1 - 2*Power(angle(p2,p3),2)))*Power(distance(p1,p2),3) -
            Power(distance(p1,p3) - distance(p2,p3),2)*
            ((1 - angle(p1,p2)*angle(p1,p3)*angle(p2,p3) - Power(angle(p2,p3),2) +
                    Power(angle(p1,p2),2)*(-1 + 2*Power(angle(p2,p3),2)))*distance(p1,p3) +
                (-1 + Power(angle(p1,p2),2) + Power(angle(p1,p3),2) - angle(p1,p2)*angle(p1,p3)*angle(p2,p3))*
                distance(p2,p3)) - Power(distance(p1,p2),2)*
            ((3 - 2*Power(angle(p1,p3),2) - 7*Power(angle(p2,p3),2) + 4*Power(angle(p2,p3),4) +
                    angle(p1,p2)*angle(p1,p3)*angle(p2,p3)*(5 - 4*Power(angle(p2,p3),2)) +
                    Power(angle(p1,p2),2)*(-1 + 2*Power(angle(p2,p3),2)))*distance(p1,p3) +
                (-3 + Power(angle(p1,p2),2) + angle(p1,p2)*angle(p1,p3)*angle(p2,p3) + 2*Power(angle(p2,p3),2) +
                    Power(angle(p1,p3),2)*(3 - 4*Power(angle(p2,p3),2)))*distance(p2,p3)) +
            distance(p1,p2)*((-3 + 2*Power(angle(p1,p2),2) + Power(angle(p1,p3),2) +
                    Power(angle(p2,p3),2)*(7 - 2*Power(angle(p1,p3),2) - 4*Power(angle(p2,p3),2)) +
                    angle(p1,p2)*angle(p1,p3)*angle(p2,p3)*(-5 + 4*Power(angle(p2,p3),2)))*Power(distance(p1,p3),2) +
                2*(3 - 2*Power(angle(p1,p2),2) - 2*Power(angle(p1,p3),2) - 4*Power(angle(p2,p3),2) +
                    angle(p1,p2)*angle(p1,p3)*angle(p2,p3)*(3 + 2*Power(angle(p2,p3),2)))*distance(p1,p3)*distance(p2,p3)\
                + (-3 + 2*Power(angle(p1,p2),2) - angle(p1,p2)*angle(p1,p3)*angle(p2,p3) + Power(angle(p2,p3),2) +
                    Power(angle(p1,p3),2)*(3 - 2*Power(angle(p2,p3),2)))*Power(distance(p2,p3),2)))
    );
    result.push_back(
        8*((3 + 2*Power(angle(p1,p3),4) - 5*Power(angle(p2,p3),2) + 2*Power(angle(p2,p3),4) +
                Power(angle(p1,p2),2)*(-1 + 2*Power(angle(p1,p3),2) + 2*Power(angle(p2,p3),2)) -
                2*angle(p1,p2)*angle(p1,p3)*angle(p2,p3)*(-1 + 2*Power(angle(p1,p3),2) + 2*Power(angle(p2,p3),2)) +
                Power(angle(p1,p3),2)*(-5 + 6*Power(angle(p2,p3),2)))*Power(distance(p1,p2),2) +
            (3 + 2*Power(angle(p1,p2),4) - 4*Power(angle(p1,p2),3)*angle(p1,p3)*angle(p2,p3) -
                5*Power(angle(p2,p3),2) + 2*Power(angle(p2,p3),4) +
                2*angle(p1,p2)*angle(p1,p3)*angle(p2,p3)*(1 - 2*Power(angle(p2,p3),2)) +
                Power(angle(p1,p3),2)*(-1 + 2*Power(angle(p2,p3),2)) +
                Power(angle(p1,p2),2)*(-5 + 2*Power(angle(p1,p3),2) + 6*Power(angle(p2,p3),2)))*
            Power(distance(p1,p3),2) - 2*(2*Power(angle(p1,p2),4) -
                4*Power(angle(p1,p2),3)*angle(p1,p3)*angle(p2,p3) -
                3*(-1 + Power(angle(p1,p3),2) + Power(angle(p2,p3),2)) +
                2*angle(p1,p2)*angle(p1,p3)*angle(p2,p3)*(1 + Power(angle(p1,p3),2) + Power(angle(p2,p3),2)) +
                Power(angle(p1,p2),2)*(-5 + 4*Power(angle(p2,p3),2) -
                    4*Power(angle(p1,p3),2)*(-1 + Power(angle(p2,p3),2))))*distance(p1,p3)*distance(p2,p3) +
            (3 - 5*Power(angle(p1,p2),2) + 2*Power(angle(p1,p2),4) - 5*Power(angle(p1,p3),2) +
                6*Power(angle(p1,p2),2)*Power(angle(p1,p3),2) + 2*Power(angle(p1,p3),4) -
                2*angle(p1,p2)*angle(p1,p3)*(-1 + 2*Power(angle(p1,p2),2) + 2*Power(angle(p1,p3),2))*angle(p2,p3) +
                (-1 + 2*Power(angle(p1,p2),2) + 2*Power(angle(p1,p3),2))*Power(angle(p2,p3),2))*
            Power(distance(p2,p3),2) - 2*distance(p1,p2)*
            ((3*(-1 + Power(angle(p1,p2),2) + Power(angle(p1,p3),2)) +
                    2*angle(p1,p2)*angle(p1,p3)*(-5 + Power(angle(p1,p2),2) + Power(angle(p1,p3),2))*angle(p2,p3) -
                    (-7 + 2*Power(angle(p1,p3),2) + Power(angle(p1,p2),2)*(2 + 4*Power(angle(p1,p3),2)))*
                    Power(angle(p2,p3),2) + 8*angle(p1,p2)*angle(p1,p3)*Power(angle(p2,p3),3) - 4*Power(angle(p2,p3),4)
                    )*distance(p1,p3) + (3 - 5*Power(angle(p1,p3),2) + 2*Power(angle(p1,p3),4) +
                    2*Power(angle(p1,p2),3)*angle(p1,p3)*angle(p2,p3) +
                    (-3 + 4*Power(angle(p1,p3),2))*Power(angle(p2,p3),2) +
                    2*angle(p1,p2)*angle(p1,p3)*angle(p2,p3)*(1 - 2*Power(angle(p1,p3),2) + Power(angle(p2,p3),2)) +
                    Power(angle(p1,p2),2)*(-3 - 4*Power(angle(p1,p3),2)*(-1 + Power(angle(p2,p3),2))))*distance(p2,p3)
                ))
    );
    result.push_back(
            -32*(-1 + Power(angle(p1,p2),2) + Power(angle(p1,p3),2) -
        2*angle(p1,p2)*angle(p1,p3)*angle(p2,p3) + Power(angle(p2,p3),2))*
        ((-1 + Power(angle(p1,p3),2) - angle(p1,p2)*angle(p1,p3)*angle(p2,p3) + Power(angle(p2,p3),2))*
        distance(p1,p2) + (-1 + Power(angle(p1,p2),2) - angle(p1,p2)*angle(p1,p3)*angle(p2,p3) +
            Power(angle(p2,p3),2))*distance(p1,p3) +
        (1 - Power(angle(p1,p3),2) + angle(p1,p2)*
            (angle(p1,p2)*(-1 + 2*Power(angle(p1,p3),2)) - angle(p1,p3)*angle(p2,p3)))*distance(p2,p3))
    );
    result.push_back(
        16*Power(-1 + Power(angle(p1,p2),2) + Power(angle(p1,p3),2) - 2*angle(p1,p2)*angle(p1,p3)*angle(p2,p3) +
            Power(angle(p2,p3),2),2)
    );
}

Acties:
  • 0 Henk 'm!

  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Jep, een berekening om de directe polynomial terug te krijgen, toch?! :)
Maar euhh, kon je geen gestructureerdere manier verzinnen?

Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

-FoX- schreef op donderdag 09 februari 2006 @ 12:52:
Jep, een berekening om de directe polynomial terug te krijgen, toch?! :)
Maar euhh, kon je geen gestructureerdere manier verzinnen?
Precies! :) Nee, ik durfde niets te veranderen aan de CForm[] output van mathematica, dus heb ik er ook functies angle() distance() en Power() bij geschreven, zodat ik niks hoefde te vervangen. dit is geen code waar je handmatig iets in wilt vervangen... een haakje verkeerd en het werkt niet...

Acties:
  • 0 Henk 'm!

  • Knutselsmurf
  • Registratie: December 2000
  • Nu online

Knutselsmurf

LED's make things better

Zoijar schreef op donderdag 09 februari 2006 @ 12:35:
Neit echt slecht dit, maar toch wel een van de meest vreemde functies die ik heb geschreven... duidelijk wat er gebeurt toch?

C++:
1
heel veel code...
Voor dit soort dingen hebben ze commentaar uitgevonden :) Wat ik zo snel zie is dit de implementatie van een of andere vector-operatie. In zo'n geval zou ik toch echt deze operatie noemen in commentaar. Iemand die eventueel deze code moet debuggen, kan dan zien:
1) de gebruikte operatie is correct
2) de geschreven code is een implementatie van de genoemde operatie

- This line is intentionally left blank -


Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

This calls for:
C++:
1
// You were not meant to understand this

:+

Professionele website nodig?


Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 12:38

Cyphax

Moderator LNX
curry684 schreef op donderdag 09 februari 2006 @ 13:06:
This calls for:
C++:
1
// You were not meant to understand this

:+
:)
Ik had er waarschijnlijk bijgezet:
C++:
1
// You're not supposed to understand this. I sure as hell don't understand it, so don't bother asking.

Saved by the buoyancy of citrus


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
curry684 schreef op donderdag 09 februari 2006 @ 13:06:
This calls for:
C++:
1
// You were not meant to understand this

:+
Of
C++:
1
// It was hard to write so it should be hard to read

:+

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • BasSpruit
  • Registratie: September 2002
  • Laatst online: 09-04-2022
(Ik ben een VB-er)

code:
1
2
3
4
if (var = true) {
//Code
var = false
}


Wat ik ook tegenkom: btnLogin. Je hebt het over een loginbutton, maar het object heet btnLogin. 8)7 Naming conventies zijn leuk...

Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 12:38

Cyphax

Moderator LNX
ChaosDream schreef op donderdag 09 februari 2006 @ 13:16:
(Ik ben een VB-er)

code:
1
2
3
4
if (var = true) {
//Code
var = false
}


Wat ik ook tegenkom: btnLogin. Je hebt het over een loginbutton, maar het object heet btnLogin. 8)7 Naming conventies zijn leuk...
Dat is toch gewoon Hongaarse notatie... een keuze, geen "slecht voorbeeld" of begrijp ik je nu niet? :)
(geen porem, Hongaarse notatie, daar niet van :P)

Saved by the buoyancy of citrus


Acties:
  • 0 Henk 'm!

  • BasSpruit
  • Registratie: September 2002
  • Laatst online: 09-04-2022
Cyphax schreef op donderdag 09 februari 2006 @ 13:23:
[...]

Dat is toch gewoon Hongaarse notatie... een keuze, geen "slecht voorbeeld" of begrijp ik je nu niet? :)
Mijn punt is dat dit te kust en te keur wordt gebruikt. (ik zit nu op een VB6 project waar er namen van methoden zijn geschreven die 3 / 4 afkortingen gebruiken)
(geen porem, Hongaarse notatie, daar niet van :P)
_/-\o_

[ Voor 16% gewijzigd door BasSpruit op 09-02-2006 13:28 ]


Acties:
  • 0 Henk 'm!

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Hongaarse notatie moet echt zo hard dood.
En afgekorte namen ook.

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 12:38

Cyphax

Moderator LNX
ChaosDream schreef op donderdag 09 februari 2006 @ 13:27:
[...]


Mijn punt is dat dit te kust en te keur wordt gebruikt. (ik zit nu op een VB6 project waar er namen van methoden zijn geschreven die 3 / 4 afkortingen gebruiken)
Okee, dat is vervelend idd maar dat kwam uit je voorbeeld niet zo goed naar voren. :)
Naamgeving vind ik ook lastig. Alleen in Javascript niet, ik heb de neiging scriptjes zo compact mogelijk te houden en dan verzin ik gewoon een normale naam, en kort het dan af. :P
Zoiets dus:
JavaScript:
1
2
3
4
5
6
7
8
9
function fillInput(e){ 
  var se=(!e?window.event.srcElement:e.target),ui=document.getElementById('userinput'),pi=document.getElementById('woonplaats');
  if(se.tagName.toLowerCase()=="dd"){pi.value=se.firstChild.data;
    ui.value=se.previousSibling.firstChild.data;}
  else{pi.value=se.nextSibling.firstChild.data;
    ui.value=se.firstChild.data;}
  ui.focus();
  emptyWordList();
}
:+

[ Voor 6% gewijzigd door Cyphax op 09-02-2006 13:30 ]

Saved by the buoyancy of citrus


Acties:
  • 0 Henk 'm!

Verwijderd

Een Vector gebruiken om 1 object in op te slaan ipv gewoon het betreffende object terug te geven:

Java:
1
2
3
4
5
public Vector fetchArticle(int articleid) {
     Vector article = new Vector();
     // KNIPPERDEKNIP
     return article;
}



8)7

Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Knutselsmurf schreef op donderdag 09 februari 2006 @ 13:05:
Voor dit soort dingen hebben ze commentaar uitgevonden :) Wat ik zo snel zie is dit de implementatie van een of andere vector-operatie. In zo'n geval zou ik toch echt deze operatie noemen in commentaar. Iemand die eventueel deze code moet debuggen, kan dan zien:
1) de gebruikte operatie is correct
2) de geschreven code is een implementatie van de genoemde operatie
Ja, hoewel het een private member is. De class zelf is toch te ingewikkeld om te begrijpen zonder het paper erbij te lezen. Class documentatie staat wel dit bij:

// Solves the Perspective N-Point problem by SVD
// Given 'n' 2d points, 'n' corresponding 3d points, and a camera calibration matrix,
// this will solve for the z-depth coordinates of the 2d points. (Long Quan's linear-PnP)
// These calculated 3d points can then in turn be used to construct
// a transformation matrix from the image to the model using an absolute orientation
// method (Horn's closed-form quaternion method)

Vond ik genoeg :) Tsja of toch zoals gesuggereerd:

"This was hard enough to write, so it should damn well be hard to read"

past goed bij ander commentaar daar:

//Hmmm this is bad. And theoretically not allowed either.
of
// TODO: Warning: we ignore degree one points. it seems to work, but we dontknow what side effects
// this might cause... so far so good...

:D

Acties:
  • 0 Henk 'm!

  • bodiam
  • Registratie: December 2001
  • Laatst online: 31-12-2024
Verwijderd schreef op donderdag 09 februari 2006 @ 13:30:
Een Vector gebruiken om 1 object in op te slaan ipv gewoon het betreffende object terug te geven:

Java:
1
2
3
4
5
public Vector fetchArticle(int articleid) {
     Vector article = new Vector();
     // KNIPPERDEKNIP
     return article;
}


8)7
Haha, en ik maar denken dat het ging om een Vector als returntype, ipv een List......
(of is dit pre 1.2?)

Acties:
  • 0 Henk 'm!

Verwijderd

TeeDee schreef op donderdag 09 februari 2006 @ 12:11:
[...]

Offtopic:
Mjah, feit is gewoon dat ik dit echt niet kan geloven. Ik bedoel, als je een paar maanden aan zo'n systeem zit, en de weekly reports alleen mondeling doorneemt zit er wat chronisch fout in je bedrijfsvoering.
Zoals je in de velen replies kan lezen -kan- het dus wel. En om eerlijk te zijn, bij ons zou dit ook zomaar kunnen gebeuren. Het gaat er te vaak aan toe van: hier is een TODO puntje, dat houdt in dat er ongeveer zus en zo moet worden gedaan, ga het maar programmeren! Dan 6 weken later voor de deadline dat de nieuwe versie live gaat (we maken een web-app) zou diegene nog kunnen zeggen dat het niet niet klaar is, en dan pas bij de volgende deadline zou die persoon door de mand vallen. In dit geval hebben we het ook over een 12 weken.

In feite is dit een WTF! kwa (development) process en niet zozeer kwa coding.
Buiten dat is het wel een geestig stukkie code netulèk.
Het is nog bekend geworden ook. "Paula is brillant" ben ik al meerdere keren als sig tegengekomen. Die maar eens een google search op "paula bean" ;)

Acties:
  • 0 Henk 'm!

Verwijderd

Haha, en ik maar denken dat het ging om een Vector als returntype, ipv een List......
(of is dit pre 1.2?)
Verbaasd u niet, verwonderd u slechts ;)

Komt tijd komt verstand zal ik maar zeggen, deze code heb ik 2 weken geleden getikt en toen was het echt al 1.5, scheelt wel dat ik in totaal nu 4 weken 'ervaring' heb en nog een hoop moet leren ;)

[ Voor 26% gewijzigd door Verwijderd op 09-02-2006 16:14 ]


Acties:
  • 0 Henk 'm!

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Verwijderd schreef op donderdag 09 februari 2006 @ 16:12:
[...]


Verbaasd u niet, verwonderd u slechts ;)
Sorry :X maar deze is wel heel erg ... twee keer stam + t, maar correcter is zonder t, want gebiedende wijs.
En volgens mij is het iets van: Erger u niet, verwonder u slechts.

O-)

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 10-09 23:49

TeeDee

CQB 241

Verwijderd schreef op donderdag 09 februari 2006 @ 16:10:
[...]

In feite is dit een WTF! kwa (development) process en niet zozeer kwa coding.
[...]
Wat ik hier weleens bespeur (vnl. stagiares e.d.) is dat ze niet durven te zeggen dat ze de deadline niet gaan halen. Misschien is dat bij jullie ook wel eens?
Het is nog bekend geworden ook. "Paula is brillant" ben ik al meerdere keren als sig tegengekomen. Die maar eens een google search op "paula bean" ;)
Ik weet het, heb al geruime tijd thedailywtf in mijn dagelijkse lunchpauze bekijk dingen ;)

Kwam laatst dit tegen:
C#:
1
2
3
4
5
6
7
8
9
10
11
if(Request.QueryString["finish"]=="true")
{
    Panel1.Visible=false;
    Panel2.Visible=false;
    Panel3.Visible=false;
    Panel4.Visible=false;
    Panel5.Visible=false;
    Panel6.Visible=false;
    Panel7.Visible=true;//in feite overbodig, omdat er geredirect wordt naar bedankt.html
    PlaceOrder();
}

Goed, Panel7 bevat nog het e.e.a., blijkbaar niet interessant genoeg.

Het mooiste is natuurlijk Querystring["finish"] == "true".
In PlaceOrder() wordt nergens gechecked of een aantal zaken wel ingevuld zijn, maar wel overal default values. M.a.w.: iemand die de url weet, stuk of 100 keer op F5 rost zorgt ervoor dat er 100 nietszeggende Orders in het systeem staan.

And to top it all off: Dit staat in de Page_Load.

[ Voor 5% gewijzigd door TeeDee op 09-02-2006 16:25 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

Verwijderd

TeeDee schreef op donderdag 09 februari 2006 @ 16:24:
[...]
Wat ik hier weleens bespeur (vnl. stagiares e.d.) is dat ze niet durven te zeggen dat ze de deadline niet gaan halen. Misschien is dat bij jullie ook wel eens?
Tsja, ons hele bedrijfje bouwt eigenlijk alleen maar op stagiares. Er zijn maar enkele vaste medewerkers, voor de rest is iedereen stagiare of afstudeerder. Durven te zeggen hebben we nog niet echt meegemaakt, maar wel dat stagiares bijvoorbeeld niet aan java files durven te komen en dus maar alles in de JSP files zetten. Dat komt dan ook pas veel later aan het licht.

Ook andersom hebben we wel gehad, een economie student die wat aan de interface moest veranderen en toen maar van alles ging 'coden' terwijl ie 0.0% verstand had van abstractie of modularisatie en eigenlijk ook niet van programmeren zelf.

Dat was kwa coding ook een echte WTF!

Stond gewoon boven elke pagina iets van:

code:
1
2
3
if ( situatie == x ) laat specificieke dingen zien als pagina in traject X wordt gebruikt
if ( situatie == y ) laat specificieke dingen zien voor traject Y
etc


In plaats van dat je pageflows defineert en binnen die flows eventueel componenten hergebruikt, zag hij dus een pagina als vast component en liet die pagina afhankelijk van tig globale (session) variabelen een dozijn verschillende rollen spelen. Helemaal op het laatst kwam ie nog een keertje vragen wat een class nou precies was in Java! |:(

Acties:
  • 0 Henk 'm!

  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 01-09 22:18
Ik was gister niet helemaal wakker, waardoor hij altijd een foutmelding bij een leeg invoerveld gaf :X

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
            int partijNr = -1;
            try
            {
                if (txtPartijnr.Text != "") partijNr = Convert.ToInt32(txtPartijnr.Text);
                if (partijNr < 0) throw (new Exception());
            }
            catch
            {
                MessageBox.Show("Het partijnummer dient een geheel getal te zijn", "Foutmelding");
                ClearKopgegevensInvoervelden(true);
                txtPartijnr.Focus();
                return;
            }

            if (txtPartijnr.Text != "")
            {
                DateTime analysedatum = dtpAnalysedatumInvoer.Value;

                //_monstersCol = new MonstersCollection();
                PredicateExpression select = new PredicateExpression();
                select.Add(PredicateFactory.CompareValue(PartijFieldIndex.PartijNr, ComparisonOperator.Equal, partijNr));

                PartijCollection tmpCol = new PartijCollection();
                tmpCol.GetMulti(select);

                if (tmpCol.Count == 0)
                {
                    // partij bestaat niet
                    MessageBox.Show("De partij bestaat niet. Voer een ander partijnummer in.", "Foutmelding");
                    ClearKopgegevensInvoervelden();
                    return;
                }
                else
                {
                    // partij bestaat wel
                    _currentPartijEnt = tmpCol[0];
                }

Acties:
  • 0 Henk 'm!

Verwijderd

Mastermind schreef op donderdag 09 februari 2006 @ 16:53:
Ik was gister niet helemaal wakker, waardoor hij altijd een foutmelding bij een leeg invoerveld gaf :X

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
            int partijNr = -1;
            try
            {
                if (txtPartijnr.Text != "") partijNr = Convert.ToInt32(txtPartijnr.Text);
                if (partijNr < 0) throw (new Exception());
            }
            catch
            {
                MessageBox.Show("Het partijnummer dient een geheel getal te zijn", "Foutmelding");
                ClearKopgegevensInvoervelden(true);
                txtPartijnr.Focus();
                return;
            }

            if (txtPartijnr.Text != "")
            {
                DateTime analysedatum = dtpAnalysedatumInvoer.Value;

                //_monstersCol = new MonstersCollection();
                PredicateExpression select = new PredicateExpression();
                select.Add(PredicateFactory.CompareValue(PartijFieldIndex.PartijNr, ComparisonOperator.Equal, partijNr));

                PartijCollection tmpCol = new PartijCollection();
                tmpCol.GetMulti(select);

                if (tmpCol.Count == 0)
                {
                    // partij bestaat niet
                    MessageBox.Show("De partij bestaat niet. Voer een ander partijnummer in.", "Foutmelding");
                    ClearKopgegevensInvoervelden();
                    return;
                }
                else
                {
                    // partij bestaat wel
                    _currentPartijEnt = tmpCol[0];
                }
PartijCollection??? ClearKopgegevensInvoervelden??? _currentPartijEnt???

WTF!? ;)

Acties:
  • 0 Henk 'm!

  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
Ik heb keer een functie gemaakt in asp om waardes op te splisen, wist ik veel dat er zoiets als split bestond ;)

code:
1
2
3
4
5
6
7
8
9
10
11
        function splitstring(string,divider)
        For counter1 = 1 To len(string)
            if Mid(string,counter1,1) <> divider Then
                counter2 = counter2 + 1
            Else
                tempstring = cint(Mid(string,counter1-counter2,counter2))
                response.write(tempstring & "<BR>")
                counter2 = 0
            End if
        Next 
        End function

Acties:
  • 0 Henk 'm!

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 10-09 19:57

Robtimus

me Robtimus no like you

raptorix schreef op donderdag 09 februari 2006 @ 17:14:
Ik heb keer een functie gemaakt in asp om waardes op te splisen, wist ik veel dat er zoiets als split bestond ;)

code:
1
2
3
4
5
6
7
8
9
10
11
        function splitstring(string,divider)
        For counter1 = 1 To len(string)
            if Mid(string,counter1,1) <> divider Then
                counter2 = counter2 + 1
            Else
                tempstring = cint(Mid(string,counter1-counter2,counter2))
                response.write(tempstring & "<BR>")
                counter2 = 0
            End if
        Next 
        End function
Gebruik dan op zijn minst InStr om direct te zoeken naar je divider ;)

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Acties:
  • 0 Henk 'm!

  • Lethalis
  • Registratie: April 2002
  • Niet online
ChaosDream schreef op donderdag 09 februari 2006 @ 13:16:
Wat ik ook tegenkom: btnLogin. Je hebt het over een loginbutton, maar het object heet btnLogin. 8)7 Naming conventies zijn leuk...
Dat doe ik ook altijd hoor..

btnLogin
txtUser
lblTitle
cboType

Etc ;)

Ask yourself if you are happy and then you cease to be.


Acties:
  • 0 Henk 'm!

  • Paul
  • Registratie: September 2000
  • Nu online
Lethalis schreef op vrijdag 10 februari 2006 @ 08:57:
[...]

Dat doe ik ook altijd hoor..

btnLogin
txtUser
lblTitle
cboType

Etc ;)
Yup, hier ook. UI-elementen is zo'n beetje de enige plaats waar ik Hongaarse notatie gebruik :)

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


Acties:
  • 0 Henk 'm!

Verwijderd

Sorry :X maar deze is wel heel erg ... twee keer stam + t, maar correcter is zonder t, want gebiedende wijs.
En volgens mij is het iets van: Erger u niet, verwonder u slechts.
:X schaam,
Dat betekent dat ik dus én niet kan programmeren én slecht ben in Nederlands. Damn, I fail in life ;(

[ Voor 22% gewijzigd door Verwijderd op 10-02-2006 14:43 ]


Acties:
  • 0 Henk 'm!

  • Lethalis
  • Registratie: April 2002
  • Niet online
Mastermind schreef op donderdag 09 februari 2006 @ 16:53:
Ik was gister niet helemaal wakker, waardoor hij altijd een foutmelding bij een leeg invoerveld gaf :X

C#:
1
2
3
4
5
6
7
8
9
            int partijNr = -1;
            try
            {
                if (txtPartijnr.Text != "") partijNr = Convert.ToInt32(txtPartijnr.Text);
            }
            catch
            {
..
            }
Een tip: regular expressions ipv try/catch.

Ask yourself if you are happy and then you cease to be.


Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 10-09 23:49

TeeDee

CQB 241

Lethalis schreef op vrijdag 10 februari 2006 @ 14:50:
[...]
Een tip: regular expressions ipv try/catch.
Do explain. Ik zou dit namelijk op een soortgelijke manier doen.
whoami schreef op vrijdag 10 februari 2006 @ 15:20:
[...]
Ipv te Converten en een exceptie opvangen, is het zowiezo beter om eerst te checken of hetgeen je wilt converten wel converteerbaar is naar integer.
Op die manier. Duidelijk, vond het alleen een beetje raar om hier een regexp voor te gebruiken.

[ Voor 45% gewijzigd door TeeDee op 10-02-2006 15:24 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Nu online
TeeDee schreef op vrijdag 10 februari 2006 @ 14:54:
[...]
Do explain. Ik zou dit namelijk op een soortgelijke manier doen.
Ipv te Converten en een exceptie opvangen, is het zowiezo beter om eerst te checken of hetgeen je wilt converten wel converteerbaar is naar integer.
Exceptions gooien is nl. duur, en een try met een lege catch is zowiezo niet netjes.

Echter, regexen gebruiken is in dit geval nu ook niet direct nodig. Double.TryParse zou ook al een uitkomst kunnen bieden.

Zo bv:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
double result;
if(  Double.TryParse (textBox1.Text, 
                   System.Globalization.NumberStyles.Integer,
                   System.Threading.Thread.CurrentThread.CurrentCulture, 
                   out result) )
{
    int i = Convert.ToInt32 (result);
    MessageBox.Show (i.ToString());
}
else
{
    MessageBox.Show ("invalid.");
}

[ Voor 26% gewijzigd door whoami op 10-02-2006 15:26 ]

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • WormLord
  • Registratie: September 2003
  • Laatst online: 01-08 12:04

WormLord

Devver

Een tijdje geleden kwam ik de volgende code tegen tijdens een code-review. Blijkbaar kent toch niet iedereen de ToString() functionaliteit :)
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private string PrepareDate()
{
    string fDate = "";
    string year, month, day;

    DateTime currTime = DateTime.Now;

    year = currTime.Year + "";
    month = currTime.Month + "";
    day = currTime.Day + "";

    if(month.Length == 1)
        month = "0" + month;

    if(day.Length == 1)
        day = "0" + day;

    fDate = year + month + day;
    return fDate;
}

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
In een Date class zeker? Wat vreemd ik vreemd vind is de variable fDate. Die zou naar mijn gevoel van het datatype boolean zijn (f voor flag volgens de hungarian notation) of eventueel een float. String is dan niet echt iets wat ik zou verwachten.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Michali schreef op vrijdag 17 februari 2006 @ 09:10:
In een Date class zeker? Wat vreemd ik vreemd vind is de variable fDate. Die zou naar mijn gevoel van het datatype boolean zijn (f voor flag volgens de hungarian notation) of eventueel een float. String is dan niet echt iets wat ik zou verwachten.
f*ckedupDate ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Zal waarschijnlijk wel bedoeld zijn als formattedDate of iets dergelijks. Toch zou ik het zelf makkelijker vinden om het zo te doen ;)
C#:
1
string formattedDate = DateTime.Now.ToString( "YYMMdd" );

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • WormLord
  • Registratie: September 2003
  • Laatst online: 01-08 12:04

WormLord

Devver

Dat was inderdaad de bedoeling. En nee, het komt niet uit een Date-class, maar uit een class die ergens een formatted date nodig heeft. |:(

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Ah, dat had ik niet eens kunnen bedenken. Beetje slecht om dat dan te gebruiken alsof het wel die notatie is. Erg verwarrend.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
whoami schreef op vrijdag 10 februari 2006 @ 15:20:
Ipv te Converten en een exceptie opvangen, is het zowiezo beter om eerst te checken of hetgeen je wilt converten wel converteerbaar is naar integer.
Exceptions gooien is nl. duur, en een try met een lege catch is zowiezo niet netjes.

Echter, regexen gebruiken is in dit geval nu ook niet direct nodig. Double.TryParse zou ook al een uitkomst kunnen bieden.
Is er geen parse functie die gewoon een error returned?
Want TryParse en dan Parse is ook een beetje dubbelop.

Acties:
  • 0 Henk 'm!

  • cvs79
  • Registratie: April 2002
  • Laatst online: 09:27
TryParse geeft ook een result terug. Dus hij returnt een error code eventueel en ook al de geconverteerde waarde als het gelukt is.

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
OlafvdSpek schreef op vrijdag 17 februari 2006 @ 15:54:
[...]

Is er geen parse functie die gewoon een error returned?
Want TryParse en dan Parse is ook een beetje dubbelop.
Als het te verwachten is dat er ooit een foute waarde voor zou kunnen komen, en je kunt er op controleren, dan zou ik dan zeker doen. Puur de exception opvangen zonder controle is dan een stuk minder netjes imo.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
void current_time_details(int& sec, int& minute, int& hour, char dow[],
                          int& day, char cmon[], int& month, int& year)
{
  time_t p;
  time(&p);
  char tem[64];
  strcpy(tem,ctime(&p));
  
  // extract details from, e.g.: Fri Nov 11 13:49:53 2005

  // get the day of the week, i.e. Mon, Tue etc
  strncpy(dow,tem,3); dow[3]=0;
  int l=strlen(tem);

  // get the hour, minute and sec
  int i, j=0;
  for(i=0; i<l; i++)
   if(tem[i]==':'){j=i; break;}
  tem[j]=tem[j+3]=tem[j+6]=0;
  sscanf(&tem[j-2],"%d",&hour);
  sscanf(&tem[j+1],"%d",&minute);
  sscanf(&tem[j+4],"%d",&sec);
  sscanf(&tem[j+7],"%d",&year);

  // get the month of the year as a number
  char mons[12][4]={"Jan","Feb","Mar","Apr","May","Jun",
                    "Jul","Aug","Sep","Oct","Nov","Dec"};
  tem[7]=0;
  for(i=0; i<12; i++)
  {
    if(strcmp(&tem[4],mons[i])==0){strcpy(cmon,mons[i]); month=i+1; break;}
  }

  // get the day
  sscanf(&tem[8],"%d",&day);

}

Acties:
  • 0 Henk 'm!

  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

Op mijn werk kwam ik pas code tegen van een stagiaire. Die had een regel van een paar honderd karakters breed geprogrammeerd, met allemaal Integer objecten erin. Die gast had om ALLES String.valueOf() heengezet. Zelfs om Strings. En daarna weer teruggecast naar Integers. Ik alles eruit slopen, paste het makkelijk op mijn scherm. :P

Fat Pizza's pizza, they are big and they are cheezy


Acties:
  • 0 Henk 'm!

  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
Mogen domme vouten ook?

Deze heeft me vandaag wat hoofdbrekens gekost :(

(eigen code btw)

uitleg: deze methode is de hoofd methode van een service die mail uitleest en verwerkt Deze service runt iedere seconde. . Per run leest de service heel de mail box uit en verwerkt ieder mailtje. Om te voorkomen dat de code runt op het moment dat deze bezig is, heb ik de busy geintroduceerd.

Ik snapte maar niet waarom ieder mailtje zo'n x maal achter elkaar verwerkt werd |:(

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
     public void RunOnce()
        {

            MailHandler mailHandler = new MailHandler();

            bool conn_open = false;
            bool busy = false;

           
                try
                {
                    if (!busy)
                     {
                        busy = true;
                        //hier ging ik mail ophalen en verwerken
                     }
                }
                catch (Exception ex)
                {
                    //hier stond wat exeption handling zooi
                }   
                finally
                {
                    busy = false;
                    //hier stond nog wat code
                }
            }
        }

[ Voor 5% gewijzigd door 4of9 op 30-03-2006 15:52 ]

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


Acties:
  • 0 Henk 'm!

  • cvs79
  • Registratie: April 2002
  • Laatst online: 09:27
Volgens mij had je nog wat soep in je ogen toe je dat zal te lezen. Want deze ligt wel heel erg voor de hand

Acties:
  • 0 Henk 'm!

  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
ik denk het ook (ik schaarde hem daarom ook onder domme fouten :o )

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


Acties:
  • 0 Henk 'm!

  • RetepV
  • Registratie: Juli 2001
  • Laatst online: 29-04 22:20

RetepV

ALLES valt te repareren

Erkens schreef op zaterdag 29 maart 2003 @ 11:51:
Zelf vergeet ik altijd exeption handling, behalve als de compiler begint te zeuren
Exception handling op zich is al slecht. :D

Als je exception handling volledig gaat implementeren, wordt je programma zwaar ondoorzichtig. De foutafhandeling komt niet direkt na de plek waar de fout optreedt, maar pas verderop. Of je krijgt zo veel geneste haakjes dat je het zelf niet meer snapt als je je code later terugleest.

Dus veel mensen implementeren het maar gedeeltelijk, om de code nog onderhoudbaar te houden. Maar laat het exception handling dan maar gelijk volledig achterwege.

Zorg er voor dat je functies gewoon foutwaardes retourneren, zoals in the good old days van C. Dan heb je de foutafhandeling direkt onder de aanroep van de functie.

En als je library functies hebt die exceptions kunnen throwen, schrijf dan een wrapper om die library heen zodat je de exception handling kan verbergen in memberfuncties die dan weer gewoon foutwaardes retourneren.

Hmz. Dit is toch wel wat off-topic. :D Lees eens het boek 'Writing solid code'. Erg goed boek.

Macbook Pro


Acties:
  • 0 Henk 'm!

  • RetepV
  • Registratie: Juli 2001
  • Laatst online: 29-04 22:20

RetepV

ALLES valt te repareren

OlafvdSpek schreef op woensdag 29 maart 2006 @ 23:10:
C++:
1
2
3
4
5
void current_time_details(int& sec, int& minute, int& hour, char dow[],
                          int& day, char cmon[], int& month, int& year)
{

[knip]
Hmm, wat is hier dan fout aan? Het gebruik van strcpy() enzo? Ik vind het duidelijke code (ik heb het niet gechecked op bugs :)), en het is vast een heel stuk efficienter dan wanneer je het met het STL string object zou doen. STL strings zijn leuk, maar als je eens gaat kijken hoeveel onderliggende kopieen er gemaakt worden bij die operaties, dan barst je in huilen uit. Het scheelt al zo een factor 20 in snelheid als je alle string operaties met ouderwetse C zou doen in plaats van met STL strings.

Edit:

Hmm, ik had even over die 'sscanf' functies heen gekeken. Die moet je dus NIET gebruiken zonder te controleren dat de strings die je er in stopt ook is wat je verwacht. Maar als je 100% zeker weet dat wat er in gaat altijd goed is, dan is deze functie prima.

Edit2:

Het was trouwens makkelijker geweest om de localtime() functie te gebruiken om de losse componenten van de tijd te krijgen in een struct tm. Maar dat heeft met de domheid van de oplossing te maken, niet met de domheid van de code.

[ Voor 26% gewijzigd door RetepV op 31-03-2006 11:04 ]

Macbook Pro


Acties:
  • 0 Henk 'm!

  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

RetepV schreef op vrijdag 31 maart 2006 @ 10:53:
[...]


Exception handling op zich is al slecht. :D

Als je exception handling volledig gaat implementeren, wordt je programma zwaar ondoorzichtig. De foutafhandeling komt niet direkt na de plek waar de fout optreedt, maar pas verderop. Of je krijgt zo veel geneste haakjes dat je het zelf niet meer snapt als je je code later terugleest.

Dus veel mensen implementeren het maar gedeeltelijk, om de code nog onderhoudbaar te houden. Maar laat het exception handling dan maar gelijk volledig achterwege.

Zorg er voor dat je functies gewoon foutwaardes retourneren, zoals in the good old days van C. Dan heb je de foutafhandeling direkt onder de aanroep van de functie.

En als je library functies hebt die exceptions kunnen throwen, schrijf dan een wrapper om die library heen zodat je de exception handling kan verbergen in memberfuncties die dan weer gewoon foutwaardes retourneren.

Hmz. Dit is toch wel wat off-topic. :D Lees eens het boek 'Writing solid code'. Erg goed boek.
Sorry, maar hier ben ik het dus absoluut niet mee eens. Exception handling is juist ontzettend handig, tenminste in Java ofzo.

1 Je houdt de logica en extreme gevallen mooi gescheiden, waardoor je code beter te lezen is.
2 Je hoeft niet alle foutcodes die niemand iets zeggen uit je hoofd te leren, maar ziet in een beetje fatsoenlijke IDE meteen welke exceptions opgegooid worden.
3 Je hoeft bijna niks meer te controleren voor gebruik, hooguit voor performance ofzo, aangezien een try catch niet snel is.
4 Als er iets niet OO is, maar heel zwaar old fashioned C en tegenwoordig zo goed als een taboe.

Ik weet ook wel dat tegenwoordig exceptions te veel gebruikt worden, (zoals om een not null check te voorkomen) maar verder is het een zeer sterk hulpmiddel en ik zweer erbij. :P

Om nog verder te gaan, ik zou zelfs het niet gebruiken van het exception mechanisme in een omgeving die het wel ondersteunt, beschouwen als een slecht prog voorbeeld.

Fat Pizza's pizza, they are big and they are cheezy


Acties:
  • 0 Henk 'm!

  • RetepV
  • Registratie: Juli 2001
  • Laatst online: 29-04 22:20

RetepV

ALLES valt te repareren

JKVA schreef op vrijdag 31 maart 2006 @ 11:08:
1 Je houdt de logica en extreme gevallen mooi gescheiden, waardoor je code beter te lezen is.
Goed, ik heb een stukje code van mezelf gevonden. Het stukje code is uit een VB.NET wrapper class om via OLE DB uit een database te lezen. Het toont wel aan hoe erg exception handling je code kan verpesten. Het toont nog iets anders aan, maar dat zet ik even onder het code voorbeeld. :)

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
    Protected Function Execute() As Integer
        If IsNothing(m_DBCommandRef) Then
            Return -1
        End If
        If IsNothing(m_DBDataAdapter) Then
            Return -2
        End If
        If IsNothing(m_DBDataSet) Then
            Return -3
        End If

        m_DBCommandRef.CommandTimeout = 30
        m_DBDataAdapter.SelectCommand = m_DBCommandRef

        Try
            m_DBDataAdapter.Fill(m_DBDataSet)
            If m_bWithTransaction Then
                Try
                    m_DBTransaction.Commit()
                Catch extrans As SqlException
                    MsgBoxDBErrors(extrans)
                End Try
            End If
            If m_DBConnection.State = ConnectionState.Open Then
                m_DBConnection.Close()
            End If
            Return 0
        Catch ex As SqlException
            If m_bWithTransaction Then
                Try
                    m_DBTransaction.Rollback()
                Catch extrans As SqlException
                    MsgBoxDBErrors(extrans)
                End Try
            End If
            If m_DBConnection.State = ConnectionState.Open Then
                m_DBConnection.Close()
            End If
            MsgBoxDBErrors(ex)
            Return -4
        Catch ex As SystemException
            If m_bWithTransaction Then
                Try
                    m_DBTransaction.Rollback()
                Catch extrans As SqlException
                    MsgBoxDBErrors(extrans)
                End Try
            End If
            If m_DBConnection.State = ConnectionState.Open Then
                m_DBConnection.Close()
            End If
            MsgBoxSystemErrors(ex)
            Return -5
        End Try
    End Function

De aanroep van deze functie ziet er echter heel leesbaar uit:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
' Bladiebla, maak query enzo.

Select Case Execute()
Case -1
    ' Sukkel, maak eerst een command aan
Case -2
    ' Yo, we hebben nog helemaal geen data adapter!
Case -3
    ' Zit je te slapen ofzo, waar moet de data dan naartoe???
Case -4
    ' Sja, eh, als je geen fatsoenlijke SQL kunt schrijven, ga dan ergens anders werken.
Case -5
    ' Hmz, vast iets fataals aan de hand.
Case else
    ' Hu? Een foutcode die niet is gedocumenteerd?
End Select

' Ok, het is goed gegaan, doe wat met de data.
2 Je hoeft niet alle foutcodes die niemand iets zeggen uit je hoofd te leren, maar ziet in een beetje fatsoenlijke IDE meteen welke exceptions opgegooid worden.
Daar heb je helemaal gelijk in, zie dus het bovenstaande stukje code :). Maar ook dat is wel op te vangen door een centrale file te maken met enumerations. In een C++ project hebben we het volgende:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
typedef enum
{
    EC_FAILED = -1,                     // 
    EC_OK = 0,                          // 
    
    //
    // General errorcodes
    //
    EC_UNSPECIFIED,                     //  Unspecified error occurred
    EC_NOT_FOUND,                       //  Something was not found
    
    EC_NOT_INITIALIZED,                 //  Call the Initialize() member of the class first.
    EC_ALREADY_INITIALIZED,             //  Don't call the Initialize() member more than once.
    EC_NOT_STARTED,                     // 
    EC_ALREADY_STARTED,                 //  
[etc....]
3 Je hoeft bijna niks meer te controleren voor gebruik, hooguit voor performance ofzo, aangezien een try catch niet snel is.
Maar eenmaal in een catch block kun je vaak het probleem niet meer 'herstellen'. ALS je een catch block gebruikt, moet je het imo niet gebruiken voor dingen als invoercontrole. Je gaat dan de invoer pas controleren wanneer het zeker is dat het niet verwerkt kan worden. Dat gaat user-interface technisch voor rare constructies zorgen, waardoor users vaak meer moeten klikken en ze gefrustreerder worden. Je wil niet dat users gefrustreerd over je software worden, want dan kopen ze iets anders :).
4 Als er iets niet OO is, maar heel zwaar old fashioned C en tegenwoordig zo goed als een taboe.
Wat ik bedoelde te zeggen is dat niet alles wat Stroustrup bedacht heeft ook even slim was en dan ook maar gebruikt moet worden. Exception handling heeft minstens evenveel nadelen als voordelen. Het nodigt ERG uit tot misbruik, en als je het wel goed toepast, blijkt vaak dat je code minder goed onderhoudbaar wordt (iemand die jouw code moet debuggen zal veel meer moeten scrollen om de foutafhandeling te snappen). En daarmee schiet het zijn doel een beetje voorbij.

[ Voor 12% gewijzigd door RetepV op 31-03-2006 11:43 ]

Macbook Pro


Acties:
  • 0 Henk 'm!

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
RetepV schreef op vrijdag 31 maart 2006 @ 10:58:
Hmm, wat is hier dan fout aan?
De code is niet fout, maar localtime was zoveel eenvoudiger.
Het gebruik van strcpy() enzo? Ik vind het duidelijke code (ik heb het niet gechecked op bugs :)), en het is vast een heel stuk efficienter dan wanneer je het met het STL string object zou doen. STL strings zijn leuk, maar als je eens gaat kijken hoeveel onderliggende kopieen er gemaakt worden bij die operaties, dan barst je in huilen uit. Het scheelt al zo een factor 20 in snelheid als je alle string operaties met ouderwetse C zou doen in plaats van met STL strings.
Daar geloof ik niks van. Heb je daar een goede bron van?

Acties:
  • 0 Henk 'm!

  • RetepV
  • Registratie: Juli 2001
  • Laatst online: 29-04 22:20

RetepV

ALLES valt te repareren

OlafvdSpek schreef op vrijdag 31 maart 2006 @ 11:31:
[Verhaal over STL strings die langzaam zijn]

Daar geloof ik niks van. Heb je daar een goede bron van?
De bron ben ik zelf. Maar ik geef toe dat de snelheid afhankelijk is van hoe de STL string is geimplementeerd en hoe de compiler het compileert. Ik zou een voorbeeldje kunnen maken, maar volgens mij is het off-topic in deze thread. Misschien maak ik vanmiddag wel even een thread aan om hier over te discussieren.

Macbook Pro


Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Ik vind exceptions ook erg nuttig hoor. Ik zet juist vaak fout handlers (C style met error callback) om zodat ze een exception throwen. Anders zit je code vol met error checking, of nog erger, niet... Vaak boeit het me niet zo waar er precies iets fout gaat, als ik maar een mooie melding krijg van waar het fout ging. Op bepaalde punten waar het belangrijk is vang je dan exceptions af om te zien of een gedeelte van de code goed is gegaan. Werkt prima. Je moet natuurlijk wel exception safe kunnen programmeren in dit geval.
RetepV schreef op vrijdag 31 maart 2006 @ 11:36:
De bron ben ik zelf. Maar ik geef toe dat de snelheid afhankelijk is van hoe de STL string is geimplementeerd en hoe de compiler het compileert. Ik zou een voorbeeldje kunnen maken, maar volgens mij is het off-topic in deze thread. Misschien maak ik vanmiddag wel even een thread aan om hier over te discussieren.
Dat betwijfel ik ook... gebruik je ze wel goed dan? Dus niet steeds 1 character toevoegen bv. Zelfde dat mensen klagen dat vector traag is, en dan zie je de volgende code :X

C++:
1
2
3
4
5
const int count = 100000;
std::vector vec;
for (int i=0; i<count; ++i) {
   vec.push_back(i);
}

Ja, dat is traag als je niet eerst even resized. std::string is vaak juist een reference counted implementatie (hoeft niet, kan wel), je zou dan dus minder kopieen maken dan met C-strings. Er is wel iets van overhead natuurlijk, maar ik betwijfel of je echt veel verschil merkt bij een goede implementatie.

[ Voor 50% gewijzigd door Zoijar op 31-03-2006 12:10 ]


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

RetepV schreef op vrijdag 31 maart 2006 @ 10:53:
Exception handling op zich is al slecht. :D

Dus veel mensen implementeren het maar gedeeltelijk, om de code nog onderhoudbaar te houden. Maar laat het exception handling dan maar gelijk volledig achterwege.
In tegenstelling tot wat ik dus 3 jaar geleden hier zei ( ;) ) doe ik tegenwoordig juist meer aan exceptionhandling en het voorzien van eventuele fouten die zich kunnen voordoen. Vaak weet je al dat er iets fout kan gaan in sommige situaties waardoor het handig is om dit vooraf te testen.
Ik merk dat juist door dit goed toe te passen dat de code juist overzichtelijker wordt, je ziet sneller wat het doet etc.
Zorg er voor dat je functies gewoon foutwaardes retourneren, zoals in the good old days van C. Dan heb je de foutafhandeling direkt onder de aanroep van de functie.
Dat vind ik dus onhandig, zeker als je OO gaat werken. (meteen een reden waarom ik bijna altijd systemcalls wrap)

Maar verder wel leuk dat je me quote van 3 jaar geleden, zie ik meteen dat ik wel degelijk een andere mening heb nu. (is ook te zien als ik code van toen terug kijk).

Acties:
  • 0 Henk 'm!

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Zoijar schreef op vrijdag 31 maart 2006 @ 12:06:
Ja, dat is traag als je niet eerst even resized. std::string is vaak juist een reference counted implementatie (hoeft niet, kan wel), je zou dan dus minder kopieen maken dan met C-strings. Er is wel iets van overhead natuurlijk, maar ik betwijfel of je echt veel verschil merkt bij een goede implementatie.
Reserve is volgens mij toepasselijker dan resize.
std::string is tegenwoordig volgens mij niet meer reference counted in verband met thread safety.

Acties:
  • 0 Henk 'm!

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
RetepV schreef op vrijdag 31 maart 2006 @ 11:23:
Goed, ik heb een stukje code van mezelf gevonden. Het stukje code is uit een VB.NET wrapper class om via OLE DB uit een database te lezen. Het toont wel aan hoe erg exception handling je code kan verpesten. Het toont nog iets anders aan, maar dat zet ik even onder het code voorbeeld. :)
IMO is het dan ook slechte code. :)
De transaction.rollback() en connection.close() zou je moeten doen door automatic resource management (scope guards of destructors).
Verder heb je dubbele fouthandling. Een keer in de functie zelf en een keer in de aanroepende functie. In de aanroepende functie ben je ook de tekst van je exception kwijt.
Als je na elke aanroep van een functie (rollback) een message box op het scherm tovert kun je die message box code ook beter in een functie wrapper zetten dan elke keer na de functie aanroep.

[ Voor 4% gewijzigd door Olaf van der Spek op 31-03-2006 12:30 ]


Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

OlafvdSpek schreef op vrijdag 31 maart 2006 @ 12:25:
Reserve is volgens mij toepasselijker dan resize.
Oh ja, dat bedoelde ik ook eigenlijk :)
std::string is tegenwoordig volgens mij niet meer reference counted in verband met thread safety.
Had er laatst nog een discussie over; je kan er niet zo veel zinnigs over zeggen juist omdat het implementation defined is. Het wordt tijd dat C++ threading formeel opneemt... stenentijdperk gedoe. Jammer dat dit soort dingen altijd zo lang duren...

Acties:
  • 0 Henk 'm!

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Zoijar schreef op vrijdag 31 maart 2006 @ 12:57:
Had er laatst nog een discussie over; je kan er niet zo veel zinnigs over zeggen juist omdat het implementation defined is.
Je kunt toch gewoon iets zeggen over hoe veel gebruikte implementaties het doen?
Het wordt tijd dat C++ threading formeel opneemt... stenentijdperk gedoe. Jammer dat dit soort dingen altijd zo lang duren...
Ja, helaas.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 09-09 16:17

Janoz

Moderator Devschuur®

!litemod

RetepV schreef op vrijdag 31 maart 2006 @ 11:23:
[...]


Goed, ik heb een stukje code van mezelf gevonden. Het stukje code is uit een VB.NET wrapper class om via OLE DB uit een database te lezen. Het toont wel aan hoe erg exception handling je code kan verpesten. Het toont nog iets anders aan, maar dat zet ik even onder het code voorbeeld. :)
Zullen we daar gewoon van maken dat het aantoont hoe erg jij je code met exception handling verpest?

Een willekeurig stukje uit wat oude javacode van mij (uit het hoofdje):

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public ResultTO getResult(blaat) throws ApplicationException{
  Connection conn = null;
  Statement stmt = null;
  try {
    conn.connect();
    stmt.create();
    //Creatie statement
    //uitvoeren statement
    //verwerken result
    return result;
  } catch(SQLException sqle){
    log.error("SQLException while blaat ",sqle);
    throw new ApplicationException("blaat",sqle);
  } finaly {
    conn.close();
    stmt.close();
  }
}


Die applicatie exception kan dan, afhankelijk van de aanroep van deze functie, afgehandeld worden in de view (DOor een foutdialog op te werpen met een melding, of te forwarden naar een standaar pagina in je mappings. AL dan niet samen met het eventueel rapporteren van de fout) of in je buisness laag.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Enfer
  • Registratie: Februari 2004
  • Laatst online: 04-09 19:14
Pff, ik was laatst zo aan het slapen.. heel erg... ik wist ff niet meer hoe ik kon controleren of een getal negatief of positief was...
had ik eerst dit gedaan:
PHP:
1
2
3
4
5
6
7
8
$waarde = 1;
$waardeabs = abs($waarde);
if ($waarde = $waardeabs){
echo "Het is een positief getal :)";
}
else {
echo "Het getal is net zo negatief :P ";
}


gelukkig kwam ik na 5 minuten er al achter dat
PHP:
1
2
if ($waarde >= 0)
...


makkelijker is ;)

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Nu kan het ook wel op die eerste manier, alleen moet je dan wel == gebuiken in je if-statement :P

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 09-09 15:29
Zoijar schreef op vrijdag 31 maart 2006 @ 12:06:
Dat betwijfel ik ook... gebruik je ze wel goed dan? Dus niet steeds 1 character toevoegen bv. Zelfde dat mensen klagen dat vector traag is, en dan zie je de volgende code :X

C++:
1
2
3
4
5
const int count = 100000;
std::vector vec;
for (int i=0; i<count; ++i) {
   vec.push_back(i);
}

Ja, dat is traag als je niet eerst even resized.
Dat valt trouwens best mee. Die vector gaat echt niet bij elke aanroep resizen. De voornaamste reden dat van te voren reserveren efficiënter is (als je precies weet hoeveel items je gaat toevoegen) is dat je dan waarschijnlijk minder geheugen alloceert, omdat de vector anders bijvoorbeeld in machten van 2 (of iets dergelijks) geheugen alloceert. De overhead van het kopiëren bij reallocatie blijft wel aanwezig natuurlijk maar is maar een beperkt deel van de allocatiekosten.

Reserveren is dus wel een goed idee, maar als je van te voren niet kunt schatten hoe groot de vector wordt, kun je er maar beter niet al te veel moeite voor doen.

[ Voor 9% gewijzigd door Soultaker op 31-03-2006 16:22 ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Soultaker schreef op vrijdag 31 maart 2006 @ 16:22:
[...]

Dat valt trouwens best mee. Die vector gaat echt niet bij elke aanroep resizen. De voornaamste reden dat van te voren reserveren efficiënter is (als je precies weet hoeveel items je gaat toevoegen) is dat je dan waarschijnlijk minder geheugen alloceert, omdat de vector anders bijvoorbeeld in machten van 2 (of iets dergelijks) geheugen alloceert. De overhead van het kopiëren bij reallocatie blijft wel aanwezig natuurlijk maar is maar een beperkt deel van de allocatiekosten.

Reserveren is dus wel een goed idee, maar als je van te voren niet kunt schatten hoe groot de vector wordt, kun je er maar beter niet al te veel moeite voor doen.
Maar in princiepe weet je toch ook niet precies hoeveel geheugen een Vector daadwerkelijk reserveert als je een getal meegeeft? Volgens mij is het alleen zo dat er minstens zoveel elementen in kunnen zonder dat hij opnieuw hoeft te alloceren. Het kan volgens mij best zo zijn dat hij het nog steeds afrond naar de eerste macht van 2 die groter is als het opgegeven getal.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 09-09 15:29
Dat zou kunnen ja - de standaard laat dat toe, maar naar mijn ervaring gebeurt dat niet. (Je mag ook aannemen dat iemand die reserve() aanroept beter weet wat een goede capacity is dan de vector zelf.)

Zoals ik al zei kan het nogal kostbaar zijn om gemiddeld 25% meer geheugen te alloceren dan noodzakelijk (als je afrondt naar een macht van 2) dus dat lijkt me ook een reden om dat niet te doen.

In beide scenario's hou je natuurlijk de overhead van het kopiëren van elementen.

Acties:
  • 0 Henk 'm!

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Janoz schreef op vrijdag 31 maart 2006 @ 13:36:
Java:
1
2
3
4
5
  } finaly {
    conn.close();
    stmt.close();
  }
}
Waar is dat voor nodig? Handelt Java's resource management dat niet automatisch af?

Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Soultaker schreef op vrijdag 31 maart 2006 @ 16:22:
Dat valt trouwens best mee. Die vector gaat echt niet bij elke aanroep resizen. De voornaamste reden dat van te voren reserveren efficiënter is (als je precies weet hoeveel items je gaat toevoegen) is dat je dan waarschijnlijk minder geheugen alloceert, omdat de vector anders bijvoorbeeld in machten van 2 (of iets dergelijks) geheugen alloceert. De overhead van het kopiëren bij reallocatie blijft wel aanwezig natuurlijk maar is maar een beperkt deel van de allocatiekosten.

Reserveren is dus wel een goed idee, maar als je van te voren niet kunt schatten hoe groot de vector wordt, kun je er maar beter niet al te veel moeite voor doen.
Nee dat is niet waar. Die vector begint bv op een grootte van 10 elementen, en verveelvoudigd zijn capaciteit dan elke keer als hij vol is. Die factor wisselt, ik geloof dat 1.5 goed werkt, maar 2 kan ook. Overhead komt niet door te veel alloceren, maar door het meerdere keren kopieren van een volledige vector. Met een factor van 1.5 en 1 miljoen elementen, wordt er zo'n 34 keer gekopieerd waarbij het laatste kopie al een kopie van zo'n 600,000 elementen is. Dat is waarom het zo traag is.

Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Test code:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <vector>
#include <iostream>

class Dummy {
public:
    Dummy() {}
    ~Dummy() {}

    Dummy(const Dummy& src) {
        Dummy::copied++;
    }

    const Dummy& operator=(const Dummy& src) {
        Dummy::copied++;
        return *this;
    }

    static unsigned long copied;
};

unsigned long Dummy::copied = 0;

int main() {
    std::vector<Dummy> vec;

    for (int i=0; i<1000000; ++i) {
        vec.push_back(Dummy());
    }

    std::cout << "Copies made for vector 1: " << Dummy::copied << std::endl;

    Dummy::copied = 0;
    std::vector<Dummy> vec2;
    vec2.reserve(1000000);
    for (int i=0; i<1000000; ++i) {
        vec2.push_back(Dummy());
    }

    std::cout << "Copies made for vector 2: " << Dummy::copied << std::endl;
    return 0;
}


Output:
code:
1
2
Copies made for vector 1: 3099788
Copies made for vector 2: 1000000

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 09-09 16:17

Janoz

Moderator Devschuur®

!litemod

OlafvdSpek schreef op vrijdag 31 maart 2006 @ 17:30:
[...]

Waar is dat voor nodig? Handelt Java's resource management dat niet automatisch af?
Hoe weet je omgeving nu precies wanneer je klaar bent met je connectie? Natuurlijk zou hij wel opgeruimd worden wanneer hij buiten de scope raakt en de garbage collector langs komt. Echter wil je daar niet op wachten. Sowieso werk je vaak met een connectionpool. Een connection closen is dan niks meer dan het vrijgeven van die connection voor een andere thread. In het geval van ee pool blijft er daarnaast ook een verwijzing bestaan dus lost de garbage collector ook niks op. In je implementatie van je pool kun je immers nooit met zekerheid zeggen of je connection nog wordt gebruikt.

Daarnaast is het natuurlijk ook geen php pagina waarbij er 0,0 geshared is met als gevolg dat het geen enkel probleem is dat alles wat ook maar binnen de executie van 1 script aangemaakt is zondermeer weggegooid kan worden ;).

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Janoz schreef op vrijdag 31 maart 2006 @ 20:03:
Hoe weet je omgeving nu precies wanneer je klaar bent met je connectie?
Inderdaad door de variabele scope.
Natuurlijk zou hij wel opgeruimd worden wanneer hij buiten de scope raakt en de garbage collector langs komt.
Voor lokale variabelen hoef je toch niet te wachten op de garbage collector.

Acties:
  • 0 Henk 'm!

  • ID-College
  • Registratie: November 2003
  • Laatst online: 08:18
Erkens schreef op vrijdag 31 maart 2006 @ 15:56:
Nu kan het ook wel op die eerste manier, alleen moet je dan wel == gebuiken in je if-statement :P
idd wou het net zeggen, anders krijg je altijd wat in else staat :P

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

ID-College schreef op vrijdag 31 maart 2006 @ 20:33:
[...]

idd wou het net zeggen, anders krijg je altijd wat in else staat :P
afaik geeft een toekenning altijd true ;)

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
ID-College schreef op vrijdag 31 maart 2006 @ 20:33:
[...]
idd wou het net zeggen, anders krijg je altijd wat in else staat :P
Helaas, geen wasmachine voor jou. :> Je komt alleen bij de else als $waarde 0 is. ;)

edit:
pff een uur geen reactie en dan toch spuit 11...

[ Voor 13% gewijzigd door Voutloos op 31-03-2006 21:33 ]

{signature}


Acties:
  • 0 Henk 'm!

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Erkens schreef op vrijdag 31 maart 2006 @ 21:31:
afaik geeft een toekenning altijd true ;)
Volgens mij is if (a = 0) gewoon false hoor. :)

Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

code van een docent van me:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private void Page_Load(object sender, System.EventArgs e)
        {
            adapter =(OleDbDataAdapter) Application["adapter"];
            if (!IsPostBack) 
            {
                gemeenteDS = new DataSet();
                adapter.Fill(gemeenteDS);
                ViewState["gemeentes"] = gemeenteDS;
                OverzichtGemeentes.DataSource = gemeenteDS.Tables[0].DefaultView;
                OverzichtGemeentes.DataBind();
            } 
            else 
            {
                gemeenteDS = (DataSet)ViewState["gemeentes"];
            }
        }


ja, alles werkt...

tot er 2 gebruikers tegelijk de pagina laden...

code van m'n medestudenten tijdens het project dat hierop volgt (niet exact, losse pols)
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class usermgmt
{
  private const string select = ". een of ander SELECT statement."
  private IDbDataAdapter adapter;
  private IConnectionFactory factory;

  public usermgmt()
  {
    IDbConnection conn = factory.GetConnection();
    adapter = factory.CreateAdapter(query, conn);

    adapter.Parameters.Add(factory.CreateParameter("parameter"));
  }
  public string getIets(string iets)
  {
      adapter.SelectCommand.Parameters["parameter"].Value = iets;
      IDbConnection conn_dummy = adapter.SelectCommand.Connection
      conn.Open();
      try
      {
          return adapter.SelectCommand.ExecuteScalar().ToString();
      }
      finally
      {
         conn.Close()
      }
  }
}


ja hoor. een adapter is niet meer als een handige collectie van commands en een connection.
maar waarom mijn web-app slechts 1 gebruiker tegelijk aankan is me een raadsel.

behalve dit moet je weten dat de implementatie van factory.CreateParameter natuurlijk databank-afhankelijk is en dus voor bvb MSSQL:
C#:
1
2
3
4
public IDbDataParameter CreateParameter(string naam)
{
   return new SqlDataParameter("@" + naam);
}

wat er dus voor zorgde dat bovenstaand stuk code zelfs niet eens werkte...

let behalve die fouten ook op de Java-style...

andere Java-"fout" die ik in .NET tegenkwam
C#:
1
2
if (listbox.SelectedValue.Text.Equals(txtBox.Text.SubString(10)))
     /// doeiets



nog een toffe uit dat project die ik jullie niet wil besparen:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public void init()
{
    // parameters aanmaken:
    IDbDataParameter paramBanned = factory.CreateParameter("Banned");
    IDbDataParameter paramNaam = factory.CreateParameter("naam");
    IDbDataParameter paramEmail = factory.CreateParameter("email");

    // connectie
    IDbConnection conn = factory.GetConnection(); // GetConnection() maakt telkens een nieuwe connectie aan
    
    // dataadapters private in klasse
    selectBannedByNaam = factory.CreateAdapter(SELECTBANNEDBYNAAM, conn);
    selectBannedByNaam.SelectCommand.Parameters.Add(paramBanned);
    selectBannedByNaam.SelectCommand.Parameters.Add(paramNaam);

    selectBannedByEmail = factory.CreateAdapter(SELECTBANNEDBYEMAIL, conn);
    selectBannedByNaam.SelectCommand.Parameters.Add(paramBanned);
    selectBannedByNaam.SelectCommand.Parameters.Add(paramEmail);    
}


een connectie gebruik je nooit voor 2 verschillende commands op deze manier, tenzij je connection pooling gebruikt of een andere manier om te zorgen dat je maar 1 command tegelijk per connectie kan uitvoeren.

een parameter kun je maar aan 1 command toekennen. Wat doe je anders als die 2 commands door threading simultaan runnen met verschillende parameter values? (zelfs al zitten ze op 2 verschillende connecties)

en dan moet je weten dat die code doorspekt stond met code zoals in het 2de codevenster...

[ Voor 74% gewijzigd door H!GHGuY op 31-03-2006 22:49 ]

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 13:16
OlafvdSpek schreef op vrijdag 31 maart 2006 @ 21:47:
[...]

Volgens mij is if (a = 0) gewoon false hoor. :)
Hmm, getest, maar het ligt er inderdaad aan wat je toekent aan 'a'. a=0 geeft false, maar a=1 geeft true. En dit bij zowel PHP als C++.

[ Voor 33% gewijzigd door Jaap-Jan op 31-03-2006 22:56 ]

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett

Pagina: 1 ... 9 ... 11 Laatste

Dit topic is gesloten.

Let op:
Uiteraard is het in dit topic niet de bedoeling dat andere users en/of topics aangehaald worden om ze voor gek te zetten. Lachen om je eigen code, of over dingen die je "wel eens tegengekomen bent" is prima, maar hou het onderling netjes.