[alg] Slechtste programmeervoorbeelden deel 4 Vorige deel Overzicht Laatste deel

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

Pagina: 1 ... 74 ... 103 Laatste
Acties:
  • 993.630 views

Acties:
  • 0 Henk 'm!

  • Davio
  • Registratie: November 2007
  • Laatst online: 06-01 16:46
.oisyn schreef op zondag 30 oktober 2011 @ 19:14:
[...]

Klopt. En dus ook als het "10" of "10 apen" of 10.0 is. Het resultaat is dat $alt in die gevallen altijd een int is.
Dat is iets te kort door de bocht.

Even lekker copy-pasten zodat we snel klaar zijn:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php

$alt = "10 kleine tuinkabouters";
(($alt == 10) ? $alt = 10 : $alt = $alt); 
var_dump($alt); // Hier komt int(10) uit

$alt = "woef";
(($alt == 10) ? $alt = 10 : $alt = $alt); 
var_dump($alt); // Hier komt string(4) "woef" uit

$alt = array();
(($alt == 10) ? $alt = 10 : $alt = $alt); 
var_dump($alt); // Hier komt array(0) { }  uit
?>

$alt wordt dus alleen naar int geconverteerd als het (na conversie) de waarde 10 heeft.
Maar bij elke andere waarde blijft het gewoon wat het was, inclusief type!

Het is dus niet zo dat $alt altijd $alt blijft (en de regel onnodig is), maar dat er een type-conversion plaatsvindt wanneer er het getal 10 in $alt zit, of dat nou al een int was of een string.

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Davio schreef op maandag 31 oktober 2011 @ 12:25:
[...]

Dat is iets te kort door de bocht.

Even lekker copy-pasten zodat we snel klaar zijn:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php

$alt = "10 kleine tuinkabouters";
(($alt == 10) ? $alt = 10 : $alt = $alt); 
var_dump($alt); // Hier komt int(10) uit

$alt = "woef";
(($alt == 10) ? $alt = 10 : $alt = $alt); 
var_dump($alt); // Hier komt string(4) "woef" uit

$alt = array();
(($alt == 10) ? $alt = 10 : $alt = $alt); 
var_dump($alt); // Hier komt array(0) { }  uit
?>

$alt wordt dus alleen naar int geconverteerd als het (na conversie) de waarde 10 heeft.
Maar bij elke andere waarde blijft het gewoon wat het was, inclusief type!

Het is dus niet zo dat $alt altijd $alt blijft (en de regel onnodig is), maar dat er een type-conversion plaatsvindt wanneer er het getal 10 in $alt zit, of dat nou al een int was of een string.
Niet helemaal waar, er komt alleen het getal 10 uit als $alt oorspronkelijk met het getal 10 begon. Een string waar het getal 10 in zit, maar waar het niet vooraan staat, blijft behouden.

PHP:
1
2
3
4
<?php
$alt = "kleine 10 tuinkabouters"; 
(($alt == 10) ? $alt = 10 : $alt = $alt);  
var_dump($alt); // Hier komt string(23) "kleine 10 tuinkabouters" uit

Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 18:14
Davio schreef op maandag 31 oktober 2011 @ 12:25:
[...]Het is dus niet zo dat $alt altijd $alt blijft (en de regel onnodig is), maar dat er een type-conversion plaatsvindt wanneer er het getal 10 in $alt zit, of dat nou al een int was of een string.
Dat is toch exact wat .oisyn zegt.

Ik vraag me wel af in welke situatie je het zou willen gebruiken. Ik kan me geen enkele situatiee voorstellen waarbij je het nodig zou hebben.

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • Davio
  • Registratie: November 2007
  • Laatst online: 06-01 16:46
Nou ja, dat bedoelde ik natuurlijk, al was mijn verwoording misschien niet waterdicht.

Gaat erom dat een string die hij naar het getal 10 kan converteren op int(10) uitkomt.
T-MOB schreef op maandag 31 oktober 2011 @ 12:41:
[...]

Dat is toch exact wat .oisyn zegt.

Ik vraag me wel af in welke situatie je het zou willen gebruiken. Ik kan me geen enkele situatiee voorstellen waarbij je het nodig zou hebben.
Mjah, maar .oisyn quotete CodeCaster die naar mijn idee onvolledig was.
Daarom voelde ik de behoefte om het helemaal uit te specificeren. :)

[ Voor 56% gewijzigd door Davio op 31-10-2011 12:50 ]


Acties:
  • 0 Henk 'm!

  • JohnStaakke
  • Registratie: Oktober 2007
  • Laatst online: 26-09 11:59
In Javascript deze functie tegengekomen. Niet per definitie fout, wel omslachtig:

code:
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
function getRange(day) {
  switch (day) {
  case 1:
    var pre = 0;
    var post = 6;
    break;
  case 2:
    var pre = 1;
    var post = 5;
    break;
  case 3:
    var pre = 2;
    var post = 4;
    break;
  case 4:
    var pre = 3;
    var post = 3;
    break;
  case 5:
    var pre = 4;
    var post = 2;
    break;
  case 6:
    var pre = 5;
    var post = 1;
    break;
  case 0:
    var pre = 6;
    var post = 0;
    break;
  }

  return {
    pre : pre,
    post : post
  };
}

Acties:
  • 0 Henk 'm!

  • Enfer
  • Registratie: Februari 2004
  • Laatst online: 18-09 16:32
JohnStaakke schreef op dinsdag 01 november 2011 @ 14:04:
In Javascript deze functie tegengekomen. Niet per definitie fout, wel omslachtig:

JavaScript:
1
2
3
4
5
6
7
8
function getRange(day) {
//.. veel code ...

  return {
    pre : pre,
    post : post
  };
}
Dan toch maar:
JavaScript:
1
2
3
4
5
6
function getRange(day) {
   return {
    pre : day == 0 ? 6 : (day-1),
    post : (7-day)
  };
}

Doen? ;)

[ Voor 34% gewijzigd door Enfer op 01-11-2011 15:18 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 02:49

.oisyn

Moderator Devschuur®

Demotivational Speaker

Davio schreef op maandag 31 oktober 2011 @ 12:41:
Mjah, maar .oisyn quotete CodeCaster die naar mijn idee onvolledig was.
Daarom voelde ik de behoefte om het helemaal uit te specificeren. :)
Dan moet je je betekenis van "te kort door de bocht" eens bijspijkeren. Ik zei namelijk gewoon precies wat jij zei (en was zelfs iets correcter), alleen in minder woorden. Je bent zelf degene die te kort door de bocht gaat door te stellen dat hij er een int(10) van maakt als er een "10" in de string zit :)

[ Voor 16% gewijzigd door .oisyn op 01-11-2011 15:34 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 21:01

Patriot

Fulltime #whatpulsert

.oisyn schreef op dinsdag 01 november 2011 @ 15:32:
[...]

Dan moet je je betekenis van "te kort door de bocht" eens bijspijkeren. Ik zei namelijk gewoon precies wat jij zei (en was zelfs iets correcter), alleen in minder woorden. Je bent zelf degene die te kort door de bocht gaat door te stellen dat hij er een int(10) van maakt als er een "10" in de string zit :)
Davio heeft gewoon over "in die gevallen" heen gelezen. Volgens mij dacht 'ie dat je zei dat het altijd een int zou worden oid :+

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Had me er al een paar keer over verbaasd, toch eens hier posten. Werd als comment toegevoegd bij onderdeel type hinting van PHP in de officiële docs. Om support voor primivites toe te voegen. Veel ranziger kan volgens mij niet. 8)7

PHP:
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
For PHP 5.3 version and namespaces support.

<?php

function phpErrorHandler( $code, $message, $file, $line ) {

    if ( error_reporting() & $code ) {

        if ( $code == E_RECOVERABLE_ERROR ) { // Scalar Type-Hinting patch.

            $regexp = '/^Argument (\d)+ passed to (.+) must be an instance of (?<hint>.+), (?<given>.+) given/i' ;

            if ( preg_match( $regexp, $message, $match ) ) {

                $given = $match[ 'given' ] ;
                $hint  = end( explode( '\\', $match[ 'hint' ] ) ) ; // namespaces support.

                if ( $hint == $given ) return true ;
            }
        }

        return false ;
    }
}

set_error_handler( 'phpErrorHandler' ) ;

/************************************/

function typeHintTest( integer $arg1 ) {

    print_r( $arg1 ) ;
}

typeHintTest( true ) ; // Error throw because not integer type.

?>


http://www.php.net/manual...p5.typehinting.php#100550

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 26-09 10:03
Ik zit al de hele dag de bende code op te ruimen die een stagair (zonder begeleiding...) heeft geproduceerd. Een C# project dat 6 executables oplevert (waarvan je er maar 2 daadwerkelijk kan aanroepen, de rest had een DLL moeten zijn), waar alle functionaliteit dubbel in zit (oude en nieuwe GUI), en waar (na het weggooien van de oude GUI) 3/4 van de functionaliteit in de Interface-klasse (user-interface...) blijkt te zitten. Die Interface-klasse stuurt dus 4 verschillende functionaliteiten aan, en heeft geweldige membernamen als 'private int index'. Maar de mooiste vond ik toch wel 'string sourceDestination' :X En de mooiste bestandsnaam 'Class1.cs'.

Plan van aanpak: alles waarvan ik weet wat het doet uit de mega-klasse weghalen en in een aparte klasse stoppen, want dat stuk waarvan ik nog niet weet hoe het werkt zit de grootste bug in :X

Acties:
  • 0 Henk 'm!

  • Spockz
  • Registratie: Augustus 2003
  • Laatst online: 21-09 10:08

Spockz

Live and Let Live

Wat is er precies mis met een string typed sourceDestination?

C'est le ton qui fait la musique. | Blog | @linkedin
R8 | 18-55 IS | 50mm 1.8 2 | 70-200 2.8 APO EX HSM | 85 1.8


Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
Grijze Vos schreef op zondag 30 oktober 2011 @ 19:09:
Hier weer zo'n absoluut "pareltje" waar je gewoon van gaat huilen:

C#:
1
2
3
4
5
6
var sbi = new ShoppingBasketItem()
{
  ...,
  ShowId = _cardOwnership.UnitsOriginal, 
  ...
}; // using ShowId here for UnitsOriginal..not nice and clean but easy


Duss, laten we een nullable FK veld maar vullen met een of andere random waarde omdat we te lui zijn een veld aan de DB toe te voegen. Even los van het feit dat dit keihard stuk gaat als die Show niet bestaat.

*WTF* Ik heb zin om iemand te wurgen.
Wat gebeurt er trouwens op plekken waar die ShowId normaal gebruikt wordt, vraag ik me dan af. :P

offtopic:
Als ik je afgelopen items zo allemaal de revu zie passeren wordt ik steeds meer bij dat ik zit waar ik zit en niet meer waar ik zat.

Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 26-09 10:03
Spockz schreef op dinsdag 01 november 2011 @ 23:25:
Wat is er precies mis met een string typed sourceDestination?
Wat betekent het? Is het een source, een destination, of geen van beide?
spoiler:
dat laatste, iets totaal anders

Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 21:01

Patriot

Fulltime #whatpulsert

Michali schreef op dinsdag 01 november 2011 @ 17:12:
Had me er al een paar keer over verbaasd, toch eens hier posten. Werd als comment toegevoegd bij onderdeel type hinting van PHP in de officiële docs. Om support voor primivites toe te voegen. Veel ranziger kan volgens mij niet. 8)7

PHP:
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
For PHP 5.3 version and namespaces support.

<?php

function phpErrorHandler( $code, $message, $file, $line ) {

    if ( error_reporting() & $code ) {

        if ( $code == E_RECOVERABLE_ERROR ) { // Scalar Type-Hinting patch.

            $regexp = '/^Argument (\d)+ passed to (.+) must be an instance of (?<hint>.+), (?<given>.+) given/i' ;

            if ( preg_match( $regexp, $message, $match ) ) {

                $given = $match[ 'given' ] ;
                $hint  = end( explode( '\\', $match[ 'hint' ] ) ) ; // namespaces support.

                if ( $hint == $given ) return true ;
            }
        }

        return false ;
    }
}

set_error_handler( 'phpErrorHandler' ) ;

/************************************/

function typeHintTest( integer $arg1 ) {

    print_r( $arg1 ) ;
}

typeHintTest( true ) ; // Error throw because not integer type.

?>


http://www.php.net/manual...p5.typehinting.php#100550
Kun je binnen de taal zelf dan wel een manier verzinnen die niet ranzig is? :+

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
R4gnax schreef op dinsdag 01 november 2011 @ 23:52:
[...]

Wat gebeurt er trouwens op plekken waar die ShowId normaal gebruikt wordt, vraag ik me dan af. :P
Daar ligt gewoon een koppeling naar een gerelateerd Show object.
offtopic:
Als ik je afgelopen items zo allemaal de revu zie passeren wordt ik steeds meer bij dat ik zit waar ik zit en niet meer waar ik zat.
Ach, ik mag het gelukkig allemaal weggooien, moet alleen op sommige plekken kilo's code reverse engineeren voordat ik het kan herschrijven. Zo erg is het gelukkig dus niet. (Zo te zien wordt het een conversie ratio van ongeveer 4:1 btw, elke 4 regels code komt 1 regel voor terug in de nieuwe codebase.)

[edit]
Kom er weer eentje tegen:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if (q.UnitsExtension == 0 && q.ExtensionOwnershipDays == 0)
{ }

if (q.UnitsExtension > 0 && q.ExtensionOwnershipDays == 0)
{ q.UnitsCurrent += q.UnitsExtension; }

if (q.UnitsExtension == 0 && q.ExtensionOwnershipDays > 0)
{ q.ValidTill = q.ValidTill.GetValueOrDefault().AddDays(q.ExtensionOwnershipDays); }

if (q.UnitsExtension > 0 && q.ExtensionOwnershipDays > 0)
{
  q.UnitsCurrent += q.UnitsExtension;
  q.ValidTill = q.ValidTill.GetValueOrDefault().AddDays(q.ExtensionOwnershipDays);
}

[ Voor 43% gewijzigd door Grijze Vos op 02-11-2011 09:17 ]

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • donny007
  • Registratie: Januari 2009
  • Laatst online: 24-08 17:07

donny007

Try the Nether!

Laatst kwam ik deze tegen in een perl-script:

code:
1
2
3
4
5
6
7
8
9
10
sub addSlashes
{
    my $text = shift;
    # Make sure to do the backslash first!
    $text =~ s/\\/\\\\/g;
    $text =~ s/'/\\'/g;
    $text =~ s/"/\\"/g;
    $text =~ s/\\0/\\\\0/g;
    return $text;
}


Als je de backslash maar eerst doet komt alles goed :+

/dev/null


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Patriot schreef op woensdag 02 november 2011 @ 00:20:
[...]


Kun je binnen de taal zelf dan wel een manier verzinnen die niet ranzig is? :+
Nee, het is wel clever bedacht daar niet van. Maar om dat serieus te plaatsen als een methode om ook ondersteuning te krijgen voor primitive type hinting, dat vind ik wel ernstig. :P

Als ze in een toekomstige PHP versie ook die error message iets wijzigen, dan werkt het niet meer.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 26-09 10:03
C#:
1
2
3
4
 for (int index = 0; index < SomeArray.Count; index++)
{
  notepadlastname = SomeArray[index] ;
}

Voor een 'array' waar nooit meer dan 1 item in zit...

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Een array waar maar 1 item in zit had nooit een array moeten zijn. ;)

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

Verwijderd

MBV schreef op woensdag 02 november 2011 @ 11:58:
C#:
1
2
3
4
 for (int index = 0; index < SomeArray.Count; index++)
{
  notepadlastname = SomeArray[index] ;
}

Voor een 'array' waar nooit meer dan 1 item in zit...
Whehe...

Zoiets heb ik ook ooit geschreven om vervolgens ook nog eens op index 2 te controleren... En dan je afvragen waarom het fout ging. Dat was niet mijn beste dag ooit :X

Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 26-09 10:03
Grijze Vos schreef op woensdag 02 november 2011 @ 12:41:
Een array waar maar 1 item in zit had nooit een array moeten zijn. ;)
Zie mijn vorige post ;) De namen helpen ook niet: naamgeving suggereert X voor de array, Y voor de ene variabele, en waarschijnlijk zit er Z in.

Acties:
  • 0 Henk 'm!

  • wjzijderveld
  • Registratie: Augustus 2005
  • Laatst online: 23-08 10:55
Michali schreef op woensdag 02 november 2011 @ 11:53:
[...]

Als ze in een toekomstige PHP versie ook die error message iets wijzigen, dan werkt het niet meer.
Dat is relatief makkelijk op te lossen, veroorzaak de error in een try/catch en replace alleen de types in de error O-)

[ Voor 21% gewijzigd door wjzijderveld op 03-11-2011 00:45 . Reden: quote relevant gemaakt ]

Canon EOS60D | Canon 100mm f/2.8 USM | Canon 100-400mm f/4.5-5-6L | Canon 10-22mm f/3.5-4.5 USM | Canon 430EX II


Acties:
  • 0 Henk 'm!

  • BenoitRoosens
  • Registratie: Augustus 2010
  • Laatst online: 12-07-2023
Een mooie in legacy code:

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
BOOL IsCharForFilename(char *sIn)
{
    // Check that all characters are valid for a filename
    char *sStr=NULL;

    if ((sStr=strchr(sIn,'\\')) == NULL)
        if ((sStr=strchr(sIn,'/')) == NULL)
            if ((sStr=strchr(sIn,':')) == NULL)
                if ((sStr=strchr(sIn,'*')) == NULL)
                    if ((sStr=strchr(sIn,'?')) == NULL)
                        if ((sStr=strchr(sIn,'"')) == NULL)
                            if ((sStr=strchr(sIn,'<')) == NULL)
                                if ((sStr=strchr(sIn,'>')) == NULL)
                                    if ((sStr=strchr(sIn,'|')) == NULL)    
                                        return TRUE;

    return FALSE;
}


In wezen zal dit perfect doen wat je verwacht voor Windows, maar we spreken hier over bestanden die verzonden moeten worden naar andere platformen waar andere regels gelden...

Acties:
  • 0 Henk 'm!

  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 00:04

Onbekend

...

Dus de lijst met tekens die afgevangen wordt moet nog groter worden? :)

Speel ook Balls Connect en Repeat


Acties:
  • 0 Henk 'm!

  • JohnStaakke
  • Registratie: Oktober 2007
  • Laatst online: 26-09 11:59
Enfer schreef op dinsdag 01 november 2011 @ 15:18:
[...]


Dan toch maar:
JavaScript:
1
2
3
4
5
6
function getRange(day) {
   return {
    pre : day == 0 ? 6 : (day-1),
    post : (7-day)
  };
}

Doen? ;)
Ik heb hem precies hetzelfde herschreven :)

Acties:
  • 0 Henk 'm!

  • BenoitRoosens
  • Registratie: Augustus 2010
  • Laatst online: 12-07-2023
Onbekend schreef op donderdag 03 november 2011 @ 11:13:
Dus de lijst met tekens die afgevangen wordt moet nog groter worden? :)
Zeker weten, lekker overzichtelijk :). Loopje en switch kennen ze blijkbaar niet :).

Acties:
  • 0 Henk 'm!

  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 00:04

Onbekend

...

Ik werk dan liever met een array van tekens (of een string :+ ) zodat je onbeperkt kan uitbreiden.

Speel ook Balls Connect en Repeat


Acties:
  • 0 Henk 'm!

  • Jegorex
  • Registratie: April 2004
  • Laatst online: 03-09 23:24
JohnStaakke schreef op donderdag 03 november 2011 @ 11:21:
[...]


Ik heb hem precies hetzelfde herschreven :)
Dan is de post fout ;)
Als day 0 is dan moet post 0 zijn en niet 7.
JavaScript:
1
2
3
4
5
6
function getRange(day) {
   return {
    pre : day == 0 ? 6 : (day-1),
    post : day == 0 ? 0 : (7-day)
  };
}

Acties:
  • 0 Henk 'm!

  • Aloys
  • Registratie: Juni 2005
  • Niet online
Enfer schreef op dinsdag 01 november 2011 @ 15:18:
[...]


Dan toch maar:
JavaScript:
1
2
3
4
5
6
function getRange(day) {
   return {
    pre : day == 0 ? 6 : (day-1),
    post : (7-day)
  };
}

Doen? ;)
Volgens mij levert die post bij invoer 0 toch een ander antwoord op, of het is een typfoutje. :)

Edit: ik moet voortaan eerst op dat gele balkje klikken :+ :X

[ Voor 8% gewijzigd door Aloys op 03-11-2011 12:45 ]


Acties:
  • 0 Henk 'm!

  • ValHallASW
  • Registratie: Februari 2003
  • Niet online
Jegorex schreef op donderdag 03 november 2011 @ 12:24:
Als day 0 is dan moet post 0 zijn en niet 7.
Maak er dan van:

JavaScript:
1
2
3
4
5
6
7
8
function getRange(day) {
   if (day == 0) day = 7;
   //en eigenlijk ook meteen assert(day > 0 && day <= 7);
   return {
    pre : day-1,
    post : 7-day
  };
}

Acties:
  • 0 Henk 'm!

  • BenoitRoosens
  • Registratie: Augustus 2010
  • Laatst online: 12-07-2023
Onbekend schreef op donderdag 03 november 2011 @ 12:05:
Ik werk dan liever met een array van tekens (of een string :+ ) zodat je onbeperkt kan uitbreiden.
Was het C++ geweest had je met C++11 heel goed regex kunnen gebruiken, of een string met alle verboden characters en een find per character in de input...

Acties:
  • 0 Henk 'm!

  • PatrickH89
  • Registratie: November 2009
  • Laatst online: 16-09 21:41
Ik kwam vandaag het volgende tegen:

PHP:
1
echo str_replace('thumbnail_','large_', $_SESSION['c']['uri']['http_host'].'*gecensureerd, niet belangrijk*'.$r->id.'/thumbnail_'.$r->filename)


:|

Acties:
  • 0 Henk 'm!

  • martijnve
  • Registratie: December 2004
  • Laatst online: 26-09 11:35
PatrickH89 schreef op donderdag 03 november 2011 @ 12:53:
Ik kwam vandaag het volgende tegen:

PHP:
1
echo str_replace('thumbnail_','large_', $_SESSION['c']['uri']['http_host'].'*gecensureerd, niet belangrijk*'.$r->id.'/thumbnail_'.$r->filename)


:|
Haha, das bestwel een dijenkletser. Eerst zelf een string bouwen en dan iets wat je er zelf tussengezet hebt replacen. Duidelijk een gevalletje steeds verder uitbouwen zonder tussendoor nog na te denken.

Mini-ITX GamePC: Core i5 3470 | 16GB DDR3 | GTX 970 4GB | Samsung 830 128GB | Dell u2711 (27", IPS,1440p), 2343BW


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 02:49

.oisyn

Moderator Devschuur®

Demotivational Speaker

BenoitRoosens schreef op donderdag 03 november 2011 @ 12:46:
[...]


Was het C++ geweest had je met C++11 heel goed regex kunnen gebruiken, of een string met alle verboden characters en een find per character in de input...
regex shipt al met TR1, daar heb je niet per se C++11 voor nodig ;). Maar het kan ook gewoon in C: strcspn(str, "\\/:*?\"<>|").

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • BenoitRoosens
  • Registratie: Augustus 2010
  • Laatst online: 12-07-2023
.oisyn schreef op donderdag 03 november 2011 @ 15:00:
[...]


regex shipt al met TR1, daar heb je niet per se C++11 voor nodig ;). Maar het kan ook gewoon in C: strcspn(str, "\\/:*?\"<>|").
Inderdaad, alhoewel technical reports geen standaard maar een extention is ben ik geen voorstander van het gebruiken ervan.
Jouw oplossing in C zal inderdaad werken, maar een functie gebruiken die de positie van het eerste character uit de 2e buffer geeft en dan de lengte checken is dan niet de mooiste denk ik persoonlijk...

Acties:
  • 0 Henk 'm!

Verwijderd

vriesdude schreef op dinsdag 25 oktober 2011 @ 13:36:
[afbeelding]

Verdere toelichting lijkt me niet nodig ;)
Dat kan natuurlijk makkelijk in een statement.
PHP:
1
2
3
4
5
6
eval("switch(strlen(\$lenCode)) {".
 join("",array_map(function($n){
  return sprintf("case %d: \$txtCouponCode = \"%s\".\$txtCouponCode; break;",
   $n, str_repeat("0", 10-$n));
 }, range(1, 9))).
"}");


:+

[ Voor 10% gewijzigd door Verwijderd op 04-11-2011 13:18 ]


Acties:
  • 0 Henk 'm!

  • kwaakvaak_v2
  • Registratie: Juni 2009
  • Laatst online: 02-06 12:29
met een eval?!

Driving a cadillac in a fool's parade.


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Verwijderd schreef op vrijdag 04 november 2011 @ 13:08:
[...]


Dat kan natuurlijk makkelijk in een statement.
PHP:
1
2
3
4
5
6
eval("switch(strlen(\$lenCode)) {".
 join("",array_map(function($n){
  return sprintf("case %d: \$txtCouponCode = \"%s\".\$txtCouponCode; break;",
   $n, str_repeat("0", 10-$n));
 }, range(1, 9))).
"}");


:+
Je mist nog de conversie naar XML!

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • JohnStaakke
  • Registratie: Oktober 2007
  • Laatst online: 26-09 11:59
Jegorex schreef op donderdag 03 november 2011 @ 12:24:
[...]

Dan is de post fout ;)
Als day 0 is dan moet post 0 zijn en niet 7.
JavaScript:
1
2
3
4
5
6
function getRange(day) {
   return {
    pre : day == 0 ? 6 : (day-1),
    post : day == 0 ? 0 : (7-day)
  };
}
De precieze implementatie van hem had ik overheen gekeken, ik heb echter wel dezelfde structuur aangehouden en identieke code geschreven (los van de 6/7 typo)
ValHallASW schreef op donderdag 03 november 2011 @ 12:45:
[...]


Maak er dan van:

JavaScript:
1
2
3
4
5
6
7
8
function getRange(day) {
   if (day == 0) day = 7;
   //en eigenlijk ook meteen assert(day > 0 && day <= 7);
   return {
    pre : day-1,
    post : 7-day
  };
}
Die is nog eleganter zelfs.

[ Voor 4% gewijzigd door JohnStaakke op 04-11-2011 13:47 ]


Acties:
  • 0 Henk 'm!

  • RetroTycoon
  • Registratie: Juli 2008
  • Laatst online: 26-09 16:09
Vandaag bedacht ik me ineens dat dit geen veilige code is als $search voor $_GET['q'] staat

PHP:
1
2
3
4
    $cache = DIR . '/cache/'. $search;
    if(file_exists($cache) && (time() - filemtime($cache) < 14 * 24 * 60 * 60)) {
        return unserialize(file_get_contents($cache));
    }


Heeft slechts anderhalf jaar in de code gezeten :+

Acties:
  • 0 Henk 'm!

  • Alex)
  • Registratie: Juni 2003
  • Laatst online: 21-08 11:20
Technical Design-documentation ontvangen *O*

Is het een changelog -O-
Dat kan ik ook wel uit TFS halen, het merendeel is niet eens meer van toepassing en het document is nu dus ook waardeloos.

We are shaping the future


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Beetje laat maar toch... over die couponcode die altijd 10 chars moet zijn:

PHP:
1
echo sprintf('%010s', $input)


en klaar... :+

Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 21:01

Patriot

Fulltime #whatpulsert

Verwijderd schreef op vrijdag 04 november 2011 @ 13:08:
[...]


Dat kan natuurlijk makkelijk in een statement.
PHP:
1
2
3
4
5
6
eval("switch(strlen(\$lenCode)) {".
 join("",array_map(function($n){
  return sprintf("case %d: \$txtCouponCode = \"%s\".\$txtCouponCode; break;",
   $n, str_repeat("0", 10-$n));
 }, range(1, 9))).
"}");


:+
Hmm ja, zo zou ik het ook doen denk ik.

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
:N ;(

Acties:
  • 0 Henk 'm!

  • Davio
  • Registratie: November 2007
  • Laatst online: 06-01 16:46
Zo zou Rube Goldberg het doen, denk ik.

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Omdat het kan schoot me er nog een te binnen (hoewel ik die met sprintf mooier vind):

PHP:
1
echo substr(str_pad('', 10, '0') . $value, -10);


Hoe iemand het verzint om er eval() voor te gebruiken begrijp ik echt niet :D

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Hier is weer een leuke hoor:

C#:
1
2
List<int> showSeats = new List<int>();
reservation.ShowSeats.Select(x => x.ShowSeatId).ToList().ForEach(showSeats.Add);

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 02:49

.oisyn

Moderator Devschuur®

Demotivational Speaker

:D useful.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • RayNbow
  • Registratie: Maart 2003
  • Laatst online: 19:51

RayNbow

Kirika <3

Grijze Vos schreef op woensdag 09 november 2011 @ 10:14:
Hier is weer een leuke hoor:

C#:
1
2
List<int> showSeats = new List<int>();
reservation.ShowSeats.Select(x => x.ShowSeatId).ToList().ForEach(showSeats.Add);
Refactor-Get-Rid-of-For-Loops? :D

Ipsa Scientia Potestas Est
NNID: ShinNoNoir


Acties:
  • 0 Henk 'm!

  • Amras
  • Registratie: Januari 2003
  • Laatst online: 26-09 16:58
Dat je hiervoor geen for-loop schrijft kan ik begrijpen, maar doe het dan gewoon zo:

C#:
1
var showSeats = reservation.ShowSeats.Select(x => x.ShowSeatId).ToList();

De ForEach aan het einde slaat gewoon nergens op. :P

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
RayNbow schreef op woensdag 09 november 2011 @ 10:46:
[...]

Refactor-Get-Rid-of-For-Loops? :D
Ik ben bezig met "refactoring by rewriting the entire friggin application" ;)

(nog voor deze in productie is gegaan, overigens.)

[ Voor 10% gewijzigd door Grijze Vos op 09-11-2011 11:16 ]

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
Refactoren om alle for-loops eruit te halen is op zich niet verkeerd - als je weet wat je doet - om functioneel programmeren erin te stampen. Een taal zonder for leren helpt ook :p. Dinsdag even met een collega gepraat die alle for-keywords uit zijn applicatie verbannen heeft. Dit ivm een blogpost of iets dergelijks waar de functionele alternatieven voor klassieke loops uitgelegd worden.

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 26-09 10:03
En terecht, met een while-loop kan je precies hetzelfde! :P for (X x in xCollection) vind ik niet eens zo verkeerd trouwens.

@Grijze vos: herkenbaar, met het verschil dat een eerste versie al wel bij de klant ligt maar nog niet gebruikt wordt :P

  • PiepPiep
  • Registratie: Maart 2002
  • Laatst online: 18-01-2023
Wat heb ik gemist?
Waarom zou je alle for loops willen weg hebben?
Ik vind een
code:
1
2
3
4
for (int i = 0; i < 10; i++)
{
   ...
}

veel duidelijker dan een
code:
1
2
3
4
5
6
int i = 0;
while (i < 10)
{
   ...
   i++;
}

Bij de for variant staat de info die ik wil zien op 1 regel en vergeet ik veel minder snel de i++
Of is de melding dat de for loops eruit moeten een sarcastische opmerking?
code:
1
2
3
4
5
6
int i = 0;
label:
...
i++;
if (i < 10)
   goto label;

Is dat mooi?

486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22


  • Amras
  • Registratie: Januari 2003
  • Laatst online: 26-09 16:58
Het vervangen van for-loops door while-loops of andere loop constructies is niet helemaal wat er bedoeld wordt. In C# is het mogelijk om d.m.v. extension methods op collecties en delegates for-loops te reduceren tot één regel, iets wat door sommigen iets te enthousiast toegepast wordt.

Een voorbeeld:

C#:
1
2
3
4
foreach (var item in someList)
{
    item.DoAction();
}

Dit is in C# te vervangen door:

C#:
1
someList.ForEach(i => i.DoAction());


Als de code in de loop complexer wordt, dan wordt de verkorte schrijfwijze er niet echt leesbaarder op. Vandaar dat het obsessief vervangen van for-loops nog weleens bekritiseerd wordt. ;)

  • Bartjeh
  • Registratie: September 2010
  • Laatst online: 17-09 09:27
Wordt je er wijzer van? Behalve het feit dat je minder regels code kan gebruiken? Voor de leesbaarheid zal ik namelijk liever de eerste pakken (alhoewel ik var liever ook vermijd waar mogelijk).

  • Amras
  • Registratie: Januari 2003
  • Laatst online: 26-09 16:58
Veel wijzer niet nee. Je doet namelijk hetzelfde, al is het in wat minder regels code. De kunst is om er niet in door te slaan, omdat je code dan juist minder leesbaar wordt. Ik gebruik het soms, als de for-loop niet veel code bevat.

Het vermijden van var is trouwens altijd mogelijk, dus daarmee zeg je eigenlijk dat je het nooit gebruikt, hehe. Ik gebruik var regelmatig en met een beetje propere naamgeving van je variabelen is het prima leesbaar. Bij ingewikkelde return-types, zoals uit sommige LINQ-queries, is het een verademing. :)

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Sterker nog, ForEach is een extension method die -niet- standaard in de C# library zit, juist omdat hij side effects heeft, iets wat je juist niet wilt in een functioneel paradigma. Ik kan de haarfijne uitleg van een van de C# language designers even niet zo snel terug vinden.

Mijn voorbeeld ging niet zozeer over die ForEach, maar meer over het feit dat er een lijst van items ints wordt gemaakt waarvan nog eens een lijst wordt gemaakt, zoals sommigen al opgemerkt hadden. ^^

Overigens, 'var' is een ontzettend fijn keyword, ik snap niet waarom je het niet zou gebruiken.

[ Voor 9% gewijzigd door Grijze Vos op 10-11-2011 11:44 ]

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


  • Amras
  • Registratie: Januari 2003
  • Laatst online: 26-09 16:58
Grijze Vos schreef op donderdag 10 november 2011 @ 11:44:
Sterker nog, ForEach is een extension method die -niet- standaard in de C# library zit, juist omdat hij side effects heeft, iets wat je juist niet wilt in een functioneel paradigma. Ik kan de haarfijne uitleg van een van de C# language designers even niet zo snel terug vinden.
Op List<T> wel hoor, maar niet op IEnumerable<T>. :)

  • Napo
  • Registratie: Augustus 2006
  • Niet online
Argh, bestandslocaties die hardcoded zijn zodat je op ieder systeem waar het "programma" wordt gebruikt de gebruiker de code in moet duiken om de locatie aan te passen.
Zo moeilijk is het toch niet om Application.ThisWorkbook.Path te gebruiken

  • Bartjeh
  • Registratie: September 2010
  • Laatst online: 17-09 09:27
Amras schreef op donderdag 10 november 2011 @ 11:35:
Veel wijzer niet nee. Je doet namelijk hetzelfde, al is het in wat minder regels code. De kunst is om er niet in door te slaan, omdat je code dan juist minder leesbaar wordt. Ik gebruik het soms, als de for-loop niet veel code bevat.

Het vermijden van var is trouwens altijd mogelijk, dus daarmee zeg je eigenlijk dat je het nooit gebruikt, hehe. Ik gebruik var regelmatig en met een beetje propere naamgeving van je variabelen is het prima leesbaar. Bij ingewikkelde return-types, zoals uit sommige LINQ-queries, is het een verademing. :)
Ik had het even nagezocht en inderdaad, alleen bij LINQ :) MSDN: var

  • Amras
  • Registratie: Januari 2003
  • Laatst online: 26-09 16:58
Bartjeh schreef op donderdag 10 november 2011 @ 11:53:
[...]


Ik had het even nagezocht en inderdaad, alleen bij LINQ :) MSDN: var
In dit geval kan het ook prima hoor:

C#:
1
var customer = new Customer();


In deze context is het type van customer duidelijk genoeg en kun je prima var gebruiken. Het is zeker prettig als de TypeName erg lang is omdat iemand zonodig zijn halve levensverhaal erin kwijt moest.

Maar goed, uiteindelijk zit er ook een stukje persoonlijke voorkeur in natuurlijk. :)

  • Bartjeh
  • Registratie: September 2010
  • Laatst online: 17-09 09:27
Voor de hoeveelheid typewerk maakt het niet zoveel uit:

code:
1
Customer customer = new ctrl+space ();


Maargoed de discussie is hier niet echt relevant, aangezien dit inderdaad voorkeur is en niet zozeer een slecht voorbeeld :)

  • PiepPiep
  • Registratie: Maart 2002
  • Laatst online: 18-01-2023
Ik dacht dat var net zoiets als object is, maar dat is het alleen als de compiler niet kan uitvinden welke type je er in stopt.
Begrijp ik het zo goed?

486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22


  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
Amras schreef op donderdag 10 november 2011 @ 11:35:
Veel wijzer niet nee. Je doet namelijk hetzelfde, al is het in wat minder regels code
Niet exact.

code:
1
2
3
4
5
6
7
for (x in collection) {
   x.doeIets
}
// en / of
for (int i = 0; i < 10; i++) {
// iets
}


impliceren beide volgorde - de eerste de volgorde volgens de iterator over de collection, de tweede de volgorde volgens de for-loop. Een compiler moet in dit geval wel aannemen dat het op volgorde uitgevoerd moet worden - immers, de volgorde kan invloed hebben op de uitkomst, als het resultaat van een vorige iteratie invloed heeft op de huidige iteratie.

De functionele aanpak - bijvoorbeeld

code:
1
collection.map(x => x.doeIets)


impliceert juist geen volgorde - het enige wat je met deze code impliceert is dat je 'x.doeIets' wilt uitvoeren op alle items in 'collection', niet dat het op volgorde moet.

Wat heeft dat voor voordeel? Parralelisatie. Als collection 4000 items is, kan de library de collection opsplitsen over 4 bakjes en de iteraties en het uitvoeren van doeIets verdelen over 4 cores (of hoeveel cores er maar zijn).

En dat is het voordeel van immutable objects en functioneel programmeren - er is geen afhankelijkheid tussen verschillende iteraties, dus het kan veel beter geoptimaliseerd worden voor multithreaded execution, in tegenstelling tot klassieke iteraties.

Disclaimer: Bovenstaand is puur theoretisch / eigen aannames, ik heb me er stiekem nog nooit echt in verdiept :+.
PiepPiep schreef op donderdag 10 november 2011 @ 12:35:
Ik dacht dat var net zoiets als object is, maar dat is het alleen als de compiler niet kan uitvinden welke type je er in stopt.
Begrijp ik het zo goed?
Nee: var geeft aan dat de compiler gaat uitzoeken wat voor type het moet zijn. Het is stiekem syntactische suiker voor het volledig uitschrijven van het type van de variabele. Waarschijnlijk gaat het nog wel dieper, echter.

  • Amras
  • Registratie: Januari 2003
  • Laatst online: 26-09 16:58
YopY schreef op donderdag 10 november 2011 @ 12:40:
[...]
Niet exact.

code:
1
2
3
4
5
6
7
for (x in collection) {
   x.doeIets
}
// en / of
for (int i = 0; i < 10; i++) {
// iets
}


impliceren beide volgorde - de eerste de volgorde volgens de iterator over de collection, de tweede de volgorde volgens de for-loop. Een compiler moet in dit geval wel aannemen dat het op volgorde uitgevoerd moet worden - immers, de volgorde kan invloed hebben op de uitkomst, als het resultaat van een vorige iteratie invloed heeft op de huidige iteratie.

De functionele aanpak - bijvoorbeeld

code:
1
collection.map(x => x.doeIets)


impliceert juist geen volgorde - het enige wat je met deze code impliceert is dat je 'x.doeIets' wilt uitvoeren op alle items in 'collection', niet dat het op volgorde moet.

Wat heeft dat voor voordeel? Parralelisatie. Als collection 4000 items is, kan de library de collection opsplitsen over 4 bakjes en de iteraties en het uitvoeren van doeIets verdelen over 4 cores (of hoeveel cores er maar zijn).

En dat is het voordeel van immutable objects en functioneel programmeren - er is geen afhankelijkheid tussen verschillende iteraties, dus het kan veel beter geoptimaliseerd worden voor multithreaded execution, in tegenstelling tot klassieke iteraties.

Disclaimer: Bovenstaand is puur theoretisch / eigen aannames, ik heb me er stiekem nog nooit echt in verdiept :+.
Dat ligt er dan aan hoe de ForEach op List<T> door Microsoft is geïmplementeerd. Zelf denk ik dat het er ongeveer zo uit zal zien:

C#:
1
2
3
4
5
public static void ForEach<T>(this List<T> list, Action<T> a)
{
    foreach(var t in list)
        a(t);
}

In dat geval is er in de praktijk dus functioneel geen verschil met de volledig uitgeschreven foreach. Voor jouw theoretische uitleg valt zeker iets te zeggen. :)

Een paralelle foreach is er trouwens ook, maar die zit in een ander framework van Microsoft. ;)

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Het punt is dat je met de code in die foreach nog steeds state kunt beinvloeden die weer effect heeft op de rest van de berekeningen in de volgende iteraties. -Dat- wil je vermijden.
PiepPiep schreef op donderdag 10 november 2011 @ 12:35:
Ik dacht dat var net zoiets als object is, maar dat is het alleen als de compiler niet kan uitvinden welke type je er in stopt.
Begrijp ik het zo goed?
Neen. var is gewoon compile time gecheckt. Het komt eigenlijk neer op "Hey compiler, ik ben te lui om het type te specificeren, lijdt het zelf maar af uit het gebruik". Waar jij aan zit te denken is dynamic, daar wordt pas runtime het type bepaald.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 21:32
Kun je dan wel met .ForEach (wanneer geïmplementeerd) onderdelen uit de collectie verwijderen? Aangezien de volgorde toch niet uitmaakt.

Niet dat ik zoiets per se wil doen, maar ik weet nog wel dat klasgenoten van de compiler op hun vingers getikt werden omdat ze in een foreach-loop objecten uit de collectie wilde verwijderen. Echter kon ik ze maar niet uitgelegd krijgen waarom dat zoiets eigenlijk wel logisch is :X.

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Nope, daar gaat de runtime over mekkeren (niet de compiler).

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


  • Aloys
  • Registratie: Juni 2005
  • Niet online
For Loops kan je wel mooi vervangen door while varianten hoor:
C:
1
2
3
4
5
int i = 10;

while(i--> 0) {
   // doe hier je ding
}

:+
Andere varianten zijn natuurlijk ook nog mogelijk.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 02:49

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ah ja, de --> operator :+

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • PiepPiep
  • Registratie: Maart 2002
  • Laatst online: 18-01-2023
Dat is weer iets wat ik persoonlijk altijd een beetje onduidelijk vind.
code:
1
2
int i = 0;
int j = i++;

of
code:
1
2
int i = 0;
int j = ++i;

In 1e geval is i gelijk aan 1 en in 2e geval i gelijk aan 0 ? of was het net andersom.... ik weet dat ik als programmeur dat eigenlijk zou moeten weten, maar ik vergeet het telkens.
Maar ik denk niet dat het zozeer een slecht programmeer voorbeeld is, meer mijn persoonlijke smaak dat ik het liever niet heb.

/edit
Ik bedenk nog een leuke variant.
code:
1
2
int i = 2;
int j = 3 * i++ + 5 * i++;

Als ik het goed wordt er nu met i = 2 en i = 3 gerekend?
Maar doet de compiler nu 3 * 2 + 5 * 3 = 6 + 15 = 21 of 3 * 3 + 5 * 2 = 9 + 10 = 19 ?
Het zal vast ergens gedefinieerd zijn welke volgorde het is, maar het is (vind ik) gewoon niet duidelijk.

[ Voor 27% gewijzigd door PiepPiep op 10-11-2011 15:19 ]

486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
i zal in beide gevallen gewoon 1 zijn, alleen j is in de eerste variant 0 en in de 2e 1.

Het is heel simpel, als ++ ervoor staat (prefix) increment je eerst en return je daarna de value, als het er na staat ( postfix ) return je eerst de value en daarna increment je.

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


  • BenoitRoosens
  • Registratie: Augustus 2010
  • Laatst online: 12-07-2023
PiepPiep schreef op donderdag 10 november 2011 @ 15:14:
Dat is weer iets wat ik persoonlijk altijd een beetje onduidelijk vind.
code:
1
2
int i = 0;
int j = i++;

of
code:
1
2
int i = 0;
int j = ++i;

In 1e geval is i gelijk aan 1 en in 2e geval i gelijk aan 0 ? of was het net andersom.... ik weet dat ik als programmeur dat eigenlijk zou moeten weten, maar ik vergeet het telkens.
Maar ik denk niet dat het zozeer een slecht programmeer voorbeeld is, meer mijn persoonlijke smaak dat ik het liever niet heb.
i is nooit gelijk aan 0.
++i
i = i + 1

i++
int temp = i + 1;
i = temp;

j zal in het eerste geval 0 zijn en in je 2e 1.

  • Otherside1982
  • Registratie: Februari 2009
  • Laatst online: 18:57
Dat is toch de 64bit/long variant van de -> operator O-)

  • PiepPiep
  • Registratie: Maart 2002
  • Laatst online: 18-01-2023
Oeps, typo, i moest natuurlijk j zijn :)

Klinkt wel duidelijk eigenlijk, eerst de ++ dan de i is dus eerst ophogen.
Maar het geval van die optellingen met meerdere ++'s erin ben ik niet verbaast als hij van rechts naar links rekent. Maar andersom, links naar rechts, ook niet.
Ik weet nog dat ik weleens gezien heb dat een functie f(int a, int b, int c) in assembler aangeroepen wordt door eerst c de stack op te pushen, daarna b en dan a. Dus van rechts naar links en wat je eigenlijk eerst niet zou verwachten als je niet weet hoe de stack en stackframes werken.

486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 02:49

.oisyn

Moderator Devschuur®

Demotivational Speaker

C definieert dan ook helemaal niet in welke volgorde expressies geëvalueerd worden als er geen sequence points (de ; en de ,-operator - let wel: de , bij functieaanroepen is geen operator) tussen staan. Het is dan ook niet handig om een expressie zo op te schrijven dat de uitkomst afhangt van de volgorde waarin hij geëvalueerd wordt.

Overigens, het feit dat de stack zo werkt impliceert nog niet dat de evaluatievolgorde ook hetzelfde is.

[ Voor 40% gewijzigd door .oisyn op 10-11-2011 15:34 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
Grijze Vos schreef op donderdag 10 november 2011 @ 13:42:
Het punt is dat je met de code in die foreach nog steeds state kunt beinvloeden die weer effect heeft op de rest van de berekeningen in de volgende iteraties. -Dat- wil je vermijden.
Tja. State beinvloeden kun je met een simpele Select ook nog steeds. Het probleem is niet dat je state kunt beinvloeden maar dat een for(each) loop bij uitstek state beinvloedt: een loop heeft geen concrete output waarde, dus om iets nuttigs naar buiten te sturen moet dat via een side-effect gebeuren. Dit strookt niet met de functionele idiologie van LINQ en is dus ook waarom ForEach niet op IEnumerable geimplementeerd is.


Als je echt LINQ-geil bent, dan is er wel een manier om het functioneel te doen:

C#:
1
2
3
4
5
6
7
8
9
public static AggregateExtensions {

  public static Action Aggregate( this IEnumerable<Action> source )
  {
    Action actions = null;
    foreach( Action action in source ) { actions += action; }
    return actions;
  }
}


I.p.v. een loop met side-effects projecteer je nu naar een collectie actions, die je vervolgens aggregeert naar één multi-cast delegate. Deze aggregatie is een 'end-of-chain' net zoals bijv. First() of Single() dat is. Hierna kun je het ene resulterende delegate invoken.

Triviaal voorbeeldje:

C#:
1
2
3
4
5
string[] words = new[] { "foo", "bar", "foobar" };
words
  .Select( x => () => Debug.WriteLine(x))
  .Aggregate()
  .Invoke();


Het is alleen wel erg afhankelijk van de situatie of het een goed idee is dit patroon in te zetten. Zelf heb ik er op beperkte wijze success mee gehad waar ik op een IEnumerable een geparametriseerde operatie wil laten plaatsvinden, waarbij de IEnumerable zelf niet naar buiten gestuurd mag worden maar de operatie wel pas later (lazy) uitgevoerd moet worden.

Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 26-09 09:20

Haan

dotnetter

R4gnax schreef op donderdag 10 november 2011 @ 21:49:
Als je echt LINQ-geil bent, dan is er wel een manier om het functioneel te doen:

C#:
1
2
3
4
5
6
7
8
9
public static AggregateExtensions {

  public static Action Aggregate( this IEnumerable<Action> source )
  {
    Action actions = null;
    foreach( Action action in source ) { actions += action; }
    return actions;
  }
}
Jammer dat je de kans laat liggen om wat extra Linq gebruiken :P
C#:
1
2
3
4
public static Action Aggregate(this IEnumerable<Action> source)
{
    return source.Aggregate<Action, Action>(null, (current, action) => current + action);
}

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Da's wat ik bedoelde, jij legt het alleen beter uit. :P

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • afraca
  • Registratie: April 2009
  • Laatst online: 13-08 16:46

afraca

Open Source!

nieuws: Hackersgroep plundert Woondetective.nl en Harry Potter-fansite

Dus ik zat onlangs nog even dat door te kijken op opmerkelijke dingen, zag ik een mooi voorbeeld van slecht geprogrammeerd, bijvoorbeeld:

code:
1
.....@telenet.be_gow_DELETED


Interessante manier om erachter te komen of een account gedelete is.En de random string ertussen is opmerkelijk, iemand een idee waar die voor geweest zou zijn?

IMDB vote history | Next-gen OS, audio en video player, search engine en Movie DB


Acties:
  • 0 Henk 'm!

  • Bartjeh
  • Registratie: September 2010
  • Laatst online: 17-09 09:27
telenet.be = belgische provider

gow = God of War? (Iets beters kan ik niet verzinnen :))

Wikipedia: Gow
Zit hier iets tussen wat logisch klinkt? 8)7

[ Voor 39% gewijzigd door Bartjeh op 11-11-2011 12:56 ]


Acties:
  • 0 Henk 'm!

  • YakuzA
  • Registratie: Maart 2001
  • Niet online

YakuzA

Wat denk je nou zelluf hey :X

Bartjeh schreef op vrijdag 11 november 2011 @ 12:55:
telenet.be = belgische provider

gow = God of War? (Iets beters kan ik niet verzinnen :))

Wikipedia: Gow
Zit hier iets tussen wat logisch klinkt? 8)7
gow is gewoon 'gauw' met een typfout ;)

Death smiles at us all, all a man can do is smile back.
PSN


Acties:
  • 0 Henk 'm!

  • afraca
  • Registratie: April 2009
  • Laatst online: 13-08 16:46

afraca

Open Source!

Als je in de database bladert zie je:

code:
1
2
3
name@provider
//of
name@provider_random_DELETED


dus ook:

code:
1
naam@hotmail.com_rqU_DELETED

IMDB vote history | Next-gen OS, audio en video player, search engine en Movie DB


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Ach, daar kan ik me nog wel iets bij voorstellen. Zo weet je iig zeker dat de user niet per ongeluk ooit nog een mail van je krijgt nadat zn account gedelete is. En zo kun je ook toestaan om nog een keer een nieuw account te registreren op hetzelfde email adres. Zolang het daadwerkelijke verwijderen maar op een andere manier gebeurt, via RBAC, of desnoods een of andere bitflag.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 18:14
Ik vind het wel een aardige oplossing om soft-deletes toe te passen en toch een UNIQUE constraint op e-mailadres te kunnen hebben. Je kunt ook het emailveld op NULL zetten, maar dan kun je een delete niet meer ongedaan maken zonder dat je het originele emailadres weet.

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

T-MOB schreef op vrijdag 11 november 2011 @ 15:05:
Ik vind het wel een aardige oplossing om soft-deletes toe te passen en toch een UNIQUE constraint op e-mailadres te kunnen hebben. Je kunt ook het emailveld op NULL zetten, maar dan kun je een delete niet meer ongedaan maken zonder dat je het originele emailadres weet.
Ik heb een dergelijk systeem ook eens toegepast, maar dan geen "DELETED" oid toegevoegd maar iets als "@<id>@" ervoor, zodat het veld ook echt unique bleef (<id> = natuurlijk het id van dat veld) waarbij je dus wel eventueel ongedaan kan maken, maar belangrijker: zoeken op dat veld binnen deleted kon nog steeds. Er zijn vast mooiere oplossingen, maar dat was de makkelijkste :+

Acties:
  • 0 Henk 'm!

  • IceM
  • Registratie: Juni 2003
  • Laatst online: 26-09 08:55
Erkens schreef op vrijdag 11 november 2011 @ 15:12:
[...]

Ik heb een dergelijk systeem ook eens toegepast, maar dan geen "DELETED" oid toegevoegd maar iets als "@<id>@" ervoor, zodat het veld ook echt unique bleef (<id> = natuurlijk het id van dat veld) waarbij je dus wel eventueel ongedaan kan maken, maar belangrijker: zoeken op dat veld binnen deleted kon nog steeds. Er zijn vast mooiere oplossingen, maar dat was de makkelijkste :+
Euh, een extra kolom 'deleted' met de waarden 0 of 1 lijkt me een betere oplossing dan de e-mail adressen aanpassen door er een tekst bij achter te plakken? Dat lijkt me ook een stuk makkelijker om eerlijk te zijn.

...


Acties:
  • 0 Henk 'm!

  • afraca
  • Registratie: April 2009
  • Laatst online: 13-08 16:46

afraca

Open Source!

Ja, ik snap het hele nut wel (enigszins) van de "DELETED", maar de random string is opmerkelijk.

IMDB vote history | Next-gen OS, audio en video player, search engine en Movie DB


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 18:14
afraca schreef op zaterdag 12 november 2011 @ 14:07:
Ja, ik snap het hele nut wel (enigszins) van de "DELETED", maar de random string is opmerkelijk.
Nu ja, de random string is om te zorgen dat je een e-mailadres een paar keer kunt "verwijderen". Alleen DELETED toevoegen levert je bij de tweede delete immers weer een duplicate op. Daar is een mooiere oplossing voor - je zou zoals Erkens deed de primary key kunnen gebruiken - maar zolang er bij het verwijderen niet op wordt vertrouwd dat 3 cijfers random uniek zal zijn zou ik het niet een slecht programmeervoorbeeld noemen.

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 00:04

Onbekend

...

Waarom zou je nog steeds het oude e-mailadres willen bewaren als er een nieuwe registratie van dat e-mailadres komt?

Je wilt toch niet dat iemand meerdere accounts krijgt?
En als dat wel het geval zou zijn, waarom zou het e-mailadres uniek moeten zijn?

Zelf ben ik geen voorstander van om extra unieke key's te benoemen (uitgezonderd primary key). Mocht er iets toevallig ook uniek moeten zijn, dan zou ik dat software-matig afhandelen en geen database-error afwachten.

Speel ook Balls Connect en Repeat


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 18:14
Onbekend schreef op zaterdag 12 november 2011 @ 14:30:
Waarom zou je nog steeds het oude e-mailadres willen bewaren als er een nieuwe registratie van dat e-mailadres komt?
Tsja, als iets per ongeluk verwijderd is dan wil je het kunnen herstellen. Je weet bij het verwijderen niet of er een nieuwe registratie komt. Maar het is niet gek om een nieuwe registratie toe te staan voor een adres waarvan ooit eens een account verwijderd is.
Je wilt toch niet dat iemand meerdere accounts krijgt?
Exact: 1 niet-verwijderd account per e-mailadres
Zelf ben ik geen voorstander van om extra unieke key's te benoemen (uitgezonderd primary key). Mocht er iets toevallig ook uniek moeten zijn, dan zou ik dat software-matig afhandelen en geen database-error afwachten.
De database-error afwachten is nooit een goed idee. Het benoemen van unieke keys in je database is dat imho wel. Zo'n key levert je namelijk _garanties_ over uniciteit. In een eigen softwarelaag is dat een stuk lastiger te realiseren, je zult race condities moeten tackelen. Zelfs als je het helemaal sluitend maakt werkt het alleen voor zover jouw laag de enige manier is waarop er data in je database kan komen. Dat is natuurlijk lang niet altijd het geval...

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 00:04

Onbekend

...

T-MOB schreef op zaterdag 12 november 2011 @ 15:45:
Tsja, als iets per ongeluk verwijderd is dan wil je het kunnen herstellen. Je weet bij het verwijderen niet of er een nieuwe registratie komt. Maar het is niet gek om een nieuwe registratie toe te staan voor een adres waarvan ooit eens een account verwijderd is.
Geef met een bitje aan dat een gebruiker geblokkeerd is o.i.d. (Geen gebruikers zelf verwijderen i.v.m. verwijzingen naar deze gebruiker.
En waarom is het niet gek?
Exact: 1 niet-verwijderd account per e-mailadres
Indien het e-mailadres aan iemand anders is toegewezen, heeft het ook geen zin meer om van die andere gebruik het e-mailadres te bewaren.
De database-error afwachten is nooit een goed idee. Het benoemen van unieke keys in je database is dat imho wel. Zo'n key levert je namelijk _garanties_ over uniciteit. In een eigen softwarelaag is dat een stuk lastiger te realiseren, je zult race condities moeten tackelen.
Als jij garanties wilt hebben is dat prima, maar wat heb je er aan dat dat adres verplicht uniek is?
En waarom zou dat in jouw software lastig zijn? Als je netjes programmeert en elke laag zijn eigen functies en controles laat doen, komen fouten vanzelf naar boven.
Zelfs als je het helemaal sluitend maakt werkt het alleen voor zover jouw laag de enige manier is waarop er data in je database kan komen. Dat is natuurlijk lang niet altijd het geval...
Dat is waar, maar als je door een ander geschreven stuk software data in jouw database kan wijzigen, dan zou je elk databaseveld in triggers moeten controleren op inconsistente data. Dus dat bijvoorbeeld de ingevoerde postcode ook daadwerkelijk bij die straat+nummer+plaats behoort.

Speel ook Balls Connect en Repeat


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 18:14
Onbekend schreef op zaterdag 12 november 2011 @ 15:57:
Geef met een bitje aan dat een gebruiker geblokkeerd is o.i.d. (Geen gebruikers zelf verwijderen i.v.m. verwijzingen naar deze gebruiker.
Jaja, dat bitje is er ook. En vervolgens gaan we iets doen met het veld "email" waarop een unique constraint ligt. (het is overigens niet mijn systeem, ik vond het alleen een aardige oplossing). Dat is waar het om gaat: het combineren van soft-deletes en UNIQUE-constraints.
Als jij garanties wilt hebben is dat prima, maar wat heb je er aan dat dat adres verplicht uniek is?
Ik heb er bijvoorbeeld aan dat mijn klant dat van me vraagt...
En waarom zou dat in jouw software lastig zijn? Als je netjes programmeert en elke laag zijn eigen functies en controles laat doen, komen fouten vanzelf naar boven.
Het is lastig omdat je een race-conditie moet voorkomen: Wat gebeurt er als 2 mensen op exact hetzelfde moment een account aanmaken met hetzelde e-mailadres? Dat kan je best voorkomen door tabellen te locken. Maar waarom zou ik dat handmatig gaan oplossen als mijn database er functionaliteit voor heeft.

Door het constraint kan ik gewoon doen alsof de race-conditie niet bestaat. Als een rij al bestaat toon ik de gebruiker een melding dat dubbele data niet is toegestaan. Mocht er precies tussen het checken en het daadwerkelijk invoegen van de rij door een ander dezelfde data worden ingevoerd dan krijgt de gebruiker een algemene foutmelding. Die is niet heel gebruiksvriendelijk, maar gezien de kleine kans vind ik dat niet zo erg. Ongeldige data in een database stoppen is wel heel erg, en dat zou gebeuren als de constraint er niet was...
Dat is waar, maar als je door een ander geschreven stuk software data in jouw database kan wijzigen, dan zou je elk databaseveld in triggers moeten controleren op inconsistente data. Dus dat bijvoorbeeld de ingevoerde postcode ook daadwerkelijk bij die straat+nummer+plaats behoort.
Je postcodevoorbeeld is niet zo sterk. Of data inhoudelijk klopt is niet de verantwoordelijkheid van de database. En als ik in de database zou kunnen controleren of een postcode bij een straat+nummer+plaats hoort dan wordt het zo weggenormaliseerd dat je alleen maar postcode plus huisnummer in de tabellen zet waar je dit "fout" had kunnen doen.

Maar goed. Of een kolom uniek moet zijn vind ik een relevante eigenschap van zo'n kolom. Net zo relevant als het datatype. Ik ben wel beniewd naar jouw reden om ze _niet_ te gebruiken. Wat is daar het voordeel van?

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 00:04

Onbekend

...

T-MOB schreef op zaterdag 12 november 2011 @ 17:19:
Het is lastig omdat je een race-conditie moet voorkomen: Wat gebeurt er als 2 mensen op exact hetzelfde moment een account aanmaken met hetzelde e-mailadres? Dat kan je best voorkomen door tabellen te locken. Maar waarom zou ik dat handmatig gaan oplossen als mijn database er functionaliteit voor heeft.
Ik lock inderdaad de tabel om zo'n probleem te voorkomen. Ik wil de gebruiker namelijk zo min mogelijk beperkingen opleggen, en met een gebruiksvriendelijke melding aangeven waarom het toevoegen niet is gelukt.
Maar goed. Of een kolom uniek moet zijn vind ik een relevante eigenschap van zo'n kolom. Net zo relevant als het datatype. Ik ben wel beniewd naar jouw reden om ze _niet_ te gebruiken. Wat is daar het voordeel van?
Mijn mening is dat een programma en database zo flexibel mogelijk moet zijn. De enige eis is dat er een primary key is ( 1 kolom van het type Int of Bigint) waarmee je de regels kan onderscheiden. Er mag w.m.b. gewoon dubbele en overlappende data in staan.

Speel ook Balls Connect en Repeat


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 18:14
Onbekend schreef op zaterdag 12 november 2011 @ 19:00:
Mijn mening is dat een programma en database zo flexibel mogelijk moet zijn. De enige eis is dat er een primary key is ( 1 kolom van het type Int of Bigint) waarmee je de regels kan onderscheiden. Er mag w.m.b. gewoon dubbele en overlappende data in staan.
Stop je dan ook al je data in VARCHARs? Dat is immers "zo flexibel mogelijk".

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 00:04

Onbekend

...

Grapjas. :)

Speel ook Balls Connect en Repeat


Acties:
  • 0 Henk 'm!

  • Down
  • Registratie: Februari 2005
  • Laatst online: 18:12
In een WCF-service die je host in IIS verwijst..


C#:
1
Application.StartupPath


.. in ieder geval niet naar het path waar je service in staat (tenzij je die natuurlijk in dezelfde dir heb staan als w3wp.exe :+). Niet heel verrassend natuurlijk, maar ik had voorheen nog weinig ervaring met WCF, daarom stond ik dus ook even te kijken waarom mijn service bepaalde bestanden dacht te vinden in de directory van IIS :P.


C#:
1
System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath


Verwijst naar de path waar je .svc file zich bevindt :)

Mother north, how can they sleep while their beds are burning?


Acties:
  • 0 Henk 'm!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Onbekend schreef op zaterdag 12 november 2011 @ 19:00:
[...]

Ik lock inderdaad de tabel om zo'n probleem te voorkomen. Ik wil de gebruiker namelijk zo min mogelijk beperkingen opleggen, en met een gebruiksvriendelijke melding aangeven waarom het toevoegen niet is gelukt.
Goede manier om je applicatie niet scalable te maken!

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

IceM schreef op zaterdag 12 november 2011 @ 11:50:
[...]

Euh, een extra kolom 'deleted' met de waarden 0 of 1 lijkt me een betere oplossing dan de e-mail adressen aanpassen door er een tekst bij achter te plakken? Dat lijkt me ook een stuk makkelijker om eerlijk te zijn.
In mijn geval ging het niet om e-mailadressen, maar dat maakt voor dat verhaal niet uit.

Een kolom met "deleted" is sowieso handig, alleen kan je daarmee op database niveau niet ervoor zorgen dat alles uniek blijft. Want wat nu als dat nieuwe record met datzelfde e-mailadres wederom wordt "verwijderd" hoe blijft het dan uniek?
Pagina: 1 ... 74 ... 103 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. :)