【问题标题】:structuring complicated java methods构造复杂的java方法
【发布时间】:2013-04-17 05:24:38
【问题描述】:

谁能告诉我如何控制 java 的执行顺序,同时仍以简化、易于维护的结构组织代码?

我正在用 java 编写一个相当复杂的算法。一种方法长达数百行,以至于为了微调算法而隔离代码的关键部分变得过于劳动密集。为了简化代码,我确定了可以解析为单个变量的代码的每个部分,并将这些部分中的每个部分移到它们自己的方法中,然后从以前复杂的方法中调用这些方法。这很好,因为它使代码可读,并且更容易维护。

问题是现在我收到一些错误,表明调用方法在一些早期方法返回它们的值之前继续执行后续代码。

下面是代码示例:

void myMethod(Double numb){  
    double first = new getFirst(numb);  
    double second = new getSecond(numb);  
    double third = new getThird(numb);  
    double anAside = new getAnAside(first, second, third);  
    double fourth = new getFourth(numb);  
}

出现的错误消息与getFourth(numb) 中发生的事情有关,同时我得到System.out.println() 导致Eclipse 控制台表明getFirst(numb) 仍在运行。当我在myMethod(numb) 中拥有getFirst(numb)getSecond(numb)getThird(numb)getAnAside(first,second,third)getFourth(numb) 的所有内容时,我没有得到相同的证据表明代码块出现故障。 (因为它们没有子方法,所以代码都在一个长块中。)但是,代码很难阅读。如何对上面的myMethod(numb) 进行更改,以便在继续下一个方法之前必须完全返回每个方法,这样我仍然可以拥有易于阅读的代码?

【问题讨论】:

  • "表示调用方法在一些较早的方法返回它们的值之前继续执行后续代码" 假设您有一个线程运行此代码,这是不可能的。您的日志记录可能有问题,或者您可能同时调用了 getFourth 和 getFirst` 使用的方法,但在日志中仅标识为 fourth
  • 这有点猜测,但我知道 IDE 会以错误的顺序显示 stdout 输出。我建议您首先消除这种情况(即使不太可能),方法是从适当的终端运行 Java 或将日志写入磁盘。
  • 你为什么关心他们的运行顺序?
  • 您可能需要修饰符volatile?如果你有并行方法访问变量,这些变量往往会不断变化,并且编译器试图优化,它可能会抛出错误,(我认为)。
  • "如果看起来复杂,那就复杂了。如果复杂,那就错了。"

标签: java eclipse performance algorithm architecture


【解决方案1】:

尝试在每个方法之间刷新 System.out,如下所示:

void myMethod(Double numb)
{  
    double first = new getFirst(numb);
    System.out.flush();
    double second = new getSecond(numb);
    System.out.flush();
    double third = new getThird(numb);
    System.out.flush();
    double anAside = new getAnAside(first, second, third);
    System.out.flush();
    double fourth = new getFourth(numb);  
}

正如 Matt B 提到的,如果您只使用一个线程,那么您的日志记录可能有问题。

【讨论】:

    【解决方案2】:

    我通常发现,就程序结构而言,算法从来没有人们想象的那么复杂。你所要做的就是说出来,边写边写。假设我的冰箱需要牛奶,所以我需要一个算法去商店里取牛奶:

    public Milk goGetMilk(){
        getMoney();
        getCarKey();
        driveToStore();
        findMilk();
        buyMilk();
        driveBack();
        putMilkInFridge();
    }
    

    然后每个嵌套方法可以依次分解成块,直到我有一个完整的程序。

    就执行顺序而言,如果您只有一个线程:就不可能有竞速条件。如果使用多线程,则需要同步共享资源和集合点。

    【讨论】:

      【解决方案3】:

      这有点猜测,但我知道 IDE 会以错误的顺序显示 stdout 输出。我建议您首先消除这种情况(即使不太可能),方法是从适当的终端运行 Java 或将日志写入磁盘。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-04
        相关资源
        最近更新 更多