Pergunta

Parece-me que a coisa mais valiosa sobre a / linguagem de programação fortemente tipado estática é que ele ajuda a refatoração:. Se / quando você alterar qualquer API, então o compilador irá dizer-lhe o que essa mudança tem quebrado

Eu posso imaginar escrevendo código em um / idioma fracamente tipado runtime ... mas eu não posso imaginar refatoração sem a ajuda do compilador, e eu não posso imaginar escrevendo dezenas de milhares de linhas de código sem refatoração.

Isso é verdade?

Foi útil?

Solução

Eu acho que você está confundindo quando os tipos são verificados com a forma como eles são verificados. Runtime digitação não é necessariamente fraco.

A principal vantagem de tipos estáticos é exatamente o que você diz: eles são exaustivas. Você pode ter certeza de todos os sites de chamada em conformidade com o tipo de apenas deixando o compilador fazê-lo de coisa.

A principal limitação de tipos estáticos é que eles estão limitados nas restrições que podem expressar. Isso varia de acordo com a linguagem, com a maioria dos idiomas ter sistemas relativamente simples tipo (C, Java) e outros com sistemas extremamente poderosos tipo (Haskell, caiena).

Devido a isso os tipos de limitação por si só não são suficientes. Por exemplo, em tipos Java são mais ou menos restrito de verificar nomes tipo de correspondência. Isto significa que o significado de qualquer restrição que você quer verificado tem de ser codificado em um esquema de nomenclatura de algum tipo, daí a multiplicidade de indireções e placa de caldeira comum no código java. C ++ é um pouco melhor, em que os modelos permitem que um pouco mais expressividade, mas não chegam perto do que você pode fazer com tipos dependentes. Eu não tenho certeza que as desvantagens para os sistemas do tipo mais poderosos são, embora claramente deve haver algumas pessoas ou mais seria usá-los na indústria.

Mesmo se você estiver usando tipagem estática, as chances são de que não é o bastante expressivo para verificar tudo o que você gosta, então você precisa para testes de escrita também. Se tipagem estática poupa mais esforço do que ele requer em clichê é um debate que durou de idades e que eu não acho que tem uma resposta simples para todas as situações.

Quanto à sua segunda pergunta:

Como podemos re-fator de forma segura em um idioma digitado tempo de execução?

A resposta é testes. Os testes têm que cobrir todos os casos que importa. As ferramentas podem ajudá-lo a medir quão exaustivo seus testes são. ferramentas de verificação de cobertura que você saiba wether linhas de código são cobertos pelos testes ou não. ferramentas de mutação teste (bobo da corte, Heckle) podem deixar você saber se os testes são logicamente incompleta. testes de aceitação que você saiba o que você escreveu requisitos partidas e, finalmente, testes de regressão e desempenho garantir que cada nova versão do produto mantém a qualidade do passado.

Uma das grandes coisas sobre ter o teste apropriado no lugar vs contando com indireções tipo elaborados é que a depuração torna-se muito mais simples. Ao executar os testes que você começa afirmações específicas falhou em testes que expressam claramente o que estão fazendo, em vez de declarações de erro do compilador obtusos (pense erros c ++ modelo).

Não importa o que as ferramentas que você usa: escrever código que você está confiante em exigirá esforço. É mais provável que exigem escrevendo um monte de testes. Se a penalidade para erros é muito alta, como aeroespacial ou software de controle médica, você pode precisar usar métodos matemáticos formais para provar o comportamento do seu software, o que torna esse desenvolvimento extremamente caro.

Outras dicas

Eu concordo totalmente com o seu sentimento. A própria flexibilidade que as linguagens digitadas dinamicamente é suposto ser bom em é realmente o que torna o código muito difícil de manter. Realmente, existe tal coisa como um programa que continua a funcionar se os tipos de dados são alteradas de uma forma não trivial sem alterar o código?

Nesse meio tempo, você pode verificar o tipo de variável que está sendo passado, e de alguma forma falhar se não é o tipo esperado. Você ainda tem que executar o seu código para erradicar os casos, mas pelo menos algo diria a você.

Eu acho ferramentas internas do Google realmente fazer uma compilação e, provavelmente, verificação do tipo para sua Javascript. Eu gostaria de ter essas ferramentas.

Para começar, eu sou um programador nativa Perl assim por diante um lado eu nunca programado com o líquido de tipos estáticos. OTOH Eu nunca programado com eles, então eu não posso falar para os seus benefícios. O que posso falar é que seu gosto para refatorar.

Eu não encontrar a falta de tipos estáticos para ser um refactoring problema wrt. O que eu acho um problema é a falta de uma refatoração navegador . linguagens dinâmicas têm o problema que você realmente não sei o que o código é realmente vai fazer até que você realmente executá-lo. Perl tem isso mais do que a maioria. Perl tem o problema adicional de ter um muito complicado, quase não analisável, sintaxe. Resultado: há ferramentas de refatoração (embora eles estão trabalhando muito rapidamente no que ). O resultado final é que eu tenho que refatorar com a mão. E isso é o que apresenta erros.

Eu tenho testes para pegá-los ... normalmente. Eu encontro-me muitas vezes na frente de uma pilha fumegante de código testável testados e quase com o problema da galinha / ovo de ter que refatorar o código, a fim de testá-lo, mas ter de testá-lo, a fim de refazer-lo. Ick. Neste ponto eu tenho que escrever algum alto nível muito mudo, "faz a saída do programa a mesma coisa que antes" tipo de testes apenas para se certificar que eu não quebrar alguma coisa.

tipos estáticos, como previsto em Java ou C ++ ou C #, realmente só resolver uma pequena classe de problemas de programação. Eles garantem suas interfaces são bits de dados passada com o rótulo certo. Mas só porque você tem uma coleção não significa que Coleção contém os dados que você acha que ele faz. Porque você começa um inteiro não significa que você tem o inteiro direita. Seu método leva um objeto Usuário, mas é que o usuário logado?

Exemplo clássico: public static double sqrt(double a) é o assinatura para a função raiz quadrada Java . raiz quadrada não funciona em números negativos. Onde se diz que na assinatura? Isso não acontece. Pior ainda, onde ele diz que essa função mesmo faz? A assinatura só diz que tipos é preciso eo que ele retorna. Não diz nada sobre o que acontece no meio, e isso é onde vive o código interessantes. Algumas pessoas tentaram capturar a API completo usando projeto por contrato, que em geral, podem ser descritos como a incorporação de testes em tempo de execução de entradas da sua função, saídas e efeitos secundários (ou falta dela) ... mas isso é outra show.

Uma API é muito mais do que apenas assinaturas de função (se não fosse, você não precisa de todo esse prosa descritiva no Javadocs) e refatoração é muito mais ainda do que apenas mudando o API.

A maior vantagem refatoração um, compilado estaticamente linguagem de tipagem estática, não dinâmica lhe dá é a capacidade de escrever refatoração ferramentas para fazer refatorações bastante complexas para você, porque ele sabe onde todas as chamadas para os seus métodos são. Eu sou muito invejoso de IntelliJ IDEA .

Eu diria refatoração vai além do que o compilador pode verificar, mesmo em linguagens estaticamente tipadas. Refatoração é apenas mudando programas estrutura interna sem afetar o comportamento externo. Mesmo em linguagens dinâmicas, ainda existem coisas que você pode esperar para acontecer e teste, você acabou de perder um pouco de ajuda do compilador.

Um dos benefícios de usar var em C # 3.0 é que você pode mudam frequentemente o tipo sem quebrar qualquer código. As necessidades do tipo de ainda ter a mesma aparência - propriedades com os mesmos nomes deve existir, métodos com o mesmo ou similar assinatura ainda deve existir. Mas você pode realmente mudar para um tipo muito diferente, mesmo sem usar algo como ReSharper.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top