Piège (dans lequel je suis tombé…)

Depuis la lecture de ce blog :

https://blog.4d.com/object-notation-improvement-after-customer-feedback/

je n’ai plus peur des valeurs Null. Un peu trop peut-être…

Si j’écris ça, comme attendu, je n’ai pas d’erreur :

<code 4D>
C_OBJECT($otest)

If ($otest.test)

End if

</code 4D>

Le piège dans lequel je suis tombé, c’est qu’en écrivant ça, par contre, j’ai bien une erreur :

<code 4D>
C_OBJECT($otest)

If (Not($otest.test))

End if

</code 4D>

J’avais bien un peu des craintes, elles étaient justifiées…

Bonne journée,

Bonjour,
Il faut utiliser :

If (Not(bol($otest.test)))

salutations

Pas de “bol”, c’est Bool… :mrgreen:

Bool, Paul, pas bol. Bol, c’est la coupe que tu vas pas tarder à devoir te faire faire par un proche nul en coupe de cheveux.

Eric, plus sérieusement, tu as tout intérêt à utiliser le plus souvent possible la notation suivante :

Chaine($MonObjet.ParamTexte)
Num($MonObjet.ParamNumerique)
Bool($MonObjet.ParamBooleen)

Surtout quand t’es pas sûr de son existence :!:

C’est ce que je fais mais comme je savais qu’on pouvait s’en passer dans un Si ou un Au cas où, je ne l’avais pas mis. Mais ce n’était pas exactement un Si…

euh… attention

<code 4D>
If ($o.b)
// if $o.b is undefined this code is not executed

</code 4D>

mais

<code 4D>
If (Not(Bool($o.b)))
// if $o.b is undefined this code IS executed

</code 4D>

Salut,

La question je j’aurais surtout, c’est, est-ce que le fait que ton objet ou la propriété soit null est normale ? Ou est-ce que c’était une erreur de programmation ?

Si c’est la cas, “fail fast, fail early, fail loud” => ASSERT.

sinon si tu veux gérer tous les cas, il faut, il me semble pour la clarté du code gérer les trois états clairement

du genre :

<code 4D>
Case of
: ($o.b=Null)

: ($o.b)

Else

End case

</code 4D>

Je trouve ce code beaucoup plus lisible que le code ou on connait les subtilité du langage qui peuvent être piégeuse…

En SQL (Oracle), par exemple, tu peux avoir une colonne “salary” numérique. Si tu as un NULL dans ton SELECT, la fonction SUM, MIN, MAX te retourneront NULL. Le Null c’est à la fois très pratique, mais il faut le gérer (se poser la question, tester, etc…).

Eric,
Two thoughts.
<code 4D>
C_OBJECT($o)

Case of
:($o.test=Null) // trap
:($o.test=true)
// and do what you will
End case

</code 4D>

or

<code 4D>
C_OBJECT($o)

If(OB GET($o;“test”;is boolean))
// use the 4D magic …
End if

</code 4D>

The OB GET command will not throw an error if you declare the type, as I did. Without the type it will.

Hey Bruno,
Hah - I didn’t see your post before making my own.

Hi Kirk,

It is fine. Great to see you chipping in an sharing your experience and knowledge :smiley: