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

这段代码的想法是通过在边缘之外放置“蜂鸣器”来找到屏幕的中间,然后获取蜂鸣器的边缘。我所做的是让每个“寻找边缘”函数调用另一个函数来找到另一个边缘。它最终到达一个点,它位于中间,它检查左右两侧的蜂鸣器,发现没有蜂鸣器,然后将一个放在中间。

现在我想问:我经常嵌套函数(或方法?你怎么称呼它们)。作为程序员,这是一个坏习惯吗?在更大、更复杂的项目中,它会反击我吗?它会降低我的代码的可读性吗?如果是这样,任何人都可以提供如何调用这些函数的解决方案吗?

4

1 回答 1

2

从其他方法调用方法不仅是可以接受的做法,它也是上帝的一种做法。(重用代码是一种很好的做法)。但是,在您的代码中,check west 和 check east 大多是重复的。我会像这样构造它

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

这样你就有了一种检查边缘的方法,并且能够检查西部和东部

于 2015-06-18T06:29:08.743 回答