C++プログラマのブログ

プログラミングについて、勉強したことをまとめます。

if文を撲滅しろ

僕の仕事は研究所の書いたクソコードをきれいする便所掃除です。
やつらの戦闘力(=複雑度)をツールで計測すると普通に200を超えます。

今日はそのような環境で発見したクソコードの特徴の1つについて書きます。
際立ったクソコードは大抵if文を使って以下のように関数を構成します。

f:id:red_grape:20170903221707p:plain:w100

一方、良コードは大抵次のようになっています。

f:id:red_grape:20170903222357p:plain:w200

良コードを書く人/クソコードを書く人は、
それぞれ以下のような順番で関数をコーディングしているような気がします。

[良コードを書く人]
1. A~Cの場合分けする処理を書く
2. A~Cの各処理の詳細を記述する

[クソコードを書く人]
1. Aの処理を書く
2. AとBの処理の差分をif文で埋め込む
3. AとCの処理の差分をif文で埋め込む

関数の構造や作業の手順を見れば明らかですが、
クソコードは関数の機能分割の単位がコードから読み取れないわけです。
書いた人が何考えていたかわからない、意図を読み取れないという状態です。

こういうクソコードを量産しないよう、Error処理以外のif文を禁止して欲しい。
タイトル通りif文(もっと言うと条件分岐)を撲滅してほしいわけです。
if文の表現力が高すぎてこういう書き方しちゃうわけだし。

ちなみに、Haskellではパターンマッチがすべてを解決します。
関数は大抵、inputの状態を場合分けして、各場合の処理を書くので、
Haskellのパターンマッチはすごくいい機能だと思う。考慮漏れもなくなるし。
C++でも次の規格でおんなじような機能入れてくれないだろうか。
C++17にはないみたいだけど。