Detecção automática do compilador da adição da mesma instância de objeto a um contêiner em um loop

StackOverflow https://stackoverflow.com/questions/1465486

Pergunta

Este é um erro idiota:

List<Foo> fooList = new List<Foo>();
Foo f = new Foo();
while (something.Read()) {
    f.Fill(something.GetRecord());
    fooList.Add(f);
}

Claro, eu deveria instanciar um novo Foo dentro do loop.

Um compilador pode detectar esse tipo de erro na hora da compilação?

Para os olhos ingênuos, parece que deve ser capaz de detectar esse comportamento (preenchendo uma lista com instâncias do mesmo objeto em um loop). Em seguida, deve emitir um aviso como "Você está preenchendo um contêiner com a mesma instância mais de uma vez".

Então, como eu sou ingênuo? Você conhece um idioma em que algo assim existe?

Foi útil?

Solução

Sim, isso é possível.

No entanto, não acho que uma ferramenta ou compilador alertasse sobre isso, então você precisaria usar uma ferramenta que possa ser estendida com suas próprias análises. Para Java, FindBugs é uma ferramenta assim. Para C, C ++, etc, GCC 4.5 permitirá plugins para as pessoas escreverem suas próprias extensões e Clang da LLVM também foi projetado para isso. Há também Dehydra De Mozilla, novamente para C ++. Para os idiomas da MS, existe o Framework de Phoenix.

Então, a questão é: como você escreve esta análise? Isso é um pouco mais complicado e depende da ferramenta. Mas basicamente:

  • Você pode detectar loops com bastante facilidade (procure "componentes fortemente conectados"),
  • A análise de alias pode dizer se uma variável ou parâmetro específico se refere a apenas um objeto, ou muitos objetos (procure "objetos abstratos", talvez),
  • Você pode encontrar o contêiner certo usando o tipo estático de um objeto ou variável.

Então você poderia facilmente detectar uma chamada para List<>.append(x) em um loop, onde x pode se referir a apenas um objeto.

Outras dicas

E se você quiser preencher uma lista <> com várias instâncias de um objeto? Você precisaria decorar seu código com #pragma Então o compilador deixa você sozinha?

Como você declararia uma classe para ter esse tipo de restrição? Lista <> é realmente nada mais do que uma classe C#, você pode descompilar o mscorlib.dll e ver sua implementação completa. Então, para ter esse tipo de conhecimento, teria que ser codificado em algum lugar. Atributos? Isso seria incrivelmente restritivo. Métodos especiais para validar seu código? Adicionaria uma sobrecarga aos seus objetos.

Esse tipo de coisa nunca é (e eu quero dizer nunca) usado por um motivo: o número extremamente pequeno de casos em que ajudaria, em vez de impedir que não chegue nem perto de superar o custo muito real que exigiria em ambas as dificuldades de implementação (do Framework em si e do seu código) e os acertos de desempenho (de objetos excessivos que precisam ser movidos pela memória, conforme o GC faz o que você faz).

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