「読みやすいコード」を考える

読みやすいコードというと、


「何をしているのか分かりやすい。」


という回答を得る場合が多い。


だが、それだけで果たして本当に読みやすいと言えるのだろうか。


今回は、本当に「読みやすいコード」とは何かを考えていきたい。


まず最初に、コードを読む必要があるケースをあげる。


1.そのコードを保守する時
2.そのコードを利用する時


特に前者の例が多いのではないだろうか。
以前書いたコードをデバッグしたり、他人が書いたコードをデバッグしたり、仕様変更に対応したり。


そして、次になぜコードが書かれているかといえば、


要求されている仕様を実現するため


だろう。


ということは、「読みやすいコード」とは、「どんな仕様を実現しているのかわかりやすいコード」である必要が出てくる。


例えば以下のような断片的な仕様を実現してみよう。


仕様:
商品区分の上2桁が"BB"のものと、"CC"のものはシステム対象外とする。


ただ、「何をしているか分かりやすい」シンプルなだけのコードの場合、以下のようになる。


Private Sub 何らかのメソッド(商品コード As String)
Select Case 商品コード.SubString(0,2)
Case Is = "BB","CC"
'システム対象外とする処理
Case Else
'処理
End Select
End Sub

確かに、上記の例は簡潔だし、そこだけを見ればよいので手っ取り早い。
だが、後々、このコードを見たときに


「何で、"BB","CC"の時だけ、この処理を行っているのだろう。」
「この分岐は、どんな仕様を実現しているんだっけ?。」


と、疑問に思わないだろか。
他人のコードだったらなおさらである。


そこで、もし、このコードが


Private Function システム対象(ByVal 商品コード As String) As Boolean
dim システム対象外判断部分 as String = 商品コード.SubString(0,2)

If システム対象外判断部分 = "BB" Then
return False
EndIf

If システム対象外判断部分 = "CC" Then
return False
EndIf

return True
End Function

Private Sub 何らかのメソッド(商品コード As String)
If Not システム対象(商品コード) Then
'システム対象外とする処理
Exit Sub
Endif
'処理
End Sub

だったとしたら、どうだろう。


前のコードと比べると明らかに冗長ではあるが、


「"BB","CC"の時はシステム対象外である。」


という仕様がコード上に残っているため、その分岐がどんな仕様を実現しようとしたのか、一目瞭然である。
また、その分岐の詳細仕様に興味が無い場合は、そこを見るだけで充分である。
そして、どんな時にシステム対象外なのか詳細仕様を知りたくなったら、その時に初めてその先のメソッドを見ればよい。


このようなコードは、一見冗長に見え、読む範囲が広がり追いづらくなるように見える。
だが、実際は、目的に応じて詳細レベルをコントロールできることで、より簡潔に目的にマッチした読み方ができる。


ぜひ、一度、


「コードに仕様を残す。」


という事に留意して、コーディングしてみてはどうか。


きっと「読みやすい(保守しやすい。)コード」になるだろう。