わかりやすい書き方

コードを書く上で心がけることの一つに「わかりやすく書く」というのがあると思う。

先日、ユーザのパスワードとして入力できる文字を半角英数字 + 記号のみとした場合、その妥当性の検証はどの様に書くかということが話題になった (文字列長に関しては今は考慮しない)。

その場では全員が正規表現でチェックする、という考えだった。ただ正規表現のパターンは違っていた。

私が考えたパターンは以下の通り。

/\A[\x21-\x7e]+\z/

他の人が考えたパターンは以下の通り。

/\A[!"\#\$%&'()*+,-.\/0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~]+\z/

(¥d や ¥w で短くできるけど、それは置いといて)

下のパターンだと、一目見ただけでは漏れがあるかどうか判断し難い。ASCII コードの範囲で指定すれば漏れがあるかどうかは判断しやすいと思った。今回の場合は、使用可能な文字が ASCII コード上で連続していたというのもあったので、私は上のパターンを推してみた。

他の人の意見は、どの文字が妥当なのかコード上に表れていた方がいい、というものだった。

こういう場合はどっちがわかりやすいんだろうか。

おまけ

あとで調べたら、以下のパターンでも同じことを実現できるようだ。

/\A[[:graph:]]+\z/

また、正規表現を使わないという方法もある。例えばこんな感じ。

puts"invalid" unless passwd.split(//).each {|c| break unless valid_chars.include? c }

正規表現ってベースの語 ( この例だとRuby ) と違う言語をベースの言語に埋め込んでいるようなものだからちょっとメンテしにくい。そんなことがあるので、最近は何でも正規表現に頼ってしまうということはなくなった(というか意識的にしている)。もちろん正規表現は便利なので、使えるところでは使っていくけど。