抽象度は上げて落とせ。
僕は正規表現を使わない。
外部システムから取得したデータを取り込むときに渋々使うくらいだ。
文字列置換もあまりしない。
プログラミングが下手な人が作ったシステムは正規表現や文字列置換が多い気がする。そこで、なぜその人は正規表現を使わなければいけなくなってしまったのか考えることで上達のヒントとしたい。
下手な人の例
例えば、ECサイトを作っているとしよう。商品には値段がある。値札は¥マークと三桁ごとのコンマが振られてた文字列だ。
さて、商品の「カートに入れる」ボタンを押すと「合計金額」が加算される機能を作るとする。
下手な人は、画面の中にある三桁ごとのコンマが振られた文字列を何とかしてintにして変換して、それを足し算して、その結果に3桁ごとのコンマを振って、それを画面に表示しようとする。
それに対して上手な人はそもそも最初からint型で値段と現在の合計金額を引きまわしているので、そんなことをしなくていい。
これがシステムの中に出現する正規表現の数の差になる。そして、システム開発のうまさの差である。
抽象度に対する意識の差
プログラミングが上手な人と下手な人の間には、抽象度に対する意識の差がある。
上手い人は、極力抽象度を高く保ち続けようとする。画面に表示する最後の最後の瞬間に抽象度を落とすことでビューに変換する。
逆に下手な人は抽象度を意識できていないのだろう。そもそも、抽象であるデータ構造と具体である画面を分けて考えられないのかもしれない。
抽象度の高いデータとは
例を挙げよう。
Stringの"1,800"よりintの1800のほうが抽象度が高い。
誕生日・現在時刻・年齢や定価・税率・税込価格のように3値の内2値が定まれば第3値が導出できるものは、どれか一つを省いた方が抽象度が高い。
不正値が混じっているかもしれないデータと不正値が混じっていないことを確認したデータなら確認したデータの方が抽象度が高い。
抽象度の3原理
抽象度の高低については、この三原理がいえる。
- 抽象度の高いデータの方が扱いやすい
- 抽象度の高いデータを抽象度の低い表現に落とすのは簡単
- 抽象度の低い表現を抽象度の高いデータに変換するのは難しい
いいコードを書くための原則
ということは、プログラミングをするときはこうするべきだ。
処理の入口で最も抽象度の高いデータに変換する。
すべてのビジネスロジックは抽象度の高いデータを引数に、抽象度の高いデータを返す関数として書く。
処理の出口は、抽象度の高いデータのみを引数にして任意の出力をするように実装する。
これをシステム開発全体で意識することができたらプログラミングは上達すると思う。