Na minha experiência, existem três maneiras de evitar os problemas descritos acima:
- Limite o escopo de suas variáveis
- Nomeie suas variáveis como significativas e descritivas
- 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.