我正在参加iTunes U上提供的在线课程"编程方法"。该课程介绍了基于Java的"机器人Karel",它向我提出了一个问题。以这段代码为例:
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();
}
}
}
这段代码的想法是通过在边缘旁边放置"蜂鸣器"来找到屏幕的中间,然后取蜂鸣器的边缘。我所做的是让每个"查找边缘"函数调用另一个函数来查找另一个边缘。它最终到达一个点,它在中间,它检查左右的蜂鸣器,看到没有,并在中间放置一个。
现在我想问:我倾向于嵌套函数(或方法?你怎么称呼他们)经常。作为一个程序员,这是一个坏习惯,在更大更复杂的项目中,它会回到我身上吗?它会降低我的代码的可读性吗?如果是这样,任何人都可以提供如何调用这些功能的解决方案吗?
其他方法调用方法不仅是可接受的做法,也是可以接受的做法。(重用代码是一种很好的做法)。 但是,在您的代码中,"检查西部"和"检查东部"大多是重复的。 我会这样构建它
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();
}
}
这样你就有了一种方法来检查边缘,并且能够检查西部和东部