外部から連携されてくるデータで、下記のようなものがあった。
- 数値
- 下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?);
コメントを残す