[alg] Slechtste programmeervoorbeelden deel 5 Vorige deel Overzicht

Pagina: 1 ... 13 ... 20 Laatste
Acties:

  • diondokter
  • Registratie: Augustus 2011
  • Laatst online: 13:21

diondokter

Dum spiro, spero

Ik mag toch hopen dat het 'LINQ team' slim genoeg is om Any in 1 keer te doen.
Hoe het met EF zit weet ik niet. Zou best kunnen dat het in 2 keer daar gaat. Maar zover ik weet is LINQ != EF.

  • Alex)
  • Registratie: Juni 2003
  • Laatst online: 21-08 11:20
Caelorum schreef op donderdag 11 augustus 2016 @ 23:34:
Waarom wordt altijd EF erbij gehaald als mensen het hebben over LINQ. Leuk dat er een EF provider/implementatie/whatever is, maar dat hoeft hier niet eens van toepassing te zijn. Of het slecht is/preferred is ligt dus heel erg aan de implementatie van de IEnumerable/IObservable/IQueryable/Iwhatever
Ik haal EF erbij omdat dat één van de meestgebruikte providers is (naast Linq-to-Objects), het laat zien wat de impact is van de keuze om éérst .Any() te doen en dan een .ToList().

Ik denk niet dat andere providers anders werken, het zou stom zijn als een provider resultaten cachet. Dat is aan de consumer.

Overigens is Any+ToList ook niet ideaal: als er ná de .Any() een object wordt toegevoegd dat voldoet aan de voorwaarden wordt het niet meer opgehaald, terwijl je dat wel zou willen.

We are shaping the future


  • Alex)
  • Registratie: Juni 2003
  • Laatst online: 21-08 11:20
diondokter schreef op donderdag 11 augustus 2016 @ 23:41:
Ik mag toch hopen dat het 'LINQ team' slim genoeg is om Any in 1 keer te doen.
Hoe het met EF zit weet ik niet. Zou best kunnen dat het in 2 keer daar gaat. Maar zover ik weet is LINQ != EF.
"LINQ" is eigenlijk niet veel meer dan een setje extension methods op IEnumerable en IQueryable, het is aan de onderliggende providers om er iets zinnigs mee te doen. In de praktijk wordt met "LINQ" vaak bedoeld om te filteren tegen een in-memory lijstje.

Linq-to-Objects (de provider voor in memory lijsten) zal de .Any() en de .ToList() apart van elkaar evalueren, net als Entity Framework of Linq-to-SQL.

We are shaping the future


Acties:
  • +2 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

diondokter schreef op donderdag 11 augustus 2016 @ 23:41:
Ik mag toch hopen dat het 'LINQ team' slim genoeg is om Any in 1 keer te doen.
Hoe het met EF zit weet ik niet. Zou best kunnen dat het in 2 keer daar gaat. Maar zover ik weet is LINQ != EF.
Nee, het toverwoord is "deferred execution". Where() return een "promise" (niet letterlijk), die inhoudt "zodra je het resultaat hiervan enumereert, wordt de predicaat pas langs de collectie gehaald".

Deze code:

C#:
1
2
var list = new List<string> { "foo", "bar" };
var promise = list.Where(i => i.StartsWith("f"));


Itereert niet over de lijst. Deze code vervolgens:

C#:
1
2
3
4
if (promise.Any())
{
    var startsWithF = promise.FirstOrDefault();
}


Doet dat tweemaal, namelijk bij Any() én bij FirstOrDefault().

[ Voor 5% gewijzigd door CodeCaster op 11-08-2016 23:50 ]

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


  • diondokter
  • Registratie: Augustus 2011
  • Laatst online: 13:21

diondokter

Dum spiro, spero

CodeCaster schreef op donderdag 11 augustus 2016 @ 23:48:
Doet dat tweemaal, namelijk bij Any() én bij FirstOrDefault().
Dat is logisch :)

Nu ik er over nadenk...
Wat is eigenlijk beter?
C#:
1
2
3
4
5
List<int> values;

if(values.Count > 0)
//of
if(values.Any())


Ik neem aan dat de Any hier sneller is...
Over slechte programmeer voorbeelden gesproken: Ik heb veel code te vervangen 8)7
(Ik ga het wel eerst even uittesten)

Acties:
  • 0 Henk 'm!

  • Alex)
  • Registratie: Juni 2003
  • Laatst online: 21-08 11:20
Waarom zou .Any() volgens jou sneller zijn?

[ Voor 16% gewijzigd door Alex) op 12-08-2016 00:04 ]

We are shaping the future


Acties:
  • 0 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 12:55
Ligt inderdaad een beetje aan hoe List in elkaar is gezet. Als Count al beschikbaar is zou het vast even snel zijn, maar als Count nog moet worden bepaald op de een of andere manier is het ongetwijfeld langzamer. Maar meten = weten, en in de meeste gevallen doet het er niet eens zo heel veel toe. Dat is een 'probleem' waar je eventueel ooit een keer tegenaan loopt.

Acties:
  • 0 Henk 'm!

  • Alex)
  • Registratie: Juni 2003
  • Laatst online: 21-08 11:20
Caelorum schreef op vrijdag 12 augustus 2016 @ 00:06:
Ligt inderdaad een beetje aan hoe List in elkaar is gezet.
Helemaal waar, je bent altijd afhankelijk van de implementatie :)

In dit voorbeeld is het makkelijk vergelijken, vergelijk de source van IEnumerable.Any() maar eens met die van List.Count.

Waar IEnumerable.Any allerlei dingen doet met een enumerator, MoveNext() enzovoorts, kan List.Count gewoon de interne waarde retourneren. Dat betekent dat er veel minder werk hoeft te worden verzet en dat er dus minder stack allocations/deallocations nodig zijn.

We are shaping the future


Acties:
  • 0 Henk 'm!

  • diondokter
  • Registratie: Augustus 2011
  • Laatst online: 13:21

diondokter

Dum spiro, spero

Afbeeldingslocatie: https://i.imgur.com/2d6WtWn.jpg

Nope, nope, nope. :F
Zeker niet!

Waarom ik het dacht?
Ik ging er van uit dat Any zou kijken naar:
Eerste item -> Bestaat die?->Ja:true, Nee:kijk verder.

Dat leek mij sneller dan het gaan tellen hoe lang de list is...

Blijkbaar niet! Ik denk ook dat Count gecached is. Anders zou je die tijd ook niet kunnen halen.

Acties:
  • 0 Henk 'm!

  • Alex)
  • Registratie: Juni 2003
  • Laatst online: 21-08 11:20
Meten is weten, zo blijkt maar weer :)

List.Count wordt inderdaad gecached, zie de sources die ik linkte. Maar zelfs als dat niet zo zou zijn, dan zou deze nog vrij snel zijn omdat een List intern gebruik maakt van een Array.

We are shaping the future


Acties:
  • 0 Henk 'm!

  • RayNbow
  • Registratie: Maart 2003
  • Laatst online: 12:26

RayNbow

Kirika <3

Alex) schreef op donderdag 11 augustus 2016 @ 23:45:
[...]

"LINQ" is eigenlijk niet veel meer dan een setje extension methods op IEnumerable en IQueryable, het is aan de onderliggende providers om er iets zinnigs mee te doen. In de praktijk wordt met "LINQ" vaak bedoeld om te filteren tegen een in-memory lijstje.
Behalve dat:
  • het geen extension methods hoeven te zijn;
  • het niet gebonden is aan IEnumerable of IQueryable.
LINQ is niets anders dan een speciale conventie (noem het een design pattern) waarin een aantal methoden voorgeschreven worden en hoe deze zich vertalen naar de query syntax.

Ipsa Scientia Potestas Est
NNID: ShinNoNoir


Acties:
  • +1 Henk 'm!

  • RobV
  • Registratie: Juni 2013
  • Niet online

RobV

Welcome to the grid, Program.

(overleden)
RayNbow schreef op vrijdag 12 augustus 2016 @ 08:42:
[...]

Behalve dat:
  • het geen extension methods hoeven te zijn;
  • het niet gebonden is aan IEnumerable of IQueryable.
LINQ is niets anders dan een speciale conventie (noem het een design pattern) waarin een aantal methoden voorgeschreven worden en hoe deze zich vertalen naar de query syntax.
Voor de geinteresseerde hier alles over LINQ: Wikipedia: Language Integrated Query

Zullen we het nu weer over grappige, domme en leerzame programmeerfputjrsfoutjes hebben?

 | Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72


Acties:
  • 0 Henk 'm!

  • Styxxy
  • Registratie: Augustus 2009
  • Laatst online: 13:52
.oisyn schreef op donderdag 11 augustus 2016 @ 22:11:
[...]
Hoe dan? Beiden zullen stoppen zodra er een element is gevonden dat aan het predicaat voldoet. En beiden lopen de gehele collection af als dat element niet bestaat.
Ik bedoelde tov de andere 2 LINQ opties. De eerste variant is inderdaad hetzelfde als de FirstOrDefault.

Acties:
  • 0 Henk 'm!

  • AlphaRomeo
  • Registratie: Maart 2007
  • Laatst online: 14:42

AlphaRomeo

FP PowerMod
Ik heb de variabelen even hernoemd, maar in essentie vond ik dit stukje code vanochtend.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool varToUseLater =
    minValue == double.MaxValue ||
(((otherVariable == anotherVariable) && (yetAnotherOne != anotherVariable)) ||
    (((otherVariable == anotherVariable) == (yetAnotherOne == anotherVariable)) &&
    (!var5 && var4 ||
    (var5 == var4 &&
    ((var6 - minValue < -0.1) ||
    (Math.Abs(var6 - minValue) <= 0.1 &&
        (var7 < minVar ||
        (var7 == minVar &&
        ((maxVar > minVar) ||
        ((maxVar == minVar) &&
            ((numberOfVars && !var8) ||
            ((numberOfVars == var8) &&
            counter > maxCounter))))))))))));

Acties:
  • 0 Henk 'm!

  • mobstaa
  • Registratie: Juli 2010
  • Niet online
AlphaRomeo schreef op maandag 15 augustus 2016 @ 12:02:
Ik heb de variabelen even hernoemd, maar in essentie vond ik dit stukje code vanochtend.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool varToUseLater =
    minValue == double.MaxValue ||
(((otherVariable == anotherVariable) && (yetAnotherOne != anotherVariable)) ||
    (((otherVariable == anotherVariable) == (yetAnotherOne == anotherVariable)) &&
    (!var5 && var4 ||
    (var5 == var4 &&
    ((var6 - minValue < -0.1) ||
    (Math.Abs(var6 - minValue) <= 0.1 &&
        (var7 < minVar ||
        (var7 == minVar &&
        ((maxVar > minVar) ||
        ((maxVar == minVar) &&
            ((numberOfVars && !var8) ||
            ((numberOfVars == var8) &&
            counter > maxCounter))))))))))));
Dat is een aardig onoverzichtelijke brei aan condities:)

Nefit EnviLine 7400I AW 7 | Nefit HR 300 liter boiler | Nefit 50 liter buffervat | Nefit Moduline 1010H thermostaat | Buderus pomp | Home Assistant | BBQKees | Itho HRU 300R | Tibber


Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 16-09 15:42

Sebazzz

3dp

Alex) schreef op vrijdag 12 augustus 2016 @ 00:11:
[...]
Dat betekent dat er veel minder werk hoeft te worden verzet en dat er dus minder stack allocations/deallocations nodig zijn.
Heap.

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


Acties:
  • 0 Henk 'm!

  • RobV
  • Registratie: Juni 2013
  • Niet online

RobV

Welcome to the grid, Program.

(overleden)
AlphaRomeo schreef op maandag 15 augustus 2016 @ 12:02:
Ik heb de variabelen even hernoemd, maar in essentie vond ik dit stukje code vanochtend.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool varToUseLater =
    minValue == double.MaxValue ||
(((otherVariable == anotherVariable) && (yetAnotherOne != anotherVariable)) ||
    (((otherVariable == anotherVariable) == (yetAnotherOne == anotherVariable)) &&
    (!var5 && var4 ||
    (var5 == var4 &&
    ((var6 - minValue < -0.1) ||
    (Math.Abs(var6 - minValue) <= 0.1 &&
        (var7 < minVar ||
        (var7 == minVar &&
        ((maxVar > minVar) ||
        ((maxVar == minVar) &&
            ((numberOfVars && !var8) ||
            ((numberOfVars == var8) &&
            counter > maxCounter))))))))))));
Ipv slecht voorbeeld is dit eigenlijk een heel goed voorbeeld. Van hoe het dus NIET moet 8)

 | Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72


Acties:
  • 0 Henk 'm!

  • Vaan Banaan
  • Registratie: Februari 2001
  • Niet online

Vaan Banaan

Heeft ook Apache ontdekt

Klopt, op regel 7 had (var6 - minValue < -0.1) natuurlijk Math.Abs(var6 - minValue) < 0.1 moeten zijn. 8)7 }:O

500 "The server made a boo boo"


Acties:
  • +1 Henk 'm!

  • NESFreak
  • Registratie: December 2009
  • Laatst online: 10:36
AlphaRomeo schreef op maandag 15 augustus 2016 @ 12:02:
Ik heb de variabelen even hernoemd, maar in essentie vond ik dit stukje code vanochtend.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool varToUseLater =
    minValue == double.MaxValue ||
(((otherVariable == anotherVariable) && (yetAnotherOne != anotherVariable)) ||
    (((otherVariable == anotherVariable) == (yetAnotherOne == anotherVariable)) &&
    (!var5 && var4 ||
    (var5 == var4 &&
    ((var6 - minValue < -0.1) ||
    (Math.Abs(var6 - minValue) <= 0.1 &&
        (var7 < minVar ||
        (var7 == minVar &&
        ((maxVar > minVar) ||
        ((maxVar == minVar) &&
            ((numberOfVars && !var8) ||
            ((numberOfVars == var8) &&
            counter > maxCounter))))))))))));
Ach, er is in ieder geval iets van indentatie geprobeerd. Het had ook op één regel kunnen staan. Helaas valt met geen enkele vorm van indentatie hier nog iets aan te redden
https://www.kernel.org/doc/Documentation/CodingStyle
... if you need more than 3 levels of indentation, you're screwed anyway, and should fix your program.
Zelf ga ik dan meer voor korte functies met early return (hoewel sommigen niet tegen multiple exit points kunnen) en && en || altijd splitsen over nieuwe regels, waarbij || ook een indentatie niveau dieper gaat:
code:
1
2
3
4
5
6
7
8
result =
  (
    A == 2 &&
    B == 3
  ) || (
    A == 6 &&
    B == 12
  );

Acties:
  • 0 Henk 'm!

  • Alex)
  • Registratie: Juni 2003
  • Laatst online: 21-08 11:20
Ik haal die twee altijd door elkaar :$

We are shaping the future


Acties:
  • +1 Henk 'm!

  • AlphaRomeo
  • Registratie: Maart 2007
  • Laatst online: 14:42

AlphaRomeo

FP PowerMod
NESFreak schreef op maandag 15 augustus 2016 @ 14:19:
[...]
Zelf ga ik dan meer voor korte functies met early return (hoewel sommigen niet tegen multiple exit points kunnen)
Dat gedram van mensen die pro-SPOE zijn kan ik slecht tegen. De argumenten die ze aandragen zijn alleen van toepassing op functies die teveel regels hebben. Ik ben juist voor early return, vaak scheelt je dat namelijk een hoop extra nesting.
Als ik dit statement zou moeten refactoren zou ik hem ook in een functie zetten, en dan stap voor stap een return maken waar de short-circuiting van .NET het anders zou doen.

Acties:
  • 0 Henk 'm!

  • Styxxy
  • Registratie: Augustus 2009
  • Laatst online: 13:52
Een pareltje van een extension method gevonden:

C#:
1
2
3
4
public static bool HasItems<T>(this IEnumerable<T> source)
{
    return source != null && source.Any();
}


Persoonlijk vind ik dat dit soort extension methods vooral de code er niet duidelijker op maakt.

Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Styxxy schreef op woensdag 17 augustus 2016 @ 15:30:
Een pareltje van een extension method gevonden:

C#:
1
2
3
4
public static bool HasItems<T>(this IEnumerable<T> source)
{
    return source != null && source.Any();
}


Persoonlijk vind ik dat dit soort extension methods vooral de code er niet duidelijker op maakt.
Wat is er mis mee dan? Als je met data moet werken waarop jij geen invloed hebt, en ook nog eens met gegenereerde klassen, is dit een stuk duidelijker dan telkens maar weer if (foo.SomeCollection != null && foo.SomeCollection.Any()) { ... } te moeten gebruiken.

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


Acties:
  • 0 Henk 'm!

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

Janoz

Moderator Devschuur®

!litemod

Ik zou het probleem eerder aan de andere kant oplossen. Dat een collection null kan zijn is imho redelijk debiel. Wanneer gegenereerde code dit oplevert zie ik dat eerder als een bug in die generator.

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!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Janoz schreef op woensdag 17 augustus 2016 @ 16:08:
Ik zou het probleem eerder aan de andere kant oplossen. Dat een collection null kan zijn is imho redelijk debiel. Wanneer gegenereerde code dit oplevert zie ik dat eerder als een bug in die generator.
Gegenereerde code als in: van een webservice, database, of andere bron niet in jouw beheer. Dus de brondata geeft een null terug voor een collection, maar je kunt de gegenereerde code voor het uitlezen niet aanpassen, omdat jouw aanpassingen bij de volgende update weer verloren gaan.

Het alternatief is dan wrapper-properties toevoegen die bronProperty == null ? new List<BronType>() : bronProperty teruggeven en díe properties gebruiken vanuit de caller, maar dat voegt alleen maar clutter en overhead toe: meer properties, en meer werk om te verifiëren dat eventueel nieuwe collectie-properties ook zo'n wrapper krijgen.

[ Voor 19% gewijzigd door CodeCaster op 17-08-2016 16:17 ]

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


Acties:
  • 0 Henk 'm!

  • RobV
  • Registratie: Juni 2013
  • Niet online

RobV

Welcome to the grid, Program.

(overleden)
Debiel of niet debiel, als je in je precondities afspreekt/assert dat 'ie geen null mag zijn en gewoon kan klappen op een ArgumentNullException is er niets aan de hand en hoef je ook niet overdadig te testen

code:
1
2
3
4
5
6
7
8
9
void DoeDing(IEnumerable<string> list)
{
    Debug.Assert(list != null);

    if(list.Any() .....)
    {
        //etc
    }
}

 | Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72


Acties:
  • 0 Henk 'm!

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

Janoz

Moderator Devschuur®

!litemod

Ik heb met veel gegenereerde code gewerkt (webservices, databases, maar ook bv xml en json deserialisation) en in alle gevallen leverde een lege collectie een lege collectie op en niet null. De enige keer dat ik daadwerkelijk null tegen kwam waren dat lazy initialized hibernate collecties waarbij de sessie al verlopen was. Maar in dat geval is null ook een betere representatie van de werkelijkheid.

Heb je voorbeelden CodeCaster?

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!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

XML- en JSON-deserializatie van files, webservices en bijvoorbeeld MongoDB in .NET. Nogmaals, data waar de programmeur geen invloed op heeft, maar die wel as-is verwerkt moet worden.

Dan vind ik een extension method op IEnumerable<T> die ook de null-check doet schoner dan telkens in de aanroepende code de null-check opnemen, en klappen op een null is al helemaal geen optie.

Dit print bijvoorbeeld True (dus: de List<string>-collectie Foo.Baz is null):
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Foo
{
    public string Bar { get; set; }
    public List<string> Baz { get; set; }
}

public class Program
{
    public static void Main()
    {
        var jsonString = "{ \"Bar\" : \"Bar\" }";
        
        var jsonObject = JsonConvert.DeserializeObject<Foo>(jsonString);
        
        Console.WriteLine(jsonObject.Baz == null);
    }
}

[ Voor 56% gewijzigd door CodeCaster op 17-08-2016 16:33 ]

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


Acties:
  • 0 Henk 'm!

  • RobV
  • Registratie: Juni 2013
  • Niet online

RobV

Welcome to the grid, Program.

(overleden)
CodeCaster schreef op woensdag 17 augustus 2016 @ 16:26:
[...]
, en klappen op een null is al helemaal geen optie.
Ik kan het hier helaas niet mee eens zijn. Testen op situaties die je eerder al gevalideerd hebt zonde van tijd en energie. Als je weet dat iets geen nu zou moeten zijn voegt het niets toe. Als je weet dat het antwoord wel eens null zou kunnen zijn natuurlijk wel. Null waar je dat logischerwijs niet verwacht is een uitzondering, en als zodanig is daar ook de Exception stack voor beschikbaar.

Update: mijn relaas gaat natuurlijk niet op bij user input, of externe data. Die mag je van mij helemaal kapotvalideren 8)

[ Voor 10% gewijzigd door RobV op 17-08-2016 16:39 ]

 | Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

RobV schreef op woensdag 17 augustus 2016 @ 16:36:
[...]

Ik kan het hier helaas niet mee eens zijn. Testen op situaties die je eerder al gevalideerd hebt zonde van tijd en energie. Als je weet dat iets geen nu zou moeten zijn voegt het niets toe. Als je weet dat het antwoord wel eens null zou kunnen zijn natuurlijk wel. Null waar je dat logischerwijs niet verwacht is een uitzondering, en als zodanig is daar ook de Exception stack voor beschikbaar.
Moet ik nu echt voor de derde keer zeggen dat het om data gaat waar jij als programmeur geen invloed op hebt, en waarbij afhankelijk van de situatie zowel null als niet-null geldige responses zijn? ;)

Die scenario's bestaan gewoon, zeker bij het consumeren van third-party webservices, databestanden die uit archaïsche tools komen rollen en minder-dan-optimaal ontworpen databases.

Ja, het liefst throw ik ook altijd als ik een null binnenkrijg, maar ik wil ook graag wel eens een stuk software af en door QA heen krijgen, zelfs als ik suboptimale data binnen krijg.

Ik kán me dus indenken dat er scenario's zijn waarbij de door Styxxy getoonde extension method nut heeft. Dat is alles wat ik hier zeg.

[ Voor 15% gewijzigd door CodeCaster op 17-08-2016 16:40 ]

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


Acties:
  • +1 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 11:58

Dido

heforshe

Janoz schreef op woensdag 17 augustus 2016 @ 16:24:
Ik heb met veel gegenereerde code gewerkt (webservices, databases, maar ook bv xml en json deserialisation) en in alle gevallen leverde een lege collectie een lege collectie op en niet null. De enige keer dat ik daadwerkelijk null tegen kwam waren dat lazy initialized hibernate collecties waarbij de sessie al verlopen was. Maar in dat geval is null ook een betere representatie van de werkelijkheid.

Heb je voorbeelden CodeCaster?
Ik moet nu toevallig binnenkomende meuk verwerken (vaststaand formaat) waarin collecties zowel NULL als leeg kunnen zijn, waarbij NULL betekent dat er geen wijziging is, en leeg betekent dat de collectie leeg is of wordt gemaakt. Blij toe dat dat niet altijd naar een lege collectie gedeserialized wordt.

Ben op dergelijke manieren al vaak genoeg NULL collecties tegengekomen, dus hoe debiel je ze ook kunt vinden, ze bestaan echt!

Wat betekent mijn avatar?


Acties:
  • +1 Henk 'm!

  • RobV
  • Registratie: Juni 2013
  • Niet online

RobV

Welcome to the grid, Program.

(overleden)
CodeCaster schreef op woensdag 17 augustus 2016 @ 16:38:
[...]

Moet ik nu echt voor de derde keer zeggen dat het om data gaat waar jij als programmeur geen invloed op hebt [...]
Mea culpa, ik had de comment al aanpast en zie nu jouw reactie pas.

 | Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

RobV schreef op woensdag 17 augustus 2016 @ 16:42:
[...]

Mea culpa, ik had de comment al aanpast en zie nu jouw reactie pas.
En ik lees nu pas het zinnetje "Als je weet dat het antwoord wel eens null zou kunnen zijn natuurlijk wel" midden in jouw antwoord. :*

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


Acties:
  • +1 Henk 'm!

  • RobV
  • Registratie: Juni 2013
  • Niet online

RobV

Welcome to the grid, Program.

(overleden)
Volgens mij zitten we hier voor dezelfde baas te vechten. Handje schudden?

 | Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72


Acties:
  • 0 Henk 'm!

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

Janoz

Moderator Devschuur®

!litemod

Dido schreef op woensdag 17 augustus 2016 @ 16:39:
[...]

Ik moet nu toevallig binnenkomende meuk verwerken (vaststaand formaat) waarin collecties zowel NULL als leeg kunnen zijn, waarbij NULL betekent dat er geen wijziging is, en leeg betekent dat de collectie leeg is of wordt gemaakt. Blij toe dat dat niet altijd naar een lege collectie gedeserialized wordt.

Ben op dergelijke manieren al vaak genoeg NULL collecties tegengekomen, dus hoe debiel je ze ook kunt vinden, ze bestaan echt!
Met een speciale betekenis inderdaad. Zoals ik zelf ook al aangeef (niet geinitialiseerde lijst). Echter laat de extention method eerder zien dat het in dit geval toch echt om een representatie van een lege lijst ging.

Tools die code genereren waarbij een lege collectie gerepresenteerd worden als een property met een null value zijn imho fout. Ik kan me dan ook slecht voorstellen dat dat in .NET blijkbaar zo werkt. Wanneer de WSDL of de XSD aangeeft dat een element 0 of meer keer voorkomt dan wordt dat gerepresenteerd door een List. Wanneer een element 0x voorkomt dan is dat gewoon een Collection.emptyList();

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!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Janoz schreef op woensdag 17 augustus 2016 @ 16:47:
Wanneer een element 0x voorkomt dan is dat gewoon een Collection.emptyList();
Als er geen elementen zitten in het someCollection-element ja.

Maar dan is er nog <someCollection xsi:nil="true" />, of het hele <someCollection>-element mist...

[ Voor 26% gewijzigd door CodeCaster op 17-08-2016 16:53 ]

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


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik gooi de discussie even over een andere boeg:
Wat er mis mee is is dat je dan dus collection.HasItems() mag doen terwijl collection null is. Je laat mensen dus code schrijven die verkeerd geïnterpreteerd kan worden, want iemand zou zomaar de aanname kunnen maken dat collection dus niet null is (want anders had de HasItems() een stukje terug al een exception gegooid)

Met de functie zelf is niets mis, maar maak er dan geen extenson method van. Want wat is er mis met HasItems(collection) ipv collection.HasItems()?

[ Voor 39% gewijzigd door .oisyn op 17-08-2016 16:58 ]

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!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

.oisyn schreef op woensdag 17 augustus 2016 @ 16:55:
Ik gooi de discussie even over een andere boeg:

[...]
wat is er mis met HasItems(collection) ipv collection.HasItems()?
Dat die methode niet globaal bestaat, en dus in iedere klasse waarin 'ie gebruikt moet worden opnieuw gedefiniëerd moet worden. Zelden retourneert een API maar één type.

Dit verhaal van mij, waarin ik een extension method verdedig die iemand anders belachelijk vindt zonder verder enige context te geven, bevat ondertussen de volgende aannames:

• Er is een API of andere databron waarop we geen invloed hebben.
• Uit deze databron worden klassen gegenereerd om de data uit te lezen. Deze klassen wil je niet aanpassen.
• Deze databron kan voor bepaalde collections zowel een gevulde, als lege, als null-collection retourneren, en alledrie deze gevallen zijn geldig.
• Deze collection-properties komen veelvuldig voor, niet alleen meerdere malen binnen één klasse, maar zelfs in meerdere klassen.
• De programmeur wil niet overal waar deze collection-properties worden uitgelezen, de code if (foo.CollectionProperty != null && foo.CollectionProperty.Any()) { ... } gebruiken.

Dán vind ik dat zo'n extension method weinig kwaad kan.
.oisyn schreef op woensdag 17 augustus 2016 @ 16:55:
Je laat mensen dus code schrijven die verkeerd geïnterpreteerd kan worden, want iemand zou zomaar de aanname kunnen maken dat collection dus niet null is (want anders had de HasItems() een stukje terug al een exception gegooid)
Daar zit dan wel weer wat in.

[ Voor 14% gewijzigd door CodeCaster op 17-08-2016 17:05 ]

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


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

CodeCaster schreef op woensdag 17 augustus 2016 @ 17:01:
[...]

Dat die methode niet globaal bestaat, en dus in iedere klasse waarin 'ie gebruikt moet worden opnieuw gedefiniëerd moet worden.
Dat is natuurlijk een non-argument, je kunt de functie gewoon toevoegen aan een class. Zul je voor de extension method óók moeten doen trouwens, dus blijkbaar is er al een plek voor.
Zelden retourneert een API maar één type.
Hoe is dat relevant? Werken generics niet op static methods?

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!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

.oisyn schreef op woensdag 17 augustus 2016 @ 17:09:
[...]

Dat is natuurlijk een non-argument, je kunt de functie gewoon toevoegen aan een class. Zul je voor de extension method óók moeten doen trouwens, dus blijkbaar is er al een plek voor.


[...]

Hoe is dat relevant? Werken generics niet op static methods?
Oh, dus de methode is wel OK, maar niet als extension of instance method maar dan gewoon als static method. Ja, daar heb je zeker een punt mee.

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


Acties:
  • +2 Henk 'm!

  • Styxxy
  • Registratie: Augustus 2009
  • Laatst online: 13:52
CodeCaster schreef op woensdag 17 augustus 2016 @ 15:40:
[...]
Wat is er mis mee dan? Als je met data moet werken waarop jij geen invloed hebt, en ook nog eens met gegenereerde klassen, is dit een stuk duidelijker dan telkens maar weer if (foo.SomeCollection != null && foo.SomeCollection.Any()) { ... } te moeten gebruiken.
Ter info, is voor data dat we zelf onder controle hebben ;). Normaliter zijn de properties niet null (kan wel leeg zijn). Verder was deze extension method amper 20 keer gebruikt, op een gigantische code-base. Zulke methodes zorgen voor verwarring.

Wat er mis mee is: ik werk veel in een code base waar ondertussen heel véél extension methods gedefinieerd zijn van het kaliber dat ik toonde. In heel die hoop, wordt er random wél en niét gecontroleerd op NULL. De naam geeft ook niet duidelijk aan of dat er op NULL gecontroleerd wordt. Telkens als ik zo'n methode tegen kom, moet ik naar de implementatie gaan om te kijken wat er in gebeurt. Ik schrijf sneller "if (coll != null && coll.Any()" dan "coll.HasItems". Ik wil standaard code schrijven, zonder 1000 extension methods van buiten te kennen of ze wel of niet op null checken.
CodeCaster schreef op woensdag 17 augustus 2016 @ 17:01:
[...]
Dit verhaal van mij, waarin ik een extension method verdedig die iemand anders belachelijk vindt zonder verder enige context te geven, bevat ondertussen de volgende aannames:

• Er is een API of andere databron waarop we geen invloed hebben.
• Uit deze databron worden klassen gegenereerd om de data uit te lezen. Deze klassen wil je niet aanpassen.
• Deze databron kan voor bepaalde collections zowel een gevulde, als lege, als null-collection retourneren, en alledrie deze gevallen zijn geldig.
• Deze collection-properties komen veelvuldig voor, niet alleen meerdere malen binnen één klasse, maar zelfs in meerdere klassen.
• De programmeur wil niet overal waar deze collection-properties worden uitgelezen, de code if (foo.CollectionProperty != null && foo.CollectionProperty.Any()) { ... } gebruiken.

Dán vind ik dat zo'n extension method weinig kwaad kan.
Verdere context nog: extension method was toegevoegd in een algemene library, dat overal standaard gereferencet wordt (soort van standard library in het bedrijf).

• In dit geval niet. Echter, mocht dat het geval zijn, werken we sowieso in lagen. Data van externe partijen komen slechts op één locatie binnen en worden verder getransformeerd naar een intern formaat. Vooral omdat we vaak werken met meerdere leveranciers van ongeveer dezelfde data (of gelijkaardige data). Datastructuren van een externe partij vloeien niet door in het verdere verwerkingsproces.
• Klasses die gegenereerd worden, zijn over het algemeen partial klasses en zijn perfect uit te breiden in een aparte code file, zodat je niet in de generated code moet zitten aanpassen.
• Wanneer je elke 5 regels (bij wijze van spreken) een controle moet doen of eenzelfde property NULL is, is dat vaak voor mij al een eerste indicatie dat de code niet goed in elkaar zit. Mijn principe is steeds: data van een externe bron moet je niet vertrouwen, doe eerst validaties en onderneem acties voor niet verwachte waarden (waarbij ik een NULL voor een collectie vaak als "niet verwacht" bestempel).
CodeCaster schreef op woensdag 17 augustus 2016 @ 16:38:
[...]
Ik kán me dus indenken dat er scenario's zijn waarbij de door Styxxy getoonde extension method nut heeft. Dat is alles wat ik hier zeg.
Ik zie ook zeker wel scenario's waarbij zo'n functie nut kan hebben; maar dan nog durf ik te zeggen dat een Extension Method niet de correctie methode is. Elke keer dat een type (waar je zelf geen invloed op hebt) moet uitbreiden met een Extension Method, moet je goed nadenken of dat het écht wel meerwaarde heeft (in plaats van bv een null check minder te moeten typen); zeker op algemene types van het .NET framework. Ik heb zelden het gevoel dat ik methodes mis op types in het .NET framework. Af en toe komt het voor, maar dat zijn wel methodes die iets meer inhoud hebben dan een conditie uitsparen in een if-statement.

[ Voor 58% gewijzigd door Styxxy op 18-08-2016 02:45 ]


Acties:
  • +1 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 11:39

Haan

dotnetter

Sinds C# 6 is de desbetreffende extension method sowieso overbodig vanwege de Null-conditional Operator B)

C#:
1
2
List<Foo> foos = null;
Foo x = foos?[0]; 
Welke foo O-)

[ Voor 26% gewijzigd door Haan op 18-08-2016 10:11 ]

Kater? Eerst water, de rest komt later


  • Robicide
  • Registratie: Maart 2016
  • Laatst online: 11:33
Je hebt foo niet gedefinieerd!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Janoz schreef op woensdag 17 augustus 2016 @ 16:47:
[...]

Tools die code genereren waarbij een lege collectie gerepresenteerd worden als een property met een null value zijn imho fout. Ik kan me dan ook slecht voorstellen dat dat in .NET blijkbaar zo werkt. Wanneer de WSDL of de XSD aangeeft dat een element 0 of meer keer voorkomt dan wordt dat gerepresenteerd door een List. Wanneer een element 0x voorkomt dan is dat gewoon een Collection.emptyList();
Het gebeurt hier elke maand wel een keer dat wij een webservice genereren tegen een WSDL vna een externe partij, en dan blijken we als we webservice calls gaan doen dat de data die we terugkrijgen niet eens valideert tegen diezelfde WSDL. (M.a.w. hun WSDL is niet gegenereert uit hun code, maar gespecificeerd en de code is er handmatig tegenaan geprogrammeert. :s) Als dat al zo veelvuldig voorkomt, ga je dan werkelijk aannemen dat lege lijsten netjes zo geinitialiseerd worden? Ik niet. ;)

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


Acties:
  • +1 Henk 'm!

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

Janoz

Moderator Devschuur®

!litemod

Grijze Vos schreef op donderdag 18 augustus 2016 @ 10:47:
[...]


Het gebeurt hier elke maand wel een keer dat wij een webservice genereren tegen een WSDL vna een externe partij, en dan blijken we als we webservice calls gaan doen dat de data die we terugkrijgen niet eens valideert tegen diezelfde WSDL. (M.a.w. hun WSDL is niet gegenereert uit hun code, maar gespecificeerd en de code is er handmatig tegenaan geprogrammeert. :s) Als dat al zo veelvuldig voorkomt, ga je dan werkelijk aannemen dat lege lijsten netjes zo geinitialiseerd worden? Ik niet. ;)
Ik ga er iig niet mijn complete codebase op aanpassen. Fixen bij de deur zodat de rest van onze eigen code clean, voorspelbaar en onderhoudbaar blijft.

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


  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Daar zijn we het over eens. ;)

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


  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Styxxy, bedankt voor de uitleg.

En ja, als je het allemaal goed scheidt, kun je er na het ontvangen/inlezen voor zorgen dat null-lijsten naar lege lijsten in jouw klassen worden gemapt. Als...

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


  • Styxxy
  • Registratie: Augustus 2009
  • Laatst online: 13:52
CodeCaster schreef op donderdag 18 augustus 2016 @ 14:01:
Styxxy, bedankt voor de uitleg.

En ja, als je het allemaal goed scheidt, kun je er na het ontvangen/inlezen voor zorgen dat null-lijsten naar lege lijsten in jouw klassen worden gemapt. Als...
Daar waak ik dan ook streng over. Zoals Janoz aangaf, de data aan de voordeur aanpakken. :)

Overigens had je inderdaad gelijk dat er niet genoeg context gegeven was ;) .

[ Voor 9% gewijzigd door Styxxy op 18-08-2016 14:05 ]


  • mbarie
  • Registratie: Mei 2011
  • Laatst online: 04-08-2021
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
<?php

echo '<pre>';
$lol = ['a','b'];
debug_zval_dump($lol); // refcount = 2 door assignen en debug_zval

$nieuw = $lol;
debug_zval_dump($lol); // refcount = 3 door nogmaals assignen en debug_zval, dus $nieuw is geen kopie van $lol maar een reference.

$lol[] = 'c';

debug_zval_dump($lol); // refcount = 2, want nu anders dan $nieuw en gebruikt in debug_zval


Nou doet PHP copy-on-write, zoals hierboven duidelijk zou moeten worden.

In onze xml client werd eenmaal de XML representatie van een array gezet, en de rest middels references in de XML geregeld. Dit dus omdat de array een reference is. Oplossing was het dereferencen van de arrays middels array_values, wat in ons geval volstaat. Helaas niet erg transparant :(

Dit kwam dan weer aan het licht omdat een stukje middleware niet in staat was de referenties in de XML te resolven.

[ Voor 52% gewijzigd door mbarie op 18-08-2016 16:04 ]

Storyteller @ soundcloud


  • F.West98
  • Registratie: Juni 2009
  • Laatst online: 00:51

F.West98

Alweer 16 jaar hier

Met C#6 kan je die hele extension method ook zo doen O-)
C#:
1
2
3
4
List<Foo> foos = null;
if(foos?.Any() ?? false) {
    ...
}

2x Dell UP2716D | R9 7950X | 128GB RAM | 980 Pro 2TB x2 | RTX2070 Super
.oisyn: Windows is net zo slecht in commandline als Linux in GUI


  • RobV
  • Registratie: Juni 2013
  • Niet online

RobV

Welcome to the grid, Program.

(overleden)
F.West98 schreef op donderdag 18 augustus 2016 @ 18:19:
Met C#6 kan je die hele extension method ook zo doen O-)
C#:
1
2
3
4
List<Foo> foos = null;
if(foos?.Any() ?? false) {
    ...
}
Ja, stukken beter leesbaar |:(

(Ik had je engeltje gezien, dus ik weet dat je het goed bedoelde)

[ Voor 10% gewijzigd door RobV op 18-08-2016 18:36 ]

 | Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 11:39

Haan

dotnetter

F.West98 schreef op donderdag 18 augustus 2016 @ 18:19:
Met C#6 kan je die hele extension method ook zo doen O-)
C#:
1
2
3
4
List<Foo> foos = null;
if(foos?.Any() ?? false) {
    ...
}
O'rly 8)7
Haan schreef op donderdag 18 augustus 2016 @ 09:01:
Sinds C# 6 is de desbetreffende extension method sowieso overbodig vanwege de Null-conditional Operator B)

C#:
1
2
List<Foo> foos = null;
Foo x = foos?[0]; 
:>

Kater? Eerst water, de rest komt later


  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

Zulke code wordt hier aan de lopende band gemaakt / gecopypaste :'(

Zoek de verschillen (code is geanonimiseerd)

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
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
74
75
76
77
78
79
80
81
82
83
84
85
<?php

class RandomUtilClass {

    public static function load(Class $class) {
        
        ...
        
        // Vorige
        $sql = "SELECT c.`id`, DATE_FORMAT(c.`date_entered`, '%d-%m-%Y') as `date`,
                  cm.`value`
                FROM tabel1 AS c
                INNER JOIN tabel2 AS t
                  ON t.id = c.tpl_id
                INNER JOIN tabel3 AS ct
                  ON t.type = ct.id
                LEFT JOIN tabel4 AS cm
                  ON cm.`key` = 'blaat1' AND cm.`parentid` = c.`id`
                LEFT JOIN tabel5 AS cm2
                  ON cm2.`key` = 'active' AND cm2.`parentid` = c.`uid`
                WHERE ct.tag = 'mytag'
                  AND c.`date_deleted` IS NULL
                  AND (cm.`value` < myvalue OR cm.`value` IS NULL)
                  AND (cm2.`value` = '1')
                  AND cm.`value` > (SELECT `value` FROM table6 WHERE `parentid` = myparentid AND `key` = 'mykey')
                ORDER BY cm.`value` ASC
                LIMIT 1";

        if ( $result = $db->query($sql) ) {

            if ($result->rowCount() > 0) {

                if ( $row = $result->fetch() ) {

                    $obj = ...

                    $class->assign("PREVIOUS", array(
                        "title" => $obj["title"],
                        "url" => "/mything/" . $obj["key"]
                    ));

                    $class->parse("main.previous");
                }
            }
        }

        // Volgende
        $sql = "SELECT c.`id`, DATE_FORMAT(c.`date_entered`, '%d-%m-%Y') as `date`,
                  cm.`value`
                FROM tabel1 AS c
                INNER JOIN tabel2 AS t
                  ON t.id = c.tpl_id
                INNER JOIN tabel3 AS ct
                  ON t.type = ct.id
                LEFT JOIN tabel4 AS cm
                  ON cm.`key` = 'blaat1' AND cm.`parentid` = c.`id`
                LEFT JOIN tabel5 AS cm2
                  ON cm2.`key` = 'active' AND cm2.`parentid` = c.`uid`
                WHERE ct.tag = 'mytag'
                  AND c.`date_deleted` IS NULL
                  AND (cm.`value` < myvalue OR cm.`value` IS NULL)
                  AND (cm2.`value` = '1')
                  AND cm.`value` < (SELECT `value` FROM table6 WHERE `parentid` = myparentid AND `key` = 'mykey')
                ORDER BY cm.`value` DESC
                LIMIT 1";

        if ( $result = $db->query($sql) ) {

            if ($result->rowCount() > 0) {

                if ( $row = $result->fetch() ) {

                    $obj = ...

                    $class->assign("NEXT", array(
                        "title" => $obj["title"],
                        "url" => "/mything/". $obj["key"]
                    ));

                    $class->parse("main.next");
                }
            }
        }
    }
}

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


  • CurlyMo
  • Registratie: Februari 2011
  • Laatst online: 14:53
Wat mij zo opvalt, buiten het knip/plak werk:

1. Zou niet een van de twee kanten een >= of <= moeten bevatten?
2. Ik zou dit omdraaien zodat er nooit een waarde tegen NULL vergeleken wordt:
code:
1
cm.`value` < myvalue OR cm.`value` IS NULL

naar
code:
1
cm.`value` IS NULL OR cm.`value` < myvalue

3. Waarom bevat cm2.`value` een numerieke waarde, maar is hij opgeslagen in een character veld?
4. Kan er geen ORM gebruik worden?

Sinds de 2 dagen regel reageer ik hier niet meer


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

CurlyMo schreef op woensdag 28 september 2016 @ 11:25:
2. Ik zou dit omdraaien zodat er nooit een waarde tegen NULL vergeleken wordt:
code:
1
cm.`value` < myvalue OR cm.`value` IS NULL

naar
code:
1
cm.`value` IS NULL OR cm.`value` < myvalue
Verandert niets aan de situatie. Het is niet dat je een null pointer exception krijgt in je db laag oid :). Een waarde die NULL is vergelijken met iets anders levert NULL als resultaat op. NULL OR TRUE is vervolgens gewoon TRUE.

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.


  • CurlyMo
  • Registratie: Februari 2011
  • Laatst online: 14:53
In SQL is dat waar, maar in veel programmeertalen niet. Daarom vind ik het zelf een good practice om ook in SQL eerst te vergelijken op NULL en daarna op een waarde.

Sinds de 2 dagen regel reageer ik hier niet meer


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

NULL in SQL betekent echt héél wat anders dan null in een willekeurige programmertaal, dus die logica vat ik niet :). NULL in SQL heeft het gedrag van "ongedefinieerd".

[ Voor 18% gewijzigd door .oisyn op 28-09-2016 11:39 ]

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.


  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
.oisyn schreef op woensdag 28 september 2016 @ 11:38:
NULL in SQL betekent echt héél wat anders dan null in een willekeurige programmertaal, dus die logica vat ik niet :). NULL in SQL heeft het gedrag van "ongedefinieerd".
En wat betekent null in een willekeurige programmeertaal dan? Want ik verkeerde altijd in de veronderstelling dat dat ook gewoon betekende "ongedefinieerd".

  • jbdeiman
  • Registratie: September 2008
  • Laatst online: 07:08
Gomez12 schreef op woensdag 28 september 2016 @ 12:47:
[...]

En wat betekent null in een willekeurige programmeertaal dan? Want ik verkeerde altijd in de veronderstelling dat dat ook gewoon betekende "ongedefinieerd".
In de meeste talen heb je het verschil tussen Undefined en is_null (wel gedefinifieerd, maar geen waarde voor opgegeven.


PHP:
1
2
3
4
5
6
<?php
echo $var; // niet gedefinieerd = undefined

$var;
echo $var; // wel gedefinieerd, maar geen waarde opgegeven. is_null
?>

Dat geldt ook voor talen als C#, maar ook in JavaScript op deze manier.

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Gomez12 schreef op woensdag 28 september 2016 @ 12:47:
[...]

En wat betekent null in een willekeurige programmeertaal dan? Want ik verkeerde altijd in de veronderstelling dat dat ook gewoon betekende "ongedefinieerd".
NULL is in SQL bijvoorbeeld niet eens gelijk aan zichzelf met de =-operator:
SQL:
1
2
3
select 'true' where null = null

-- Output: (0 row(s) affected)

Maar:
C#:
1
2
3
if (null == null) Console.WriteLine("true");

// Output: true


En short-circuiting (waar CurlyMo naar lijkt te hinten) is bij SQL sowieso afhankelijk van de implementatie. MSSQL doet aan short-circuiting maar dat zal voor elke SQL-dialect wel weer anders zijn ...

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


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Gomez12 schreef op woensdag 28 september 2016 @ 12:47:

En wat betekent null in een willekeurige programmeertaal dan?
Dat betekent "niets". Dat is wat anders dan "ongedefinieerd".
kenneth schreef op woensdag 28 september 2016 @ 13:38:
En short-circuiting (waar CurlyMo naar lijkt te hinten) is bij SQL sowieso afhankelijk van de implementatie. MSSQL doet aan short-circuiting maar dat zal voor elke SQL-dialect wel weer anders zijn ...
Nou weet ik niet waar je precies op doelt, maar short-circuiting is niet waar we het over hebben. Short circuiting betekent dat in een expressie a <op> b, b niet wordt geëvalueerd als uit a al blijkt wat het resultaat moet zijn. Als de lhs gelijk is aan false bij AND, of true bij OR, dan is de rhs niet meer interessant.

Met trinary logic heb je naast true en false ook indeterminate, oftewel "onbekend". In het geval van indeterminate OR true is het resultaat gewoon true, omdat de onbekende waarde het resultaat niet kan beinvloeden (er is immers al een operand true). Hetzelfde voor indeterminate AND false.
NULL in SQL gedraagt zich als indeterminate. Ik dacht eigenlijk dat dat standaard was?

[ Voor 69% gewijzigd door .oisyn op 28-09-2016 13:55 ]

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.


  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

.oisyn schreef op woensdag 28 september 2016 @ 13:49:
Nou weet ik niet waar je precies op doelt, maar short-circuiting is niet waar we het over hebben.
Dat maakte ik op uit:
CurlyMo schreef op woensdag 28 september 2016 @ 11:37:
Daarom vind ik het zelf een good practice om ook in SQL eerst te vergelijken op NULL en daarna op een waarde.
Net zoals je in C# if (foo != null && foo.Length > 5) doet om geen NRE te krijgen op de rhs van de and-expressie mocht foo == null.
Met trinary logic heb je naast true en false ook indeterminate, oftewel "onbekend". In het geval van indeterminate OR true is het resultaat gewoon true, omdat de onbekende waarde het resultaat niet kan beinvloeden (er is immers al een operand true). Hetzelfde voor indeterminate AND false.
NULL in SQL gedraagt zich als indeterminate. Ik dacht eigenlijk dat dat standaard was?
Dat is standaard maar short-circuiting is implementatieafhankelijk waardoor dit niet in alle dialecten wordt geaccepteerd:
SQL:
1
2
3
select 'true' where null = null and 'f' = 1

-- (0 row(s) affected)

MSSQL voert bovenstaande gewoon uit maar klaagt pas als de rhs ook geëvalueerd moet worden:
SQL:
1
2
3
select 'true' where null = null or 'f' = 1

-- Conversion failed when converting the varchar value 'f' to data type int.

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


  • CurlyMo
  • Registratie: Februari 2011
  • Laatst online: 14:53
kenneth schreef op woensdag 28 september 2016 @ 14:10:
[code]
MSSQL voert bovenstaande gewoon uit maar klaagt pas als de rhs ook geëvalueerd moet worden:
SQL:
1
2
3
select 'true' where null = null or 'f' = 1

-- Conversion failed when converting the varchar value 'f' to data type int.
PostgreSQL
SQL:
1
2
3
4
select 'true' where null = null or 'f' = 1

ERROR:  invalid input syntax for integer: "f"
LINE 1: select 'true' where null = null or 'f' = 1

Sinds de 2 dagen regel reageer ik hier niet meer


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

kenneth schreef op woensdag 28 september 2016 @ 14:10:
Net zoals je in C# if (foo != null && foo.Length > 5) doet om geen NRE te krijgen op de rhs van de and-expressie mocht foo == null.
Sure, maar de waarde uit je expressie zal hetzelfde zijn, ongeacht de volgorde. Tenzij er fouten in zitten idd, zoals je aantoont.
CurlyMo schreef op woensdag 28 september 2016 @ 14:30:
[...]


PostgreSQL
SQL:
1
2
3
4
select 'true' where null = null or 'f' = 1

ERROR:  invalid input syntax for integer: "f"
LINE 1: select 'true' where null = null or 'f' = 1
Het is interessanter om te zien wat PostgreSQL doet bij AND ipv OR.

[ Voor 32% gewijzigd door .oisyn op 28-09-2016 14:41 ]

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:
  • +1 Henk 'm!

  • PolarBear
  • Registratie: Februari 2001
  • Niet online
.oisyn schreef op woensdag 28 september 2016 @ 13:49:
[...]

Met trinary logic heb je naast true en false ook indeterminate FileNotFound
FTFY :Y)

  • CurlyMo
  • Registratie: Februari 2011
  • Laatst online: 14:53
.oisyn schreef op woensdag 28 september 2016 @ 14:40:
Het is interessanter om te zien wat PostgreSQL doet bij AND ipv OR.
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
select * from (values
    ( NULL, 1 ),
    ( 'a', 2 ),
    ( 'b', 3 )
) as z (
    a, b
) inner join
(values
    ( NULL, 'a' ),
    ( 'a', '2' ),
    ( 'b', '3' )
) as x (
    c, d
)
on
    (z.a IS NULL or (z.b::int = x.d::int))


SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
select * from (values
    ( NULL, 1 ),
    ( 'a', 2 ),
    ( 'b', 3 )
) as z (
    a, b
) inner join
(values
    ( NULL, 'a' ),
    ( 'a', '2' ),
    ( 'b', '3' )
) as x (
    c, d
)
on
    (z.a IS NOT NULL and (z.b::int = x.d::int))

In beide gevallen krijg je de foutmelding:
code:
1
ERROR: invalid input syntax for integer: "a"


Ik kan me zo voorstellen dat het in het voorbeeld @kenneth over MySQL gaat en dan is het wel handig om te weten hoe het zit als je zulke dingen gaat doen:
SQL:
1
 AND (cm2.`value` = '1')

Sinds de 2 dagen regel reageer ik hier niet meer


Acties:
  • +1 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Nee hij had het over MSSQL. Ik heb geprobeerd MySQL een error te laten genereren maar hij vindt alles prima }:|.

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.


  • CurlyMo
  • Registratie: Februari 2011
  • Laatst online: 14:53
.oisyn schreef op woensdag 28 september 2016 @ 14:57:
Nee hij had het over MSSQL. Ik heb geprobeerd MySQL een error te laten genereren maar hij vindt alles prima }:|.
Dat bedoel ik. MySQL doet wel aan short circuiting.

Sinds de 2 dagen regel reageer ik hier niet meer


Acties:
  • 0 Henk 'm!

  • BdR
  • Registratie: Juni 2001
  • Laatst online: 03-09 16:28

BdR

TV is gooder then books

Ik kwam dit pareltje tegen op m'n werk hier, van een collega die normaal gesproken goed werk levert.
Dit zal wel een copy&paste haastklus zijn geweest :')
SQL:
1
2
3
4
5
..
WHERE
    c.NAME not in ('CHANGED_ON','CHANGED_BY','ENABLEAUDIT','COMPLETEFLAG')
and o.NAME = 'VW_CONTRACTORDERS'
AND SUBSTRING(UPPER(o.NAME) + '.' + UPPER(c.NAME),len(CAST(UPPER(o.NAME) AS VARCHAR))+2,100) = 'CONTRACTTYPE'

Kan ook geschreven worden als volgt, exact hetzelfde resultaat en ws. nog sneller ook.
SQL:
1
2
3
4
..
WHERE
    o.NAME = 'VW_CONTRACTORDERS'
AND c.NAME = 'CONTRACTTYPE'

mijn web games -> Impossible Snake 2 :: Impossible Snake :: Snake Slider


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

CurlyMo schreef op woensdag 28 september 2016 @ 14:58:
[...]

Dat bedoel ik. MySQL doet wel aan short circuiting.
Kun je daar eens een voorbeeld van geven dan? De post is alweer een tijdje geleden :P, maar volgens mij had ik vooral moeite met het überhaupt genereren van een error, short circuiting of niet. In MySQL mag je een character namelijk gewoon met een int vergelijken.

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!

  • CurlyMo
  • Registratie: Februari 2011
  • Laatst online: 14:53
.oisyn schreef op donderdag 19 januari 2017 @ 11:24:
[...]


Kun je daar eens een voorbeeld van geven dan? De post is alweer een tijdje geleden :P, maar volgens mij had ik vooral moeite met het überhaupt genereren van een error, short circuiting of niet. In MySQL mag je een character namelijk gewoon met een int vergelijken.
Klopt, ik was te optimistisch. Het is vrijwel onmogelijk om MySQL iets netjes te laten doen, zelfs als je het probeert :)

Sinds de 2 dagen regel reageer ik hier niet meer


Acties:
  • +4 Henk 'm!

  • Scr33x0r
  • Registratie: September 2004
  • Laatst online: 17-09 09:01
Ik deel niet vaak wat, maar dit moet ik even delen.. We zijn PHP aan het uitfaseren en kwam vandaag dit tegen:

PHP:
1
2
3
        $datum = date('d-m-Y', strtotime($data['date']));
        $dateArr = explode("-", $datum);
        $datum = $dateArr[2]."-".$dateArr[1]."-".$dateArr[0];


Ik wist al dat ik in crap code bezig was, maar dit slaat werkelijk alles..

Acties:
  • 0 Henk 'm!

  • Iva Wonderbush
  • Registratie: December 2016
  • Laatst online: 16-09 07:34
Op werk hebben we code van een andere bedrijf gekregen die we even na moeten lopen en invoegen bij ons website.. Ik kwam gisteren dit tegen:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$jobs = $_POST['jobs'];

if($_POST['otherJobtitle']!=""){
    $noempty = true;
}

foreach($_POST['jobs'] as $k=>$v){
    if($noempty) {
        if($jobList[$v]!=""){
            $jobTitlesPosted[] = array(
                'id' =>$v,
                'jobTitle' => $jobList[$v]
            );
        }
    } else {
        $jobTitlesPosted[] = array(
            'id' =>$v,
            'jobTitle' => $jobList[$v]
        );  
    }
}


De langer dat je er naar kijkt des te erger het word. En de code werkte niet eens! Heb het uiteindelijk omgezet naar dit (de array opbouw mag ik helaas niet bepalen, ze hebben namelijk ook een geweldige API..):

PHP:
1
2
3
4
5
6
7
$jobs = $_POST['jobs'];
foreach ($jobs as $job) {
    $jobTitlesPosted['jobTitleDetail'][] = [
        'id' => $job,
        'jobTitle' => $jobList[$job - 1]
    ];
}


Oh en je zou de login moeten zien, er wordt een sessie gezet met de e-mail van je account en je bent ingelogd en kan alles aanpassen :'(

Ik heb gisteren met m'n collega elke keer lopen huilen. Ik ben hiervoor geen programmeur geworden natuurlijk! |:(

Acties:
  • 0 Henk 'm!

  • mcDavid
  • Registratie: April 2008
  • Laatst online: 09-09 17:48
PHP:
1
2
3
4
5
6
7
public function isOffice()
    {
        // not sunday, not saterday and between 09:00 and 17:30
        if (date('w') != 0 && date('w') != 6 && date('G') > 9 && (date('G') < 18 && date('i') < 30)) {
            return true;
        }
    }


Ik kwam vandaag deze tegen. Blijkbaar mogen ze daar ieder uur een half uur pauze nemen O+

Acties:
  • 0 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
Iva Wonderbush schreef op woensdag 8 februari 2017 @ 16:47:
Oh en je zou de login moeten zien, er wordt een sessie gezet met de e-mail van je account en je bent ingelogd en kan alles aanpassen :'(
Je weet dat je dit mag melden bij het NCSC, toch?

Maak je niet druk, dat doet de compressor maar


Acties:
  • 0 Henk 'm!

  • Iva Wonderbush
  • Registratie: December 2016
  • Laatst online: 16-09 07:34
DJMaze schreef op woensdag 8 februari 2017 @ 17:05:
[...]

Je weet dat je dit mag melden bij het NCSC, toch?
Oh, niet aan gedacht, maar hun website word vervangen door de nieuwe die wij maken dus dat zit er gelukkig straks niet meer in.

Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 11:58

Dido

heforshe

mcDavid schreef op woensdag 8 februari 2017 @ 17:03:
PHP:
1
2
3
4
5
6
7
public function isOffice()
    {
        // not sunday, not saterday and between 09:00 and 17:30
        if (date('w') != 0 && date('w') != 6 && date('G') > 9 && (date('G') < 18 && date('i') < 30)) {
            return true;
        }
    }


Ik kwam vandaag deze tegen. Blijkbaar mogen ze daar ieder uur een half uur pauze nemen O+
En tussen 9 en 10 is het koffiepauze 8)7

Briljante code die maar weer eens laat zien dat TDD soms toch niet zo'n geen slecht idee is :X

Wat betekent mijn avatar?


Acties:
  • +2 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Er is zelfs een kans dat 18:00 door de test komt :) (en die ga je er met TDD niet uithalen ;))

[ Voor 29% gewijzigd door .oisyn op 08-02-2017 17:40 ]

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!

  • RobV
  • Registratie: Juni 2013
  • Niet online

RobV

Welcome to the grid, Program.

(overleden)
Ze hebben toch hun best gedaan door extra haakjes, echter geheel zonder nut.

 | Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72


Acties:
  • +1 Henk 'm!

  • vickypollard
  • Registratie: Juni 2009
  • Laatst online: 14:55
Scr33x0r schreef op woensdag 8 februari 2017 @ 16:36:
Ik deel niet vaak wat, maar dit moet ik even delen.. We zijn PHP aan het uitfaseren en kwam vandaag dit tegen:

PHP:
1
2
3
        $datum = date('d-m-Y', strtotime($data['date']));
        $dateArr = explode("-", $datum);
        $datum = $dateArr[2]."-".$dateArr[1]."-".$dateArr[0];


Ik wist al dat ik in crap code bezig was, maar dit slaat werkelijk alles..
Wauw.

Acties:
  • 0 Henk 'm!

  • Thijmen
  • Registratie: Juni 2011
  • Laatst online: 25-07 13:16
.oisyn schreef op woensdag 8 februari 2017 @ 17:37:
Er is zelfs een kans dat 18:00 door de test komt :) (en die ga je er met TDD niet uithalen ;))
Die zie ik niet zo? Hoe zou dat kunnen dan?

Acties:
  • 0 Henk 'm!

  • Coca-Cola
  • Registratie: Maart 2001
  • Laatst online: 07:01
Thijmen schreef op donderdag 9 februari 2017 @ 10:29:
[...]

Die zie ik niet zo? Hoe zou dat kunnen dan?
Omdat er telkens een nieuwe 'date()' call gedaan wordt

Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 11:58

Dido

heforshe

.oisyn schreef op woensdag 8 februari 2017 @ 17:37:
Er is zelfs een kans dat 18:00 door de test komt :) (en die ga je er met TDD niet uithalen ;))
Scherp.

Als je met je eigen mock voor de implementatie van date werkt zou je wel kunnen testen dat ie maar 1 keer wordt gebruikt. Maar ja, als je eraan denkt om dat in je test te zetten bedenk je waarschijnlijk ook dat je niet deze code moet produceren. Dat is natuurlijk altijd een beetje de valkuil van developers en tests; als je een mogelijke bug aftest is de kans vrij groot dat je de bug niet maakt, terwijl juist degene die dit soort bugs produceert niet op het idee komt om erop te testen :P

Wat betekent mijn avatar?


Acties:
  • 0 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
mcDavid schreef op woensdag 8 februari 2017 @ 17:03:
PHP:
1
2
3
4
5
6
7
public function isOffice()
    {
        // not sunday, not saterday and between 09:00 and 17:30
        if (date('w') != 0 && date('w') != 6 && date('G') > 9 && (date('G') < 18 && date('i') < 30)) {
            return true;
        }
    }


Ik kwam vandaag deze tegen. Blijkbaar mogen ze daar ieder uur een half uur pauze nemen O+
Hangt er vanaf welke timezone er ingesteld staat en waar jij bent.
Stel een Nederlands bedrijf deed outsourcing in India (UTC +5:30) en gebruikt
PHP:
1
date_default_timezone_set('Asia/Calcutta');

Lekkere werktijden heb je dan in Nederland :)

Oh, en saterday bestaat helemaal niet

Maak je niet druk, dat doet de compressor maar


Acties:
  • +1 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 11:46
Dido schreef op donderdag 9 februari 2017 @ 13:23:
[...]

Scherp.

Als je met je eigen mock voor de implementatie van date werkt zou je wel kunnen testen dat ie maar 1 keer wordt gebruikt. Maar ja, als je eraan denkt om dat in je test te zetten bedenk je waarschijnlijk ook dat je niet deze code moet produceren. Dat is natuurlijk altijd een beetje de valkuil van developers en tests; als je een mogelijke bug aftest is de kans vrij groot dat je de bug niet maakt, terwijl juist degene die dit soort bugs produceert niet op het idee komt om erop te testen :P
Het nut om die test toch te schrijven is dat het nu werkt, en nu heb jij er goed over nagedacht. Als volgende week iets in de standaard-regels veranderd moet worden, controleer je met die test of de uitzondering nog steeds goed werkt.
En ik heb toch echt wel een paar keer bestaande code gewijzigd, waarna ineens de unittests omvielen. Huh, wat? Oh ja, die uitzondering had ik niet aan gedacht... :z
Of code geschreven, test voor de uitzondering geschreven, en "huh, hoe kan dat nou? Het werkt niet!" Oh ja, haakjes (of zoiets)

[ Voor 5% gewijzigd door MBV op 09-02-2017 17:28 ]


Acties:
  • +4 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
Hotel geboekt met de naam "Henk Jan Iñtërnâtiônàlizætiøn"
En omschrijving: ǝƃɐssǝɯ sıɥʇ pɐǝɹ oʇ ɐıʃɐɹʇsn∀ oʇ o⅁
De SOAP API response van één van de grootste boeking portals.
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="UTF-8"?>
<BookingRetrievalRS>
    <Bookings>
        <Booking>
            <RoomStay>
                <PaymentCard cardCode="VI" cardNumber="" seriesCode="123" expireDate="0118">
                    <CardHolder name="Henk Jan I&amp;#241;t&amp;#235;rn&amp;#226;ti&amp;#244;n&amp;#224;liz&amp;#230;ti&amp;#248;n" address="Any street1 Any street2" city="Any city" stateProv="MA" country="US" postalCode="98004"/>
                </PaymentCard>
            </RoomStay>
            <PrimaryGuest>
                <Name givenName="Henk" surname="Jan Internationalization"/>
            </PrimaryGuest>
            <SpecialRequest code="4">ss s p o sn o o</SpecialRequest>
        </Booking>
    </Bookings>
</BookingRetrievalRS>

CardHolder name="Henk Jan Iñtërnâtiônàlizætiøn":
- entity encoded |:(
- CC mag eigenlijk alleen A-Z 8)7

PrimaryGuest:
- ja die vervangen wel met A-Z |:(
- We splitsen de ingevulde naam op de eerste spatie 8)7

SpecialRequest:
- waar is mijn "ǝƃɐssǝɯ sıɥʇ pɐǝɹ oʇ ɐıʃɐɹʇsn∀ oʇ o⅁" gebleven?

Eigenlijk is dit niet echt programmeer code, eerder het resultaat er van :)

[ Voor 17% gewijzigd door DJMaze op 09-02-2017 20:52 ]

Maak je niet druk, dat doet de compressor maar


Acties:
  • +1 Henk 'm!

  • Pistolebob
  • Registratie: Februari 2011
  • Laatst online: 08-09 19:46
Otto.nl:

Afbeeldingslocatie: https://i.imgur.com/VPRfM2t.png

Negatieve aantallen van producten zijn toe te voegen aan de winkelwagen 8)7

Acties:
  • 0 Henk 'm!

  • Robicide
  • Registratie: Maart 2016
  • Laatst online: 11:33
Pistolebob schreef op vrijdag 10 maart 2017 @ 15:26:
Otto.nl:

[afbeelding]

Negatieve aantallen van producten zijn toe te voegen aan de winkelwagen 8)7
De prijs blijft wel altijd minimaal 0 euro + verzendkosten + evt artikelen die niet op een negatief aantal staan :+

Acties:
  • +18 Henk 'm!

  • RobV
  • Registratie: Juni 2013
  • Niet online

RobV

Welcome to the grid, Program.

(overleden)
Realiseer je wel dat je bij bezorging een TV moet inleveren.

 | Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72


Acties:
  • 0 Henk 'm!

  • Ofyles2
  • Registratie: Februari 2010
  • Laatst online: 11-01-2024
Pistolebob schreef op vrijdag 10 maart 2017 @ 15:26:
Otto.nl:

[afbeelding]

Negatieve aantallen van producten zijn toe te voegen aan de winkelwagen 8)7
Gewoon een JavaScriptje herschrijven, presto.

Acties:
  • 0 Henk 'm!

  • Pistolebob
  • Registratie: Februari 2011
  • Laatst online: 08-09 19:46
Ofyles2 schreef op vrijdag 10 maart 2017 @ 23:41:
[...]


Gewoon een JavaScriptje herschrijven, presto.
Dan los je het probleem clientside op, lijkt me idd heel verstandig :P

Acties:
  • 0 Henk 'm!

  • Neko Koneko
  • Registratie: December 2006
  • Niet online
(overleden)
Pistolebob schreef op vrijdag 10 maart 2017 @ 15:26:
Otto.nl:

[afbeelding]

Negatieve aantallen van producten zijn toe te voegen aan de winkelwagen 8)7
Ik ga meteen -1 nieuwe tv bestellen :*)

End-users are clingy complaining dipshits who will never ever be grateful for any concession you make. The moment you shut out their shrill, tremulous voices, the happier you will be for it.


Acties:
  • 0 Henk 'm!

  • spleethoven
  • Registratie: Oktober 2010
  • Laatst online: 24-01-2024
Kan je effectief bestellen, of is het gewoon de frontend die het toelaat?

Acties:
  • +3 Henk 'm!

  • JJ93
  • Registratie: Maart 2013
  • Laatst online: 17-09 22:19

JJ93

Error 418

spleethoven schreef op dinsdag 14 maart 2017 @ 09:54:
Kan je effectief bestellen, of is het gewoon de frontend die het toelaat?
Bij kiwi-electronics.nl kon ik de 'disabled' state van de 'Bestel' button aanpassen naar 'enabled'. Hierdoor kon ik een Raspberry Pi Zero W in mijn winkelwagentje stoppen en gewoon afrekenen. Is twee dagen later ook bezorgd, terwijl er op de website stond dat er nul voorraad was. :+

Acties:
  • 0 Henk 'm!

  • shdx
  • Registratie: November 2009
  • Laatst online: 14:02
JJ93 schreef op dinsdag 14 maart 2017 @ 13:47:
[...]

Bij kiwi-electronics.nl kon ik de 'disabled' state van de 'Bestel' button aanpassen naar 'enabled'. Hierdoor kon ik een Raspberry Pi Zero W in mijn winkelwagentje stoppen en gewoon afrekenen. Is twee dagen later ook bezorgd, terwijl er op de website stond dat er nul voorraad was. :+
:F Dat is knap. Stond de teller daarna ook op -1?

Acties:
  • 0 Henk 'm!

  • JJ93
  • Registratie: Maart 2013
  • Laatst online: 17-09 22:19

JJ93

Error 418

shdx schreef op dinsdag 14 maart 2017 @ 14:10:
[...]

:F Dat is knap. Stond de teller daarna ook op -1?
Nee er stond 'geen voorraad' dus verder geen nummer. Blijkbaar dus handmatig aangezet, want er bleek nog wel voorraad te zijn. Paar vrienden van me hebben namelijk ook op deze manier besteld. (zo wist er ook van)

Acties:
  • 0 Henk 'm!

  • Webgnome
  • Registratie: Maart 2001
  • Laatst online: 14:42
Dan heb je een wachtwoord van 8 karakters wegens verplichtingen van de website. Krijg je de melding dat je een nieuw wachtwoord moet kiezen in verband met een beter / vernieuwd systeem. Krijg je vervolgens dit te zien:

Wachtwoord Vitens

Sta je dan met je password generator..

[ Voor 4% gewijzigd door Webgnome op 19-03-2017 08:57 ]

Strava | AP | IP | AW


Acties:
  • 0 Henk 'm!

  • vickypollard
  • Registratie: Juni 2009
  • Laatst online: 14:55
Webgnome schreef op zondag 19 maart 2017 @ 08:56:
Dan heb je een wachtwoord van 8 karakters wegens verplichtingen van de website. Krijg je de melding dat je een nieuw wachtwoord moet kiezen in verband met een beter / vernieuwd systeem. Krijg je vervolgens dit te zien:

[afbeelding]

Sta je dan met je password generator..
Als ze nu overal 'minimaal' voorzetten zou het nog wat zijn. Dit is gewoon ruk :/ Overigens niet echt een programmeervoorbeeld :p

Acties:
  • 0 Henk 'm!

  • mcDavid
  • Registratie: April 2008
  • Laatst online: 09-09 17:48
vickypollard schreef op zondag 19 maart 2017 @ 12:10:
[...]

Als ze nu overal 'minimaal' voorzetten zou het nog wat zijn. Dit is gewoon ruk :/ Overigens niet echt een programmeervoorbeeld :p
Dit kan toch alleen maar "minimaal" zijn? Vrijwel iedere passwordgenerator voldoet hier wel aan met de standaard instellingen.

Als het wachtwoord echt exact aan die eisen moet voldoen is de entropie idd wel ver te zoeken :')

Acties:
  • 0 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 12:55
mcDavid schreef op zondag 19 maart 2017 @ 15:59:
[...]

Dit kan toch alleen maar "minimaal" zijn? Vrijwel iedere passwordgenerator voldoet hier wel aan met de standaard instellingen. [...]
Keepass genereerd iig standaard wachtwoorden met alleen letters en cijfers, dus geen tekens.
Maar die eisen zijn sowieso super vaag en gaan nergens over. Een minimum van x aantal tekens kan ik nog inkomen, maar verder moeten er gewoon geen eisen worden gesteld. (nouja, misschien een max zodat je niet in de problemen komt met unieke hashes maken, maar dan moet je wel een outdated hashing algoritme gebruiken hoor :)).
Pagina: 1 ... 13 ... 20 Laatste

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