ネストの深さとコードの複雑度
この記事は「コードでも書こう」とエディタを起動したものの書くコードがない状態に陥った僕がやり場のない感情を消化するために書いたものであり、多くの人にとっては全くもって読む価値の無い記事である。そもそも僕個人の存在が社会にとっては全くもって価値のない存在であって、そのような存在から生み出される文章に価値がないことは自明である。
さて、本題です。 本題をまとめると「ネストの深さではなく複雑度でコードの良し悪しを判断すべき」という内容。 言いたいことはこれで終わりなので、以降の価値の無い文章を読むことに時間を割くよりはここでタブを閉じることをおすすめします。
ネストの浅さにこだわると逆に読みづらいコードが生み出されたりするので、ネストを深くするなという単純な主張には同意しかねます。 ちなみに、個人的には最後のケースを除けばbefore & afterはどっちもどっちという印象。どちらも同程度の複雑さ加減なので。
ネストの深さや、return
の数ではなく複雑度、言い換えれば分岐の数で語るべき、というのが個人的な見解です。
例えば、先日書いたclojureのmap
のtransducers。(transducersはそもそも概念が難解なので例としてあれですが)
([f]
(fn [f1]
(fn
([] (f1))
([result] (f1 result))
([result input]
(f1 result (f input)))
([result input & inputs]
(f1 result (apply f input inputs))))))
ネストは4段だけど、これはダメなコードだろうか。読みづらいコードだろうか。要は、clojureにおけるfn
やlet
のような分岐はしないけどネストするタイプの構文はネストが深くなっても別に読みづらくはならない(個人的に)
もちろん、「複雑度が高い」の言い換えとして「ネストが深い」と呼ぶケースがほとんどであろうということは理解していますが、シンプルに「ネストが深いことは悪」との主張が広まると誤解を招きかねないなあと思った次第です。