ti-enxame.com

Quais recursos de linguagem são considerados prejudiciais?

Por favor, explique o porquê e liste quais idiomas têm o (des) recurso implementado até onde você sabe.

Publique o que você considera um recurso prejudicial, não o que você não gosta.

20
Maniero

Permitir Nulo por padrão, o erro de "trilhões" * de dólares. Desculpe, Tony Hoare. Quase todos os idiomas disponíveis no planeta.

explica Tony Hoare

* Eu ajustei a expressão cunhada por Tony Hoare para refletir a perda real nestes dias :-)

22
Maniero

Registre Globals em PHP

Informações: http://php.net/manual/en/security.globals.php

Este é de longe o pior recurso a ser implementado por motivos de legibilidade e segurança. Basicamente, todos os parâmetros GET recebidos são transformados em variáveis.

Por exemplo, com este URL: /index.php?value=foobar

Você pode fazer o seguinte:

<?php
echo $value; // return foobar
?>

Quando você está lendo código, é muito confuso saber de onde vem a variável.

Além disso, se o recurso for mal utilizado, pode levar a uma falha de segurança. Aqui está um exemplo de código de php.net que mostra como ele pode ser mal utilizado:

<?php
// define $authorized = true only if user is authenticated
if (authenticated_user()) {
    $authorized = true;
}

// Because we didn't first initialize $authorized as false, this might be
// defined through register_globals, like from GET auth.php?authorized=1
// So, anyone can be seen as authenticated!
if ($authorized) {
    include "/highly/sensitive/data.php";
}
?>
37
HoLyVieR

Fallthrough por padrão em instruções switch C e C++.

14
Niall C.

Conversões de tipo implícitas quando os tipos sendo convertidos não têm relação óbvia. Por exemplo, converter um string aleatório e não numérico em um int, como no PHP.

13
Chinmay Kanchi

goto : embora ok em casos raros, é mais frequentemente mal utilizado e leva a programas difíceis de ler.

12
Brian R. Bondy

NONE

Só porque um recurso é mal utilizado com frequência não o torna prejudicial.

IMHO, todo o "é considerado prejudicial" é o Reductio ad Hitlerum das discussões de linguagem de programação.

A maioria, senão todos, os recursos "prejudiciais" têm, ou tiveram originalmente, um caso de uso muito válido ou são simplesmente métodos de conveniência em primeiro lugar. É responsabilidade dos desenvolvedores entender os prós e contras e o código de acordo.

Se suas perguntas fossem algo como "quais características de linguagem têm armadilhas comuns ou efeitos colaterais infelizes", minha resposta seria diferente.

[editar] Para ficar claro: não me refiro ao uso contínuo de métodos obsoletos. Se os desenvolvedores estão depreciando/removendo um recurso, você deve usar a substituição. Estou me referindo ao conceito de que uma parte atual da linguagem é considerada prejudicial porque alguns não gostam do que ela incentiva ou da compensação envolvida em usá-la que muitas pessoas discutem.

11
Bill

Embora algumas pessoas discordem do homem ou de várias coisas que ele diz, muito do de Douglas Crockford JavaScript: The Good Parts é basicamente essa questão aplicada a JS. Entre as reclamações de Crockford:

  • Escopo global por padrão para tudo (DC mostra como usar função/objetos como namespaces e delimitadores de escopo para resolver isso.)

  • Declarações como with, cujo comportamento de falha é definir coisas no namespace global. (Gah! É como o lema JS: se você falhar, então falhe o máximo possível!)

  • Comportamento inesperado com o == operador, que basicamente requer que você sempre use o operador === operador.

  • Inserção de ponto e vírgula.

Na verdade, muito JS deveria ser considerado prejudicial, talvez até mesmo a linguagem inteira, mas as partes boas são tão boas que meio que compensam (pelo menos para mim).

7
CodexArcanum

Autovivificação (ou outro recurso bind-variable-on- (assign | use)) é o recurso que descobri que me dá a maioria dos bugs.

7
Paul Nathan

PLEASE em INTERCAL. Não use o suficiente, ele reclama. Use demais, reclama.

7
Alan Pearce

Em C/C++: Essas atribuições também são expressões COMBINADAS COM os operadores de atribuição = e de comparação == muito semelhantes. Não é um recurso prejudicial em si, mas é uma maneira fácil de introduzir bugs (às vezes sutis) por meio de um erro de digitação acidental do operador.

int i = 10;

someCode();

if(i = 5)
{
    /* We don't want this block to be executed, but it is */
    moreCode();
}
6
Sebastian Negraszus

"Falha silenciosa" no Flash Player como comportamento padrão

Ok, não é realmente uma característica da linguagem em si, mas ainda está intimamente relacionada.

De repente, seu aplicativo Flash/Flex para de funcionar e ninguém pode dar a menor dica do que diabos aconteceu. Nenhuma mensagem de erro, nenhum rastreamento de pilha, nada. Só que de repente a transição de tela não acontece (ou acontece de uma maneira completamente errada), ou os botões não reagem mais aos cliques, ou as caixas de combinação estão vazias em vez de serem preenchidas com algumas entradas.

Esse "recurso" sozinho é responsável por vários relatórios de encolher de ombros e um monte de cabelos grisalhos que tenho recebido. -.- Embora aparecer alguma mensagem enigmática na cara do usuário também não seja desejável, pode pelo menos ajudar o desenvolvedor a consertar o problema.

Mas o Flash Player deixa você perambulando no escuro, dependendo da descrição do usuário (embora o problema possa realmente se originar de um local completamente diferente no código que não tem nada a ver com o que o usuário estava fazendo). Somente se você usar o Debug Player você realmente obterá a janela pop-up com uma mensagem de erro e um rastreamento de pilha.

No entanto, pode ser bastante interessante assistir a filmes embutidos em flash em certos sites de notícias e receber mensagens repetidas sobre referências nulas do SWF do player embutido usado. : D

6
Baelnorn

Substituindo variáveis ​​indefinidas por uma string vazia no Shell sem nenhum aviso: rm -rf $nosuchvar/*.

5
duros

Modificadores de acesso em Java com o padrão da linguagem privada do pacote e padrão da convenção de programação privada.

5
Hoa Long Tam

Variáveis ​​variáveis em PHP

Só porque você $can não significa que você $$should

4
Kendall Hopkins

A capacidade de girar no sentido anti-horário no LOGO. Wtf, vamos girar no sentido horário 360 - x graus.

4
jjnguy

Interrompendo o Tópico de um outro Tópico

Em Java e em outra linguagem, você poderia interromper um tópico de outro arbitrariamente sem dar o tempo para o tópico interrompido terminar de forma adequada. Esta capacidade foi obsoleta considerando a enorme quantidade de problemas que isso poderia trazer em quase todas as situações.

4
HoLyVieR

Matrizes em AWK começando no índice 1!

3
Oliver Weiler

A instrução With em Delphi vem à mente, embora haja casos em que é útil.

3
Remko

Sintaxe de importação relativa do Python 2.x. Suponha que eu tenha um pacote x.plugins que adiciona suporte para várias outras bibliotecas para x. E suponha que eu tenha um módulo sqlalchemy em x.plugins para que eu possa adicionar suporte sqlalchemy a x. O que você acha que acontecerá se eu adicionar a seguinte linha ao sqlalchemy.py?

import sqlalchemy

A resposta é que o módulo tentará importar a si mesmo. O que essa sintaxe faz é essencialmente tornar impossível importar o pacote sqlalchemy global real. Python 2.5 adicionou uma maneira de especificar que esta é uma importação relativa:

from . import sqlalchemy

... mas não é até Python 3 que a primeira sintaxe foi realmente eliminada (embora possa ser desativada em Python 2.6+ com from __future__ import absolute_import).

2
Jason Baker

Em Perl, contexto escalar vs. contexto de lista pode ser complicado. Tem alguns pontos positivos que tornam certas operações convenientes, mas ocasionalmente você se depara com algo terrível, como mudar completamente o significado de um operador (potencialmente de um significativo distância no código).

sub foo { (1..5) }
my @list = foo();           # (1,2,3,4,5)
my $length = scalar @list;  # 5. the length of the list.
my $length2 = scalar foo(); # '' (the empty string. because it's false)

Isso não está certo.

(Surge de tentar fazer algo que atue como o operador de intervalo regular, então você pode dizer algo em um loop como next if /start_regex/ .. /end_regex/).

2
user2348

Sun.misc.unsafe é o meu favorito de todos os tempos; a coleção de "precisávamos disso para implementar as coisas, mas realmente não acho que você deveria usá-lo."

1
Dean J

FORTRAN blocos comuns. Se você cometer um erro simples, uma parte de um aplicativo pode destruir os globais de outra parte.

Instrução goto atribuída a FORTRAN/instrução alter COBOL. Código de auto-modificação. Perigo, aviso, monstros espaguete voadores !!

1
Stephen C

magic_quotes Em PHP .

Os desenvolvedores inexperientes contam com ele sendo habilitado e, portanto, assumem que todas as entradas do usuário têm escape para uso em uma consulta SQL ou contam com a desativação e, portanto, sempre escapam de suas entradas.

Ao assumir que está habilitado e, em seguida, executar o código em um sistema onde não está, ele abre grandes buracos de injeção SQL.

Ao assumir que está desativado e não está, resultará em barras invertidas sendo realmente armazenadas no banco de dados, causando strings feias/incorretas.

Também não há uma maneira extremamente simples de lidar com os dois casos - você precisa verificar se está habilitado usando get_magic_quotes_gpc() e, em seguida, aplicar stripslashes() em todos os valores nas matrizes $_* - uma vez que array_map não é recursivo, você precisa de uma função personalizada para isso.

1
ThiefMaster

Orientação a objetos (de todas as linguagens tipadas estaticamente). Aposto que esse recurso custou e continuará a custar muito mais do que ponteiros nulos. A Orientação a Objetos só é boa em uma linguagem dinâmica passagem de mensagens. Portanto, deve ser eliminado de linguagens dinâmicas como Python também (uma vez que não usa passagem de mensagem, mas chamada de subrotina convencional).

1
Yttrill