Você tem um ponto perfeitamente válido, os idiomas que não controlam o tipo de uma variável existem e são chamados de "tipo dinâmico". A categoria inclui idiomas como JavaScript, Perl, Lisp e Python.
A vantagem que obtemos de uma linguagem de tipo estaticamente é uma verificação adicional de erros em tempo de compilação.
Suponha, por exemplo, que você tenha o seguinte método:
public addCustomerContact(Customer client, Employee contact) {
...
}
Seria possível, se você tiver um cliente bob
e um funcionário james
em seu código, ligar por engano addCustomerContact(james, bob)
, o que é inválido. Mas se o compilador não souber os tipos das variáveis, não será possível avisá-lo de que você fez uma chamada inválida. Em vez disso, ocorrerá um erro no tempo de execução ... e como os idiomas de tipo dinâmico não verificam o tipo de parâmetros transmitidos aos métodos, esse problema ocorre sempre que seu código tenta usar propriedades do james
objeto somente para clientes ou propriedades somente para funcionários do bob
objeto. Isso pode demorar muito depois que o par (james, bob) foi adicionado à lista de contatos do cliente.
Agora, você pode se perguntar, por que não pode o compilador ainda inferir o tipo de james
e bob
, e ainda nos avisar? Às vezes, isso é possível, mas se as variáveis realmente não tiverem tipo, poderíamos fazer o seguinte:
var james;
var bob;
if (getRandomNumber() > 0.5) {
james = new Customer();
bob = new Employee();
} else {
james = new Employee();
bob = new Customer();
}
É perfeitamente legal atribuir qualquer valor a qualquer variável, pois dissemos que as variáveis não têm tipo. Isso também significa que nem sempre podemos saber o tipo de uma variável, porque ela pode ser de tipos diferentes, com base em diferentes caminhos de execução.
Em geral, linguagens de tipo dinâmico são usadas para linguagens de script, onde não há etapa de compilação e, portanto, não existem erros de compilação, o que significa que as teclas extras necessárias para fornecer o tipo de variáveis não seriam muito úteis.
Também existem algumas vantagens distintas em linguagens dinamicamente tipadas, principalmente em termos de menos código para implementar o mesmo design: as interfaces não precisam ser escritas, porque tudo é "tipificado" (nós apenas nos importamos com os métodos / propriedades que um objeto possui , e não a qual classe o objeto pertence), as variáveis não precisam receber um tipo explícito ... com a troca que descobrimos sobre um pouco menos de bugs antes de começarmos a executar nosso código.