所以我编写了一个Java程序,其函数handInExam()
可能连续两次调用,因此该程序对历史非常敏感。然后出现的问题是我需要一个变量canHandInExam
来检查是否已经调用了这个方法并在每个方法中更新了这个变量,这导致了很差的可维护性。以下是显示问题的代码段。
public class NotAllowedException extends Exception {
public NotAllowedException(String message) {
super(message);
}
}
import java.util.Scanner;
public class Exam {
String[] exam;
String[] answers;
boolean canHandInExam;
public Exam(String[] questions) {
exam = questions;
answers = new String[exam.length];
canHandInExam = false;
}
// This method may only be called once in a row
public void handInExam throws NotAllowedException() {
if (canHandInExam) {
// Send exam to teacher
canHandInExam = false;
} else {
throw new NotAllowedException("You may not hand in this exam!");
}
}
public void otherMethod() {
// Do something
canHandInExam = true;
}
}
在这个小例子中,稍微调整每个方法是可行的,但是如果你有很多方法,你需要调整所有方法。由于在所有这些方法之后,您可以再次调用handInExam()
,因此需要将变量canHandInExam
设置为true
。
有没有办法以更易维护的方式解决这个问题?我对其他可能不是OO的编程语言持开放态度,但此时我不确定会是什么适当。 我考虑过使用函数式编程(例如Haskell),因为这些语言不是历史敏感的,但是我不知道如何限制你只能连续调用一次函数。我尝试在Java和Haskell中搜索如何将函数调用限制为连续n次,但最终只引用了如何调用函数n次。
答案 0 :(得分:0)
如果您谈到交付考试,这并不意味着该考试已经完成,但是考试有一些实体。因此,不是在考试中存储是否交付或可以交付,这样的事情会更合适:
//or whatever you call this
public interface Institution {
void handInExam(Exam exam) throws DuplicateExamException;
boolean isHandedIn(Exam exam);
}
Institution
的实施存储了所提交的考试(可能使用Set
)。