如何应对历史敏感性?

时间:2017-11-30 11:35:32

标签: java oop maintainability

所以我编写了一个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次。

1 个答案:

答案 0 :(得分:0)

如果您谈到交付考试,这并不意味着该考试已经完成,但是考试有一些实体。因此,不是在考试中存储是否交付或可以交付,这样的事情会更合适:

//or whatever you call this
public interface Institution {

    void handInExam(Exam exam) throws DuplicateExamException;

    boolean isHandedIn(Exam exam);

}

Institution的实施存储了所提交的考试(可能使用Set)。