이 코드에 무슨 문제가 있습니까? 다른 스코프에서 삭제 변수를 만듭니다

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

  •  05-07-2019
  •  | 
  •  

문제

최근에 아래에 설명 된 코드와 비슷한 코드를 보았습니다.

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

  ...

  lect.getLectureSeries().delete();
}


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

  ...

  return lect;
}

요점은 SOMEMETHOD () 호출 끝에 삭제 해야하는 일부 객체 (이 경우 강사)이 실제로 다른 방법으로 호출에서 생성된다는 것입니다. 나는 그것이 왜 동일한 범위로 생성되어야하는지 설명하려고 노력하고 있습니다. 결국 삭제됩니다. 즉

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

원래 코드는 사물이 실패했을 때 소모적 인 정리를 일으켰으므로 혜택이 분명 할 것이지만,이 리팩토링의보다 일반적인 원칙을 설명 할 수있는 방법에 대한 아이디어가 있습니까? 아니면 내가 왜 내가 틀렸는지 설명하고 싶은 사람이 있습니까?

== edit ==

문제의 사례는 테스트 방법이므로 테스트 실행 중에 생성 된 모든 것을 청소하는 것이 중요했습니다. 나는 CreateLecture ()에 대한 호출의 결과로 강사의 원치 않는 부작용이 대부분의 경우에도 여전히 시도하고 피해야한다고 생각합니다.

도움이 되었습니까?

해결책

메소드의 범위를 넘어서 사는 메소드에서 객체를 만드는 데 본질적으로 잘못된 것은 없습니다.

쓰레기 수집 된 언어에서, 소진은 그 자체를 돌 봅니다.

프로그래머가 정리를 스스로 관리 해야하는 언어에서 프로그래머는 방법으로부터받는 객체의 소유권과 해제에 관한 의무를 이해해야합니다.

다른 팁

"제어의 역전"이라는 주장을 사용할 수 있습니다. 강의 대상은 강등 세저 객체가 필요하며 자체적으로 만들기보다는이 개체를 주입하는 것이 좋습니다.

객체에 종속성을 주입하는 것은 항상 좋은 관행입니다. 귀하의 경우에 따라 제작 및 삭제 명세서가 가능한 한 가깝기 때문에 말할 수 있습니다. 이것은 확실히 가독성을 증가시킵니다. 첫 번째 경우에는 항목이 삭제되는 것을 볼 수 있지만 항목이 생성되는 위치는 없습니다. 항목이 생성 메소드에서 생성되거나 전체 코드를 검색하여 이런 일이 발생하는 위치를 찾아야한다고 추측해야합니다. 오류 처리 (강등 창출이 실패한 경우)도 더 쉽습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top