詳細設計よりもちょっと上
上の時間の差分を求める時の要求定義って、
- なんかさぁ、2 項目目と 3 項目目に時間を書いてるから引き算してくれよ。
というのが現実路線だと思う。(w
さすがに、これだとまずいから、「こういう困った人にも分かるように」、「こういうことでいいですね」と念を押すことになるんだと思う。ちなみに私はソフト屋ではないため、そういうやりとりは想像でしかない。
- 区切りをセットして、
- 環境変数から日本時間をセットします。ここまでが初期設定になります。
- 最初の項目から、(後で使うかもしれないので) 日付を取得して、
- 2 項目目から開始時間を取得して、
- 3 項目目から終了時間を取得して、
- 差を計算します。
- 各行ごとに計算結果を表示しておきますね。
- 合計を計算します。
- 最後に合計を表示します。
ここまでなら、何となく分かるし、「なでしこ」でも理解してくれそうである。そこで、もう 1 階層プログラムにしてみる。
#! /usr/bin/gawk -f BEGIN { set_field_sep(); set_time_difference(ENVIRON["TZ"]); } { get_date($1); get_start_time($2); get_end_time($3); calc_diff_time(); print_diff_time(); calc_sum_time(); } END { print_sum_time(); }
まんまというか、味も素っ気もないのだが、ここまでなら、相手が素人でも 2 時間くらい説明すれば何とかなりそうな気がする。
あとは、function (コードレベル) にすればいい。
#! /usr/bin/gawk -f BEGIN { set_field_sep(); set_time_difference(ENVIRON["TZ"]); } { get_date($1); get_start_time($2); get_end_time($3); calc_diff_time(); print_diff_time(); calc_sum_time(); } END { print_sum_time(); } function get_date(str) { split(str, arr_date, /\//); year = arr_date[1]; month = arr_date[2]; day = arr_date[3]; } function get_start_time(str) { split(str, arr_start_time, /:/); start_hour = arr_start_time[1]; start_minute = arr_start_time[2]; start_second = arr_start_time[3]; start_time = mktime(year " " month " " day " " start_hour " " \ start_minute " " start_second); } function get_end_time(str) { split(str, arr_end_time, /:/); end_hour = arr_end_time[1]; end_minute = arr_end_time[2]; end_second = arr_end_time[3]; end_time = mktime(year " " month " " day " " end_hour " " \ end_minute " " end_second); } function calc_diff_time() { diff_time = end_time - start_time; } function print_diff_time() { print diff_time, "(sec)", strftime("%H:%M:%S", diff_time + time_difference); } function calc_sum_time() { sum_time += diff_time; } function print_sum_time() { print "=========="; print "Total =", sum_time, "(sec)", strftime("%H:%M:%S", sum_time + time_difference); } function set_field_sep() { FS = ","; } function set_time_difference(str) { time_difference = gensub(/[[:alpha:]]/, "", "g", str) * 3600; }
もっとも、こんなので済んじゃうとは思っていないが、昔はこういうような書き方をしていた時期もあった。
さて、本日の某社の要求仕様だが、
- ここをばびょ〜んとすると、びよ〜んとして欲しい。
頼むから、それを本気で口頭だけで言わないで欲しい。
コードを見せると、「そんなもん俺が見ても分かるわけない」と怒られ、勝手に作ると「なぜ確認しなかった」と言われることが多い人もいると思うが、こうやって機能で区切ってみるのも悪くない。