外部から連携されてくるデータで、下記のようなものがあった。

  • 数値
  • 下2桁が秒
  • 下3桁以上が分

これを秒として解釈せにゃならん。つまり「100」が連携されたら、それは「60秒」を表現している。「101」が連携されたら「61秒」。

「なにそれ」って言いながらも変換メソッド書いたろと思って、まず、どうしようかと思った。「あーーーーーーーー🤤」と呻きながら20秒考えた。

☆ モニターの まえの みんなも かんがえて みよう!

…じゃあ

  • 文字列変換して
  • 右から2文字を持ってきて数値に変換して変数secに詰めて
  • なんとか右2文字を取り除いた文字列を取り出し
  • 数値に変換して60を乗算してsecに加算する。

脳裏をよぎった実装イメージがこんなかんじ(読まんでええよ)

※C#です。

private static int Hoge(int num)
{
    var str = num.ToString();

    // 秒
    var sec = 0;
    if (str.Length >= 2)
    {
        var secStr = str.Substring(str.Length - 2, 2);
        int.TryParse(secStr, out sec);
    }
    else
    {
        int.TryParse(str, out sec);
    }

    // 分
    if (str.Length > 2)
    {
        var minStr = str.Substring(0, str.Length - 2);
        if (int.TryParse(minStr, out var min)) sec += (min * 60);
    }

    return sec;
}

よぎった時点で恥ずかしながらちょっと嘔吐した。「ホオヴォ」っつって吐いた。大人だから流石に外には漏らさんかったけど、歯の裏側まで吐いた。大人だから全部飲んだ。

でね?ここからがプログラミングの楽しさなんです。

◆「下2桁」の取得

文字列変換する必要なんてなくて、つまり「100で割った余り(剰余)」を取ってくりゃいいだけなんですね。

だからこうなる。

private static int Hoge(int num)
{
    var str = num.ToString();

    // 秒
    var sec = num % 100;

    // 分
    if (str.Length > 2)
    {
        var minStr = str.Substring(0, str.Length - 2);
        if (int.TryParse(minStr, out var min)) sec += (min * 60);
    }

    return sec;
}

◆「下3桁以上」の取得

これも文字列変換なんていらない。「100で割った後の整数部分」を取得すればいい。

こうなる

private static int Hoge(int num)
{
    // 秒
    var sec = num % 100;

    // 分
    sec += (int)(num / 100) * 60;

    return sec;
}

つまりこうなる

private static int Hoge(int num)
{
    return ((int)(num / 100) * 60) + (num % 100);
}

そしてこうなる

private static int Hoge(int num) => ((int)(num / 100) * 60) + (num % 100);

ここまで収まってくれるとは思わなんだ。

こういうのが、プログラミングの楽しさのひとつですよね。

無論これじゃなんのこっちゃわからんから、ドキュメンテーションコメントは必須だ。だけど、こういう「クソむかつくし出来ることなら書きたくねぇタイプの関数」を書かねばならん時に、綺麗に圧縮できると気持ちがいい。

でも、業務な意味を持つ処理はこんなに詰めて書いちゃダメだぞ★

ギチギチに圧縮していいのは、簡単で馬鹿げてて状態にアクセスしなくていい処理だけだ。それも、関数名はちゃんと考えてつけてやらなきゃいけない。いつも通りな。

◆怪談

修正前みたいなコードをプルリクでぶん投げてくる人がいたら。

いるわけ無いんだけど、もしもいたら怖いと思わんかね。

◆視聴者プレゼント

文字列から「null許容の数値型」に変換して、変換不可だったらnullを返してくれるヤツ。

※紹介しといてなんだけど、nullは極力使うな。暴力団みたいにツケを取り立ててくるから、関わらずに済む方法をまず考えてからアレしろ。

※三項演算子も多用すんなバナナ野郎。

private static int? ParseIntOrDefault(string str) => int.TryParse(str, out var i) ? i : default(int?);