詳細設計よりもちょっと上

上の時間の差分を求める時の要求定義って、

  • なんかさぁ、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;
}

もっとも、こんなので済んじゃうとは思っていないが、昔はこういうような書き方をしていた時期もあった。

さて、本日の某社の要求仕様だが、

  • ここをばびょ〜んとすると、びよ〜んとして欲しい。

頼むから、それを本気で口頭だけで言わないで欲しい。
コードを見せると、「そんなもん俺が見ても分かるわけない」と怒られ、勝手に作ると「なぜ確認しなかった」と言われることが多い人もいると思うが、こうやって機能で区切ってみるのも悪くない。