読者です 読者をやめる 読者になる 読者になる

Pinoco等でも様々な列でのソートを改善してみる。

PHP Python

アプリケーションハンガリアンを用いて徳丸本の「様々な列でのソート」のサンプルを改善してみた。
http://tech.ecnavi.co.jp/archives/4606152.html

という記事に触発されて、さらに、言語としての表現力がどれぐらい貢献できるか考えてみたいと思います。

ブログエントリでの「URLパラメータで使われている文字列表現と、SQLで使われている表現を互いに違うものにする」というのはいいアイデアだと思いました。真似させてもらいます。間違っているものは間違っているように見えるようにする、ですね。

それで、アプリケーションハンガリアン記法の難しさは、チームメンバー(あるいは半年後の自分)にルールを徹底するところだと思うのです。「ええと、"s"ってなんだっけ」それで、急いでいるとついつい意味を誤解したままなんとなく似た命名規則の変数を作ってしまう。あと、そもそも論でどうにもならない話ではあるのですが、記号としての変数が多いと、あとで代数的な発想でロジックを再構築して意味を考えないといけない。

利用者の平均スキルを抜いて考えたとき、まだPHPがセキュリティに弱いと言われるのは、その表現力の貧しさ(そのくせ書いたらすぐに動いてしまう軽量言語)から来る、いわゆるシンタックスノイズ(無駄に構造化が要るのでセマンティック?)のせいかもしれないと、なんとなく思っていいます。つまり「自然言語のように端的な表現」ができればいいんじゃないかなと。

Pinocoはちょっと便利なメソッドを持った擬似配列をベースにしていて、それで書くとこんなふうになります。

複雑な if-isset-then-else パターンは「プロパティがなかったときのデフォルト値付きget」に集約できます。なので、別の関数に分ける必要がなくなります。それで、同じぐらいの複雑度の処理に対して消耗する行数が減ると、スクリーンでの見通しが良くなり、コードレビューの効率がすごく上がるんじゃないかと思います。それは、セキュリティホールの気づきやすさにも通じるんじゃないかなと思っています。

...て、まあ、ワンライナーすぎるのもほどほどに、ですけどね。

あと、ドット演算子での文字列結合を避けるのもいいアイデアかもしれないですし、そもそもGETパラメータで指定できるものが正順ORDERだけでいいのかという問題に、コードを見るだけで気づけたり。

この「ビジネスロジックから本質的でない if を排除する」という方向性が、個人的に好きでしょうがないです。

PinocoのgetはPythonのdictのgetと同じです。PythonPythonであるというだけでPHPより有利だと感じられているのは、このあたりに秘密があるんじゃないなかと。

まあもともとは、徳丸本が言いたかったことの本質は「安全 か ど う か 」の判断をせよということなので、本の上では if であることが本質だったんですけどね。でも本で勉強したあとは、そのサンプルコードのプログラミング方針をそのまま実務で使うようにしないでくださいね、実際はこういう書き方がいいんじゃないかと思いますよ、とは言えるかなと思います。