我最近看到了一些类似于下面概述的代码。
public void someMethod() {
Lecture lect = createLecture();
...
lect.getLectureSeries().delete();
}
public Lecture createLecture() {
LectureSeries series = new Series();
Lecture lect = new Lecture(series);
...
return lect;
}
关键是在调用someMethod()时需要删除的某个对象(在本例中为LectureSeries)实际上是在调用另一个方法时创建的。我试图解释为什么它应该在最终被删除的相同范围内创建。即
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;
}
原始代码在事情失败时引起了一些复杂的整理,所以希望好处是显而易见的,但是有没有人对我如何解释这个重构背后的更一般原则有任何想法?或者有人想向我解释为什么我错了?
==编辑==
有问题的案例是一种测试方法,因此清理在执行测试期间创建的任何内容都非常重要。我认为,由于调用createLecture()而创建的LectureSeries的不良副作用仍然是在大多数情况下尝试避免的。
答案 0 :(得分:2)
在超出方法范围的方法中创建对象没有任何内在错误。
在垃圾收集语言中,整理可以自行解决。
在程序员必须自己管理清理的语言中,程序员必须了解他们从方法中获得的对象的所有权以及他们有关释放它的职责。
答案 1 :(得分:0)
您可以使用“控制反转”的参数。 Lecture对象需要一个LectureSeries对象,最好将这个对象注入其中,而不是单独创建它。
将依赖项注入对象始终是一种很好的做法。根据您的情况,您还可以说创建和删除语句应尽可能接近。这无疑增加了可读性。在第一种情况下,我看到一个项目被删除,但我看不到项目的创建位置。我需要猜测该项是在创建方法中创建的,还是搜索整个代码以查找发生这种情况的位置。错误处理(如果LectureSeries创建失败)也更容易。