assert
およびenforce
06:09
と1:2
を入力すると、プログラムが正常に終了することに気付くだろう。ただし、開始時刻がユーザーが入力したものと異なることに気付くかもしれない:09:06から1時間2分後は10:08である。
ご覧の通り、
06:09
として入力された時間にもかかわらず、出力には09:06
が表示されている。このエラーは、次の問題でassert
を使用して検出される。06:09
と15:2
を入力した後、assert
の失敗により、次の行に移動する:この
assert
チェックが失敗するには、この関数が無効なhour
値で呼び出されている必要がある。プログラム内の
timeToString()
への2つの呼び出しには問題がないようだ:少し詳しく調査すると、バグの実際の原因が明らかになるはずだ。開始時刻を読み込む際に、時間と分の変数が入れ替わっている。
このプログラミングの誤りにより、時間は
09:06
と解釈され、それに持続時間15:2
が加算されると、無効な時間値になってしまう。明らかな修正は、時間と分変数を正しい順序で渡すことだ:
出力:
開始時刻? (HH:MM) 06:09 期間? (HH:MM) 15:2 06:09から15時間2分後は21:11である。
- 再び同じ
assert
チェックだ:その理由は、
addDuration()
は23より大きい時間値を生成する可能性があるためだ。最後に余り演算を追加すると、この関数の出力の保証の1つが確保される。この関数には他の問題もあることに注意。例えば、
resultMinute
は59より大きくなる可能性がある。次の関数は、分値を正しく計算し、関数の出力保証が確実に守られるようにしている。 - 頑張ってほしい。