errada O que acontece com esse código? a criação de uma variável de exclusão em diferentes áreas

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

  •  05-07-2019
  •  | 
  •  

Pergunta

Eu vi recentemente um código semelhante ao descrito abaixo.

public void someMethod() {
  Lecture lect = createLecture();

  ...

  lect.getLectureSeries().delete();
}


public Lecture createLecture() {
  LectureSeries series = new Series();
  Lecture lect = new Lecture(series);

  ...

  return lect;
}

O ponto é que algum objeto (neste caso os LectureSeries) que precisa ser excluído no final da chamada para someMethod () é realmente criado na chamada para outro método. Estou tentando explicar por que deve ser criado no mesmo escopo ele acabará por ser eliminado. ie

public void someMethod() {
  LectureSeries series = new Series();
  Lecture lect = createLecture(series);

  ...

  series.delete();
}


public Lecture createLecture(LectureSeries series) {
  Lecture lect = new Lecture(series);

  ...

  return lect;
}

O código original tem causado alguma complicação arrumar as coisas quando as coisas falham por isso espero que os benefícios serão evidentes, mas alguém tem alguma idéia de como eu posso explicar o princípio mais geral por trás desta refatoração? ou alguém quer me explicar por que eu estou errado?

== Editar ==

O caso em questão era um método de teste para limpar qualquer coisa que tinha sido criado durante a execução do teste era importante. Eu acho que embora o efeito colateral indesejado de um LectureSeries sendo criado como resultado da chamada para createLecture () ainda é algo para tentar evitar na maioria dos casos.

Foi útil?

Solução

Não há nada de intrinsecamente errado com a criação de objeto em um método que vidas além do escopo do método.

Em linguagens de lixo coletado, a tiding-se cuida de si mesmo.

Em linguagens, onde o programador deve gerenciar a limpeza si, o programador deve compreender a posse do objeto que recebem do método e suas funções em relação a liberá-lo.

Outras dicas

Você pode usar o argumento de "Inversão de Controle". O objeto Palestra precisa de LectureSeries objeto e é melhor esse objeto a ser injetado em vez de criá-lo por si só.

A injeção de dependências em objetos é sempre uma boa prática. Específico para o seu caso, você também pode dizer que a criação e declarações exclusão deve ser o mais próximo possível. Isso certamente aumenta a legibilidade. No primeiro caso, eu vejo um item a ser excluído, mas não vejo onde o item é criado. Eu preciso de adivinhar que o item é criado no método de criação ou pesquisar todo o código para descobrir onde isso acontece. manipulação de erro (no caso da criação LectureSeries falha) também é mais fácil.

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