代码之家  ›  专栏  ›  技术社区  ›  Robin

这个代码怎么了?在不同范围中创建删除变量

  •  0
  • Robin  · 技术社区  · 15 年前

    我最近看到了一些类似于下面概述的代码。

    public void someMethod() {
      Lecture lect = createLecture();
    
      ...
    
      lect.getLectureSeries().delete();
    }
    
    
    public Lecture createLecture() {
      LectureSeries series = new Series();
      Lecture lect = new Lecture(series);
    
      ...
    
      return lect;
    }
    

    要点是,在调用some method()结束时需要删除的某个对象(在本例中是讲师)实际上是在调用另一个方法时创建的。我试图解释为什么要在同一范围内创建它,它最终会被删除。工业工程

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

    当事情失败时,原始代码会导致一些复杂的整理工作,所以希望好处是显而易见的,但是对于如何解释重构背后更一般的原则,有人有什么想法吗?或者有人想向我解释为什么我错了?

    =编辑=

    所讨论的案例是一种测试方法,因此清理在测试执行期间创建的任何内容非常重要。我认为,尽管在大多数情况下,由于调用createstraise()而创建的讲师所产生的不必要的副作用仍然是需要尝试和避免的。

    2 回复  |  直到 15 年前
        1
  •  2
  •   Will    15 年前

    在一个方法中创建对象并没有什么本质上的错误,而这个方法的范围超出了该方法的范围。

    在垃圾收集的语言中,整理工作会自行处理。

    在程序员必须自己管理清理的语言中,程序员必须理解他们从方法接收到的对象的所有权,以及他们释放该对象的职责。

        2
  •  0
  •   kgiannakakis    15 年前

    你可以使用“控制反转”的论点。演讲对象需要一个演讲对象,最好将这个对象注入其中,而不是自己创建它。

    将依赖项注入对象始终是一个好的实践。具体到您的情况,您也可以说,创建和删除语句应该尽可能接近。这当然增加了可读性。在第一种情况下,我看到一个项目被删除,但我看不到该项目的创建位置。我需要猜测该项是在创建方法中创建的,或者搜索整个代码以查找发生这种情况的位置。错误处理(如果讲师创建失败)也更容易。