Declarando variáveis em Python e PHP

5

A questão é como lidar com a ausência de declaração de variáveis em Python, PHP e afins.

Na maioria das linguagens, há uma maneira de informar ao compilador se introduzo uma nova variável ou se faço referência a uma existente: my em Perl ( use strict ) ou \newcommand vs. \revewcommand em LaTeX. Isso impede duas principais fontes de erros e dores de cabeça:

(1) acidentalmente usando o mesmo nome de uma variável para dois propósitos diferentes, como em (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";

ou muito mais desagradável (PHP)

$a = [1, 2, 3];
foreach ($a as $k => &$v)
    $v++;
foreach ($a as $k => $v)
    echo "$k => $v\n";

(você pode ver um bug aqui? experimente!); e

(2) evitar erros de digitação (PHP):

$option = 1;
$numberofelements = 1;
if ($option)
{
    $numberofelenents = 2;
}
echo $numberofelements;

(você pode ver um bug aqui? O PHP será executado silenciosamente).

Usando algo como my (Perl)

use strict; 
my $option = 1;
my $numberofelements = 1;
if ($option)
{
    $numberofelenents = 2;
}
say $numberofelements;

(o Perl informará imediatamente o erro) é um pequeno esforço e um grande benefício no tempo de depuração e (muito mais importante) em perdas (potencialmente enormes) de programas incorretos.

No entanto, algumas linguagens, principalmente Python, PHP e JavaScript, não oferecem nenhuma proteção contra esses tipos de bugs.

A minha pergunta é como podemos lidar eficazmente com isso?

A única maneira que posso prever é criar duas funções (PHP):

function a ($x)
{
    if (isset ($x))
        die();
    else
        return &$x;
}

e

function the ($x)
{
    if (isset ($x))
        return &$x;
    else
        die();
}

e use-os sempre:

a($numberofelements) = 1;
the($numberofelenents)++;
say the($numberofelements);

mas é claro que isso é extremamente complicado. Qualquer maneira melhor de proteger eficazmente de tais erros?

Não, "use outro idioma", "tenha cuidado e não cometa erros", e "divida seu código em funções minúsculas" não são boas respostas (o último pode proteger dos erros do tipo 1 mas não do tipo 2 ).

    
por Alexander Gelbukh 23.07.2014 / 15:03
fonte

3 respostas

2

Na minha experiência, existem três maneiras de evitar os problemas descritos acima:

  1. Limite o escopo de suas variáveis
  2. Nomeie suas variáveis como significativas e descritivas
  3. Use um pré-compilador para notificar quaisquer erros (Doval mencionou o pylint para Python)

1) Limitar o escopo de suas variáveis limitará o primeiro erro. Você terá menos variáveis que tenham a possibilidade de conter o mesmo nome. As probabilidades são de que você não terá colisões. Você pode limitar o escopo declarando variáveis apenas no escopo que elas serão usadas. A razão pela qual isso funciona é porque as variáveis serão descartadas como resultado do ciclo natural em seu código. Eu forneci um exemplo abaixo para esclarecer.

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) Nomear suas variáveis com algo significativo ajudará muito a evitar a reutilização do mesmo nome de variável. A chave para nomear suas variáveis é torná-las específicas o suficiente para que seu nome não possa ser reutilizado. Ao refatorar código, é uma boa idéia procurar por nomes de função, variável e classe que possam ser renomeados para refletir melhor sua finalidade e significado. Um exemplo de bons nomes de variáveis é o seguinte:

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

Há muita discrepância ao decidir bons nomes. Todo mundo tem seu próprio estilo. A principal coisa a garantir é que você esteja claro para si mesmo e para os outros, para que serve o método, o parâmetro ou a classe. GetSumOfTwoIntegers como um nome de método diz a qualquer pessoa que esteja chamando esse método que eles precisam passar em dois inteiros e eles receberão a soma como resultado.

3) Finalmente, você pode usar um pré-compilador para informá-lo de quaisquer erros que tenham sido cometidos. Se você estiver usando um bom IDE, ele irá notificá-lo de quaisquer erros. O Visual Studio usa o Intellisence para informar ao desenvolvedor sobre quaisquer erros antes de compilá-lo. A maioria dos idiomas possui um IDE que suporta essa funcionalidade. Usar um certamente resolveria seu segundo problema.

A razão pela qual alguém pode optar por criar a sintaxe de um idioma de uma maneira específica é difícil de determinar. Eu posso postular que no caso do Python era provável que o criador quisesse digitar menos ao escrever código. Leva apenas uma instrução print para criar um programa Hello World em Python. Criar um programa comparável em Java requer muito mais digitação. De qualquer forma, eu realmente não sei porque o criador escolheu esta sintaxe.

    
por 23.07.2014 / 16:52
fonte
2

Além das ferramentas de análise, seu IDE também pode ajudá-lo a descobrir esses tipos de problemas. Eu fiz o movimento para PyCharm porque ele lida com esses tipos de coisas de forma muito mais eficaz, do que dizer, Eclipse & PyDev. É um IDE muito mais visual que ajuda a evitar esses problemas.

    
por 23.07.2014 / 18:13
fonte
0

Existem apenas 3 soluções:

  1. Aceite que você ocasionalmente terá bugs por causa disso e lide com eles conforme eles ocorrem
  2. Use uma ferramenta de análise de lint / estática (por exemplo, pylint )
  3. Use outro idioma
por 23.07.2014 / 15:17
fonte