¿Qué hay de malo con este código? creando una variable de borrado en diferentes ámbitos

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

  •  05-07-2019
  •  | 
  •  

Pregunta

Recientemente he visto un código similar al que se describe a continuación.

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

  ...

  lect.getLectureSeries().delete();
}


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

  ...

  return lect;
}

El punto es que algún objeto (en este caso el LectureSeries) que debe eliminarse al final de la llamada a algún Método () se crea realmente en la llamada a otro método. Estoy tratando de explicar por qué se debe crear en el mismo ámbito que eventualmente se eliminará. es decir,

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;
}

El código original ha causado algunas complicaciones al ordenar las cosas cuando las cosas fallan, así que espero que los beneficios sean evidentes, pero ¿alguien tiene alguna idea sobre cómo puedo explicar el principio más general detrás de esta refactorización? ¿O alguien quiere explicarme por qué me equivoco?

== Editar ==

El caso en cuestión era un método de prueba, por lo que era importante limpiar todo lo que se había creado durante la ejecución de la prueba. Sin embargo, creo que el efecto secundario no deseado de una LectureSeries creada como resultado de la llamada a createLecture () sigue siendo algo que se debe intentar y evitar en la mayoría de los casos.

¿Fue útil?

Solución

No hay nada intrínsecamente incorrecto en la creación de un objeto en un método que vive más allá del alcance del método.

En los idiomas recolectados en la basura, el ordenamiento se cuida solo.

En los idiomas donde el programador debe administrar la limpieza por sí mismos, el programador debe comprender la propiedad del objeto que recibe del método y sus obligaciones con respecto a su liberación.

Otros consejos

Puedes usar el argumento de " Inversión de control " ;. El objeto Lecture necesita un objeto LectureSeries y es mejor que este objeto se inyecte en él en lugar de crearlo solo.

La inyección de dependencias en objetos siempre es una buena práctica. Específicamente para su caso, también puede decir que la creación y eliminación de sentencias debe ser lo más cercana posible. Esto ciertamente aumenta la legibilidad. En el primer caso, veo un elemento que se elimina, pero no veo dónde se crea el elemento. Necesito adivinar que el elemento se crea en el método de creación o buscar todo el código para encontrar dónde ocurre esto. El manejo de errores (en caso de que falle la creación de LectureSeries) también es más fácil.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top