1

シンプルで保守しやすい構造でコードを整理しながら、Java の実行順序を制御する方法を教えてもらえますか?

Javaでかなり複雑なアルゴリズムをプログラミングしています。1 つのメソッドは数百行の長さになり、アルゴリズムを微調整するためにコードの重要な部分を分離するのは非常に手間がかかりました。コードを単純化するために、1 つの変数に解決できるコードの各セクションを特定し、それらの各セクションを独自のメソッドに移動しました。これらのメソッドは、以前は複雑だったメソッドから呼び出されます。コードが読みやすくなり、保守がはるかに簡単になるため、これは良いことです。

問題は、以前のメソッドの一部が値を返す前に、呼び出し元のメソッドが後続のコードを実行し続けていることを示すエラーが発生していることです。

コードの例を次に示します。

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

表示されるエラー メッセージは、まだ実行中であることを示す結果を Eclipse コンソールでgetFourth(numb)取得しているときに同時に起こっていることと関係があります。、、、、および内のすべてのコンテンツを持っていた頃は、コード ブロックが順不同で実行されているという同じ証拠は得られませんでした。(これらはサブメソッドではなかったため、コードはすべて 1 つの長いブロックにまとめられていました。) しかし、コードは読みにくかったです。コードを読みやすくするために、次のメソッドに進む前に各メソッドを完全に返す必要があるように、上記を変更するにはどうすればよいですか?System.out.println()getFirst(numb)getFirst(numb)getSecond(numb)getThird(numb)getAnAside(first,second,third)getFourth(numb)myMethod(numb)myMethod(numb)

4

3 に答える 3

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 が言及しているように、1 つのスレッドしか使用していない場合は、おそらくログに問題があります。

于 2013-04-23T20:48:23.527 に答える
1

これは少し当て推量ですが、標準出力出力を間違った順序で表示する IDE を知っています。適切な端末から Java を実行するか、ログをディスクに書き込むことにより、最初にこれを排除することをお勧めします (可能性は低くても)。

于 2013-04-23T23:05:09.083 に答える
1

私は通常、プログラムの構造に関して、アルゴリズムは人々が考えているほど複雑ではないことに気づきます。あなたがしなければならないのは、それを話し、あなたが行くように書くことだけです. 冷蔵庫に牛乳が必要なので、店に牛乳を取りに行くアルゴリズムが必要だとします。

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

次に、完全なプログラムが完成するまで、ネストされた各メソッドをチャンクに分割することができます。

実行の順序に関する限り、スレッドが 1 つの場合、競合状態になることはありません。複数のスレッドを使用している場合は、共有リソースとランデブー ポイントを同期する必要があります。

于 2013-04-23T20:51:10.457 に答える