プログラマー幸福論

プログラム関係の雑記やcodicの開発日誌

delete_flag とネーミングしている人に読んでもらいたい、過去分詞を使った曖昧さの回避

f:id:namba0219:20120615121342j:plain

Photo by LordFerguson

とあるテーブルで、process_flag(処理フラグ)というカラムを見つけた時に、あなたは 処理したものに "1" が立つと思いますか?それとも 処理対象のものに"1" が立つと思いますか?

 大抵の人は「処理したものに "1" が立つ」と答えますが、何人かは反対のことを言うと思います。それは不思議なことではありません。process_flag というカラム名に「処理したものが ”1” になる」ニュアンスはなく、受け手が経験や慣習から判断しているだけなので、このような現象が起きます。

 日本語では、処理済フラグ/処理対象フラグといった表現の使い分けにより、このような問題が解決されるのですが、英語名に変換した際にこれらの情報が欠落しているケースを良く見ます。

~済みは過去分詞

何かの動作が完了したことを表現するには、過去分詞を使うとスマートに表現できます。先ほどの処理フラグの場合、processed(process の過去分詞)を使うことで「何かの処理が終わった場合に、”1” が立つ」ということを明示できるわけです。

過去分詞とかもう覚えていないよー。って人は過去分詞は「~済み」と訳せるとだけ覚えておいてください。いつか誰かが書いたプログラムで過去分詞を見つけたときに、その意図が理解できると思います。

もうひとつ簡単な例を挙げてみます。今度はプログラム内で使われるフラグの例です。

boolean firstFlag = false;
for (int i = 0; i < nameArray.length; i++) {
    if (!firstFlag) s += ",";
    s += nameArray[i];
    firstFlag = true;
}


上記のコードは、名前の配列(nameArray)をカンマで繋げるものです。これもまた同じように、変数 firstFlag にどのような条件で true になるのかという曖昧さがあります。

では、このケースも過去分詞 done を使って書き換えてみます。

boolean doneFirst = false;
for (int i = 0; i < nameArray.length; i++) {
    if (!doneFirst) s += ",";
    s += nameArray[i];
    doneFirst = true;
} 


最初のループが完了したら true になるニュアンスが加わりました。do の過去分詞 done は便利なので覚えておくといいと思います。

さいごに

「送信したものに "1" が立つであろう」と感覚的に判断してしまうことは、謂れのないバグを生み出してしまう潜在的な危険性があります。いわゆるトラップ(あるいは地雷)ってやつです。

あなたが、なんとなく付けた変数名やカラム名が、知らず知らずうちにトラップになっているという事ともありえるわけです。そんなことにならないように、ネーミングには慎重になるべきです。そのソースコードを後に担当するするかもしれない人のためにね w(ネーミングに限った話ではありませんね)。

そういえば、タイトルの件ですが、過去分詞の deleted を使うことを検討してみてください。

こんな感じのTipsなどを TwitterFacebook で定期的に配信しています。ボキャブラリが少ないと感じている方や、英語に苦手意識を持っている方は、是非フォロー / 購読してみてください。