バリデーションは機械の不都合を人間に通知するために行われる

恐らく多くの場合で、バリデーションというのものは値が正しいかどうかを検知するものではなくて、値のフォーマットが正しいかどうかを検知するものであろうと思う。そして、そのフォーマットが誰のためにあるのかと言えば、機械のためにあるのだと思う。
国内では郵便番号の999-9999は不正だし、電話番号の99-9999-9999も不正だが、多くの場合でこれらはチェックされていないだろう。理由は簡単だ。それを格納する対象である機械(多分データベース)にとってはそれで十分に真だからだ。
人間の都合というものは本当にチェックするのが難しい。

水柿助教授の日常を読んだ

工学部・水柿助教授の日常 (幻冬舎文庫)

工学部・水柿助教授の日常 (幻冬舎文庫)

これほど脱線の多い小説は珍しい。なんだか飲み屋で親しい友人と会話しているような錯覚に陥った。
飲み屋での会話なんてものは、大体が脱線で、本線など何処にもないことが多い(あくまでも自分の場合)。
でも、それが心地よく楽しい。そんな小説だった。

社会保障カード

「社会保障カード」に年金手帳・保険証など統合へ…厚労省(読売新聞) – Yahoo!ニュース

カードの機能や行方はまだまだ分からないことなのだけれども、

運転免許証を持たない高齢者らのために、希望すれば、カードに顔写真を添付し、身分証明書とすることも認める

「社会保障カード」に年金手帳・保険証など統合へ…厚労省(読売新聞) – Yahoo!ニュース

自分の運転免許証も使い勝手の良いただの身分証明書となっているので、やっぱり要望があるのだろうだなとか思った。
にしても、「社会保障カード」というのは凄いネーミングだ。絶対に失くせない。

記憶と記録

記される媒体の違い。恐らく多くの場合で記憶の方が有利なのではないかと思う。五感をテキスト変換せずに記すことができるし。
ただし、記憶には忘れるという問題と、知らぬ間に改竄されてしまうという問題がある。
そこで記録することになる。忘れることに対する対策であり、記憶の改竄を発覚するためでもある。
自分がブログを書く理由は実は上記の理由がかなり大きい。年齢を重ねることによって美化される過去を退けるためにブログを書いている。あのとき、どう感じたのか、どう思ったのかを振り返ったときに改竄したくない。
年をとれば当然学んだことが多い分、より良い判断ができることが多い。しかし、その良い判断ができるために何を学んだということは押さえておきたい。昔から出来ていたなどという豪語はしたくない。
記録は限定的な情報しか記載できないけれども、普通はこっそり改竄されたりはしない。ブログで公開することで、多くの証人を作ることにもなり、言い逃れができない。
大人になると子供の頃の気持ちがわからなくなると言う。結婚すると独身時代の気持ちがわからなくなると言う。プログラムが書けるようになると初心者だった頃のことがわからなくなると言う。
若かった頃の想いを今の若い人とも共有できるオッサンになりたい、というのが自分の人生の目標の一つなので、自分の若い頃については人一倍押さえておきたいものだ。

PHPの定数をどうするか

Javaで言うstatic finalをどうするのが良いか。PHPには定数とオブジェクト定数があって、それぞれdefine関数とconstキーワードで宣言できる。具体的にはこんな感じ。

<?php
// 定数
define('MESSAGE', 'Hello World');
echo MESSAGE;
// オブジェクト定数
class MyClass {
const MESSAGE = 'Hello World';
}
echo MyClass::MESSAGE;

オブジェクト定数という名前ではあるけれどもクラス定数と呼んだ方が解り易いかも。constはstaticキーワードなしにstaticな存在になる(staticキーワードを付けるとシンタックスエラー)。
defineとconstの違いは、グローバルなのかクラス帰属なのかと言う点と、宣言時に演算が使えるかという違いがある。例えば、

<?php
define('MESSAGE',  100);      // OK
define('MESSAGE1', 100 + 10); // OK
define('MESSAGE2', time());   // OK

このようにdefineだと演算を行ったり関数を呼び出した戻り値を定義することができるが、

<?php
class MyClass {
const MESSAGE1 = 100;      // OK
const MESSAGE3 = 100 + 10; // NG
const MESSAGE2 = time();   // NG
}

constではシンタックスエラーになる。defineではグローバルなので問題にならないけれども、constの場合は継承クラスで値を変更できてしまう(親クラスの値を変更してしまう訳ではないけれど)ので、それを防ぎたい場合であればfinalなclassにする。

<?php
final class MyClass {
const MESSAGE = 'Hello World';
}

これで子クラスではMESSAGEというメンバーを宣言ができなくなる。ただし、一つのconstに対してのみfinalを付与できないので、クラス単位でfinalになってしまう辺りが不便ではある。
定数ではないけれどもstaticキーワードのついたメンバーだとこんな感じになる。

<?php
class MyClass {
static $MESSAGE = 'Hello World';
}
echo MyClass::$MESSAGE;

変数なので宣言するときも参照するときも$が付く。勿論、値は変更可能。
さて、これらを上手く使うにはどうしたら良いだろう。namespaceが出てくるとこの限りではないけれども、現段階ではグローバルに名前付定数を増やしたくないので、defineの使用はあまりしたくない。そうすると、constを使うことになるけれども、演算して代入ができないので複雑な値を定義できない。つまり、Javaのこういう手段がないみたい。

class MyClass {
public static final String MESSAGE;
static {
MESSAGE = "Hello World";
}
}

ということで、文字や数値の場合はconstで良いけれども、計算しないとわからない値や、配列やオブジェクト(これはdefineでも保持できない)はどう扱えうのが上手いのかいまいち解らない。
続きはDoYouPHP?の中の人があとで詳しく書く予定です。ご期待ください。

プログラムコード上のコメント

出来るだけコメントを書かないようにしている。面倒だからではなくて、コメントで説明してしまうと判らないコードの免責になってしまうことが多いから。
例えばこういうことはやりたくない(勿論、極論だけれども)。

class Hoge {
private int count;
public boolean isOver() {
// 10を超える場合は大きすぎるので真を返す
return count > 10;
}
}

こういうのはコメントに書かずにコード上で表現した方が良いと思う。

class Hoge {
private static final int MAX_SIZE = 10;
private int count;
public boolean isOver() {
return count > MAX_SIZE;
}
}

ただし、逆にコメント(ドキュメント)が必要な場合もあると思う。それはコードを読まなくても解るようにするためのもの。例えば、APIのドキュメントとかは必要だと思う。
よくコメントにはコードの動作ではなく仕様を記載するべきだということが言われていると思う。それはそうだと思う。コードの動作は読めば解る訳で(たまに信じられないくらい難解な一行とかもあるけれど)。ただ、もう一歩言うのであれば、仕様がコードで表現できる場合はコメントではなくコードに反映させるべきだと思う。理由は簡単でコードは実際に利用されるけれども、コメントは書いた場所にしか存在しないから。

「心はプログラムできるか」を読んだ

読んでいてワクワクした。突然変異と世代交代を計算機で動かしても、予定通りというか予測可能な進化になりそうな印象なのだけれども、現実には思いもしない進化を遂げるものなのかと。