降低方法的复杂性

时间:2011-05-29 17:16:36

标签: java algorithm

我有一个方法可以执行多项任务。它是应用程序业务逻辑的一部分,但由于许多if-thentry-catch块以及许多log调用,它的可读性很差。

public class MyClass {     

boolean createReport, sendReport, warnIfErrors;

public void archiveAll() {

    if (createReport) {
      //... ...
    }

    if (sendReport) {
      //... ...
    }

    if (warnIfErrors) {
      //... ...
    }

} 

我们的想法是将任务转移到临时方法中,并拥有一个可以一目了然的“archiveAll”方法:

public void archiveAll() {

    doCreateReport();

    doSendReport();

    doWarnIfErrors();

} 

但是这样做会产生两个问题:

  1. 如果所有方法都使用局部变量,我会将其作为类字段移动,但这不是好设计
  2. 我也希望将测试if (createReport)移到方法doCreateReport中,因为部分复杂性来自于已完成的测试。这使得子方法的内聚性很差。

3 个答案:

答案 0 :(得分:7)

如果您拥有很多的局部变量,那么将私有类存储在一起可能是有意义的,甚至可能会这样做:

MyReport report = new MyReport(); // or MyReport.doCreateReport(); if it makes more sense
report.send();
report.warnIfErrors();

同样,这实际上取决于该功能目前是否足以保证这样的功能。

如果您只是将这些常见变量作为参数传递而不需要大量参数列表,那么就这样做。

答案 1 :(得分:2)

  1. 您还可以将所需数据作为参数传递给方法。
  2. 我会在调用方法之前进行检查。如果一个方法被称为doCreateReport,它实际上应该执行那个。

答案 2 :(得分:1)

  1. 不是创建变量类字段,而是仅参数化函数并传递值。这有另一个很大的优势,您的代码现在将变得更加可单元测试。我总是鼓励让每种方法尽可能独立,因为它有助于UT。
  2. 如果您将名称更改为checkAndCreateReport,那么您仍然会这样想:)