La domanda è come far fronte all'assenza di dichiarazione di variabili in Python, PHP e simili.
Nella maggior parte delle lingue c'è un modo per far sapere al compilatore se introduco una nuova variabile o mi riferisco a una esistente: my
in Perl ( use strict
) o \newcommand
rispetto a \revewcommand
in LaTeX. Questo impedisce due principali fonti di errori e mal di testa:
(1) usando accidentalmente lo stesso nome di una variabile per due scopi diversi, come in (PHP)
$v = $square * $height;
<...lots of code...>
foreach ($options as $k => $v)
echo "For key $k the value is $v\n";
<...lots of code...>
echo "The volume is $v";
o molto più cattivo (PHP)
$a = [1, 2, 3];
foreach ($a as $k => &$v)
$v++;
foreach ($a as $k => $v)
echo "$k => $v\n";
(puoi vedere un bug qui? provalo!); e
(2) impediscono errori di battitura (PHP):
$option = 1;
$numberofelements = 1;
if ($option)
{
$numberofelenents = 2;
}
echo $numberofelements;
(puoi vedere un bug qui? PHP eseguirà silenziosamente).
Uso di qualcosa come my
(Perl)
use strict;
my $option = 1;
my $numberofelements = 1;
if ($option)
{
$numberofelenents = 2;
}
say $numberofelements;
(Perl segnalerà immediatamente il bug) è un piccolo sforzo e ENORME avvantaggia sia in tempo di debug che (molto più importante) in perdite (potenzialmente enormi) da programmi errati.
Tuttavia, alcune lingue, in particolare Python, PHP e JavaScript, non forniscono alcuna protezione da questi tipi di bug.
La mia domanda è come possiamo far fronte efficacemente a questo?
L'unico modo che posso prevedere è creare due funzioni (PHP):
function a ($x)
{
if (isset ($x))
die();
else
return &$x;
}
e
function the ($x)
{
if (isset ($x))
return &$x;
else
die();
}
e usali sempre:
a($numberofelements) = 1;
the($numberofelenents)++;
say the($numberofelements);
ma ovviamente questo è estremamente macchinoso. Qual è il modo migliore per proteggere efficacemente da tali errori?
No, "usa un'altra lingua", "fai attenzione e non commettere errori" e "dividi il tuo codice in minuscole funzioni" non sono buone risposte (quest'ultima può proteggere dagli errori di tipo 1 ma non di tipo 2 ).