0

私はiTunes Uのオンラインコース「プログラミング方法論」を受講しています。このコースには、Javaベースの「ロボットのカレル」が導入されていて、疑問が生じました。たとえば、次のコードを使用します。

import stanford.karel.*;

public class MidpointFindingKarel extends SuperKarel {

    // You fill in this part
    public void run(){
        fillBeepers();
        turnAround();
        move();
        checkWestEdge();


    }
    private void fillBeepers(){
        move();
        while(frontIsClear()){
            putBeeper();
            move();
        }
    }
    private void checkEastEdge(){
        while(beepersPresent()){
            move();
        }
            if(noBeepersPresent()){
                turnAround();
                move();
                if(beepersPresent()){
                    pickBeeper();
                    move();
                    checkWestEdge();
                }
                else putBeeper();
            }
    }
    private void checkWestEdge(){
        while(beepersPresent()){
            move();
        }
            if(noBeepersPresent()){
                turnAround();
                move();
                if(beepersPresent())
                {
                    pickBeeper();
                    move();
                    checkEastEdge();
                }
                else putBeeper();
            }
    }
}

このコードのアイデアは、画面の端に加えて「ビープ音」を配置し、ビープ音の端を取ることによって画面の中央を見つけることです。私が行ったことは、各「エッジを見つける」関数を作成して、他の関数を呼び出して他のエッジを見つけることです。それは最終的に中央に到達し、左右のビーパーをチェックし、何もないことを確認し、中央に 1 つ配置します。

ここで質問したいと思います: 私は関数 (またはメソッド? どのように呼び出すか) を頻繁にネストする傾向があります。それはプログラマーとしての悪い習慣であり、より大規模で複雑なプロジェクトでは、私に逆戻りするのでしょうか? コードの可読性が低下しますか? もしそうなら、誰でもこれらの関数を呼び出す方法を解決できますか?

4

1 に答える 1

2

他のメソッドからメソッドを呼び出すことは、許容される慣行であるだけでなく、非常に重要なことでもあります。(コードを再利用することをお勧めします)。ただし、コードでは、チェック ウェストとチェック イーストがほとんど重複しています。私はそれをこのように構成します

private void checkEdge(String orientation){
    while(beepersPresent()){
        move();
    }
        if(noBeepersPresent()){
            turnAround();
            move();
            if(beepersPresent()){
                pickBeeper();
                move();
                orientation = orientation.equals("west") ? "east" : "west";
                checkEdge(orientation);
            else putBeeper();
        }
}

そうすれば、エッジをチェックし、西と東をチェックできる1つの方法があります

于 2015-06-18T06:29:08.743 に答える