Dichiarazione delle variabili in Python e PHP

5

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

    
posta Alexander Gelbukh 23.07.2014 - 15:03
fonte

3 risposte

2

Nella mia esperienza, ci sono tre modi per prevenire i problemi che hai descritto sopra:

  1. Limita l'ambito delle tue variabili
  2. Assegna un nome alle tue variabili qualcosa di significativo e descrittivo
  3. Usa un pre-compilatore per notificare eventuali errori (Doval citato pylint per Python)

1) Limitare l'ambito delle variabili limiterà il primo errore. Avrai meno variabili che hanno la possibilità di contenere lo stesso nome. Le probabilità sono che non avrai alcuna collisione. È possibile limitare l'ambito dichiarando le variabili solo nell'ambito che verranno utilizzate. Il motivo per cui questo funziona è perché le variabili verranno eliminate come risultato del ciclo naturale nel codice. Ho fornito un esempio qui sotto per chiarire.

class:
    classVariable = "classVar";

    function ThisIsAFunction(functionVar) {
        var functionVar2 = "functionVar2";
        if functionVar > functionVar2 :
            var ifStatementVar = "ifStatementVar";

            for i in range(0,2):
                ifStatementVar += i;
            // i will go out of scope here
        // ifStatementVar will go out of scope here
    // functionVar and functionVar2 will go out of scope here

2) Assegnare un nome alle variabili a qualcosa di significativo farà molto per impedire il riutilizzo dello stesso nome di variabile. La chiave nel nominare le variabili è renderle abbastanza specifiche da non poter essere riutilizzato il loro nome. Quando si refactoring il codice è una buona idea cercare nomi di funzioni, variabili e classi che possono essere rinominati per riflettere meglio il loro scopo e significato. Un esempio di buoni nomi di variabili è il seguente:

function GetSumOfTwoIntegers(intFirstNum, intSecondNum):
    return intFirstNum + intSecondNum;

C'è molta discrepanza nel decidere i nomi migliori. Ognuno ha il proprio stile. La cosa principale da accertarsi è che tu sia chiaro a te stesso e agli altri che cosa il metodo, il parametro o la classe dovrebbero fare e per cui devono essere usati. GetSumOfTwoIntegers come nome di un metodo indica a chiunque chiami questo metodo che devono passare in due numeri interi e riceveranno la somma come risultato.

3) Infine, puoi usare un pre-compilatore per dirti di eventuali errori che sono stati fatti. Se stai usando un buon IDE, ti notificherà eventuali errori. Visual Studio utilizza Intellisence per consentire allo sviluppatore di conoscere eventuali errori prima della compilazione. La maggior parte delle lingue ha un IDE che supporta questa funzionalità. Usarne uno risolverebbe sicuramente il tuo secondo problema.

La ragione per cui qualcuno potrebbe scegliere di creare la sintassi di una lingua in un modo specifico è difficile da determinare. Posso dire che nel caso di Python era probabile che il creatore volesse digitare meno durante la scrittura del codice. Basta una dichiarazione di stampa per creare un programma Hello World in Python. La creazione di un programma simile in Java richiede molto più digitazione. Ad ogni modo, non so davvero perché il creatore abbia scelto questa sintassi.

    
risposta data 23.07.2014 - 16:52
fonte
2

Oltre agli strumenti di analisi, l'IDE può anche aiutarti a scoprire questi tipi di problemi. Ho fatto il passaggio a PyCharm perché gestisce questi tipi di cose in modo molto più efficace, che dire, Eclipse & PyDev. È un IDE molto più visivo che ti aiuta a prevenire questi problemi.

    
risposta data 23.07.2014 - 18:13
fonte
0

Esistono solo 3 soluzioni:

  1. Accetta che a volte avrai dei bug a causa di ciò e gestirli man mano che si verificano
  2. Utilizza uno strumento di analisi di lint / statico (ad es. pylint )
  3. Utilizza un'altra lingua
risposta data 23.07.2014 - 15:17
fonte

Leggi altre domande sui tag