だから私は行に2度呼ばれないかもしれない関数handInExam()
を持っているJavaプログラムを書いているので、プログラムは履歴に敏感です。この問題が発生するのは、このメソッドがすでに呼び出されているかどうかを確認するために変数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
に設定する必要があります。
この問題をよりメンテナンス可能な方法で解決する方法はありますか?私はオブジェクト指向ではない他のプログラミング言語にも関心がありますが、現時点でどのようなものが適しているのかは不明です。 関数型プログラミング(例:Haskell)は歴史に敏感な言語ではありませんが、関数を1回だけ呼び出すように制限する方法はわかりませんでした。私はJavaとHaskellの両方で行のn回に関数呼び出しを制限する方法を探そうとしましたが、これは関数をn回呼び出す方法への参照のみで終わりました。
最後の段落で他の言語についてのセクションを削除する必要があると思います。これは、あなたの質問が広すぎる傾向があるためです。 – SpaceTrucker
'handInExam'以外のすべてのメソッドで' canHandInExam = true'を設定すると、 'handInExam'を呼び出してから' otherMethod'を呼び出してから 'handInExam'を呼び出してから' otherMethod'を呼び出すことができます(不定回数)。コンストラクタで 'true'に設定し、' handInExam'で 'false'に設定する必要があります。しかし、これは 'handInExam'が2回実行されるのを防ぐだけで、' handInExam'が既に呼び出された後でも他のメソッドを自由に呼び出すことができます。 –
私はあなたの質問を再読しました。そして、 'handInExam'を2回呼び出せるようにしたいと思われますが、' otherMethod'がその間に呼び出された場合に限ります、そうですか? –