2017-11-30 1 views
1

だから私は行に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()を再度呼び出すことができるので、変数canHandInExamtrueに設定する必要があります。

この問題をよりメンテナンス可能な方法で解決する方法はありますか?私はオブジェクト指向ではない他のプログラミング言語にも関心がありますが、現時点でどのようなものが適しているのかは不明です。 関数型プログラミング(例:Haskell)は歴史に敏感な言語ではありませんが、関数を1回だけ呼び出すように制限する方法はわかりませんでした。私はJavaとHaskellの両方で行のn回に関数呼び出しを制限する方法を探そうとしましたが、これは関数をn回呼び出す方法への参照のみで終わりました。

+0

最後の段落で他の言語についてのセクションを削除する必要があると思います。これは、あなたの質問が広すぎる傾向があるためです。 – SpaceTrucker

+0

'handInExam'以外のすべてのメソッドで' canHandInExam = true'を設定すると、 'handInExam'を呼び出してから' otherMethod'を呼び出してから 'handInExam'を呼び出してから' otherMethod'を呼び出すことができます(不定回数)。コンストラクタで 'true'に設定し、' handInExam'で 'false'に設定する必要があります。しかし、これは 'handInExam'が2回実行されるのを防ぐだけで、' handInExam'が既に呼び出された後でも他のメソッドを自由に呼び出すことができます。 –

+0

私はあなたの質問を再読しました。そして、 'handInExam'を2回呼び出せるようにしたいと思われますが、' otherMethod'がその間に呼び出された場合に限ります、そうですか? –

答えて

0

あなたが試験に合格することについて話している場合は、それがその試験で何かが行われたという意味ではなく、試験が与えられた実体があることを意味します。だからではなく、それが中に渡されたかに渡すことができるかどうかを試験中に格納するので、このようなものは、より適切であろう:Institution店の

//or whatever you call this 
public interface Institution { 

    void handInExam(Exam exam) throws DuplicateExamException; 

    boolean isHandedIn(Exam exam); 

} 

実装(おそらくSetを使用して)に手渡された試験。

+0

これはきちんとしたデザインの解決策だと思うが、私はこれが完全に問題を解決するわけではないと思う。 2回連続して呼び出すことができない別のメソッドがあるとしたら、別のインターフェイスを作成しますか?そして、これに 'Institution'のような明確な抽象化がないなら、あなたは何をしますか? –