Cosa c'è di sbagliato in questo codice? creando una variabile di cancellazione in diversi ambiti

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

  •  05-07-2019
  •  | 
  •  

Domanda

Di recente ho visto alcuni codici simili a quelli descritti di seguito.

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

  ...

  lect.getLectureSeries().delete();
}


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

  ...

  return lect;
}

Il punto è che alcuni oggetti (in questo caso LectureSeries) che devono essere eliminati alla fine della chiamata a someMethod () vengono effettivamente creati nella chiamata a un altro metodo. Sto cercando di spiegare perché dovrebbe essere creato nello stesso ambito che alla fine verrà eliminato. vale a dire

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

Il codice originale ha causato qualche complicazione nel riordinare le cose quando le cose falliscono, quindi speriamo che i benefici siano evidenti, ma qualcuno ha qualche idea su come posso spiegare il principio più generale dietro questo refactoring? o qualcuno vuole spiegarmi perché mi sbaglio?

== Modifica ==

Il caso in questione era un metodo di prova, quindi era importante ripulire tutto ciò che era stato creato durante l'esecuzione del test. Penso che l'effetto collaterale indesiderato della creazione di una LectureSeries a seguito della chiamata a createLecture () sia ancora qualcosa da provare ed evitare nella maggior parte dei casi.

È stato utile?

Soluzione

Non c'è nulla di intrinsecamente sbagliato nella creazione di oggetti in un metodo che vada oltre l'ambito del metodo.

Nelle lingue raccolte nella spazzatura, il riordino si prende cura di se stesso.

Nelle lingue in cui il programmatore deve gestire da solo la pulizia, il programmatore deve comprendere la proprietà dell'oggetto che riceve dal metodo e i suoi doveri in merito al rilascio.

Altri suggerimenti

Puoi utilizzare l'argomento di " Inversion Of Control " ;. L'oggetto Lecture ha bisogno di un oggetto LectureSeries ed è meglio che questo oggetto venga iniettato in esso piuttosto che crearlo da solo.

L'iniezione di dipendenze negli oggetti è sempre una buona pratica. Specifico per il tuo caso, puoi anche dire che le istruzioni di creazione ed eliminazione dovrebbero essere il più vicino possibile. Questo certamente aumenta la leggibilità. Nel primo caso vedo un elemento che viene eliminato, ma non vedo dove viene creato l'elemento. Devo indovinare che l'elemento viene creato nel metodo di creazione o cercare l'intero codice per trovare dove questo accade. Anche la gestione degli errori (nel caso in cui la creazione di LectureSeries fallisca) è anche più semplice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top