命名規則のための日英文法
命名規則で、
- isExist ← ダメ
- doesExist ← OK
みたいな話がちょくちょくあると思いますが、そもそも日本語と英語って結構違うよねというのをふと思い立ってまとめます。
言語の専門家ではないので、間違ったこといってたらごめんなさい
LLM補完で良くねと思った皆さま。はい私もそうだと思います、、、
が、やっぱり自分で考えてみることに意味はあると思いますので
〜する動詞(サ行変格活用)
日本人が関数名や変数名をつける場合に名詞動詞がよくわからなくなる元凶がこれかなと思っています。
日本語の場合サ行変格活用動詞として、(特に現代では)おおよそ任意の名詞に対して〜するをつけることで動詞化することができます。
そして、「キャッチする」、「トライする」のように外来語にまでこの概念は拡張されています。
これ自体は良いのですが、サ行変格活用があることで日本語の場合名詞と動詞が同型の単語が(パッと思いつかないくらいには)少なくなっていますが、外来語の場合には名詞動詞同型、異形両方とも存在します。
動/名
catch/catch
try/try
shoot/shot
walk/walking
exist/exsitance
のように同じだったり違ったりするのですが、これらの〜する動詞化にはあまり法則性がなく見えます。
catch -> キャッチする(同型なのでどっちを採用しているかわからない)
try -> トライする(キャッチと同様)
shoot -> シュートする(シュートが名詞と半分捉えられているせいか、動詞系+する)
walk -> ウォーキングする(こっちは名詞系が使われている)
exist -> そもそも言わない
ということで、日本語を母語とする人は外来語の名詞/動詞(特によく使うような単語)の区別がかなり曖昧になりがちです。
まとめ
よく使うような単語ほど、一度辞書で調べて名詞系/動詞系を確認した方が良さそうです
時制関連(テンスとアスペクト)
時制系もややこしいです。特に過去形関連。主に非同期処理の関数の命名くらいとは思いますが、、
結論から言えば、プログラミングの範疇では現在形か現在完了形しかほぼ使わないと思います
ので変に過去形を使わないようにした方がよいかも?
日本の英語教育では、過去形、現在形、未来形、、、のように習いますが、そもそもこの教え方が混乱の元な気がしています。(もちろん中学生くらいに教える際にはこの教え方が良いのでしょうが、仕事で使うとなるとちょっと困るかもと思っています)
英語の時制はtense(いわゆる時制)とaspect(相)を基本として、tenseとaspectに収まらない時制をmodal(法)で扱っています。
modalはこの章の内容から外れるので一旦おいておきます。
英語のtense(時制)
まさに時を表しますが、ここで言う時は"話者が想定している時間軸" です。
ちなみに英語は現在と過去しかないです。(あれ、未来系は、、、というとそれはmodalで頑張って表現します)
英語のaspect(相)
普通(単純が正しい用語です)、進行、完了の3相があります。
それぞれtenseにおいて、
"普通":変化しない。一般動詞であれば習慣、be動詞であればその状態であり続ける。
"進行":今まさにやりかけている、やっている、そして未完了である。
"完了":完了している、(完了した後も原則変化しない状態を表す動詞であれば)継続している。
の意味を持ちます。
日本語のtense/aspectのややこしいポイント
日本語のtense/aspectについては詳しく解説しませんが、ややこしいポイントが一つあるのですが、それは完了相です。
日本語では過去と完了の区別が曖昧です。
このため過去完了の概念が理解できないですし、謎の過去形関数が発生することがあります。
彼は(昨日)出かけた。(過去)
彼は出かけていた。(でかけている最中なのか、ちょうど帰ってきたのか曖昧)
昨日訪れた時、彼は既に出かけていた。(これは出かけている最中)
まとめ
なんだかんだややこしい話をしましたが、プログラム作成という文脈で言えば動詞を含む場合
「現在形」、「現在完了形」のどちらかでほぼ全て大丈夫と思います。
※勿論画面処理メッセージなどユーザが目にするものはちゃんと他のtense,aspcetを考える必要あり。
理由は以下
- 話者=プログラム(処理の実行者)自身になる
- 処理系は今来たデータや今見れるデータを処理するので、原理的に過去形をとるパターンは非常に少ない。過去のデータであっても参照するのは今
- ただし、今のデータが規定の状態になっているか?のチェックはあるので完了相は必要
過去のデータを今参照する場合は、VerifyYesterdayTransaction()のように動詞自体は現在形で参照先に過去を明示するべきです。
疑問文
私が個人的によく悩むのがこれですが、今回まとめてみてちょっとスッキリしました。
これはいうまでもないと思いますが、日/英だとそもそも疑問文の作り方が異なります。
特にプログラミングでよく出てくるYes/Noのbooleanで答えられる一般疑問文において、日本語は語尾で解決できますが、英語の場合は語順の転置を伴います。
これと一個目のサ変動詞問題が混ざった結果isExist()のような命名が生成されがちです。
いきなりまとめ
が、これはパターン化できそうですなので深く考えず以下の3パターンで結構な範囲がカバーできるのではと思っています。
- is/be (主語) 形容詞 : メソッド等で主語が明確な場合は主語省略可能
例: .isAvailable(self), isTaskReady(task), isTaskCompleted:boolean - has/have (主語) 動詞過去分詞 (目的語): メソッド等で主語が明確な場合は主語を省略化、目的語もそもそも自動詞の場合は省略可
例: .hasFetchedId(self), hasPersonBoughtItem(person,item) - can (主語) 動詞 (目的語): ほぼhasの時と同じ
例: .canSwim(self), canCatRecognizePerson(cat,person)
ここで注意としてはhasをbooleanに使っている関係上、一般動詞としてのhaveは別の言い回しを使った方がわかりやすい気がします。
例:
hasPriviledgeToGet... -> canGet, isAuthorizedToGet等
hasHome -> OwnHomeなど
動詞の人称対応、名詞の複数形対応
これは悩ましいところで、明確にこうというものがないのですが、、、
ご存知の通り動詞は人称によって特に現在形の活用語尾が変化しますし、名詞も単複で形が変わります。
文法的に真っ当に従うのがある程度よいのですが、個人的には以下の通りが非ネイティブスピーカーによるチーム開発の限界かなと思っています。
まとめではなくポエム
動詞の人称対応はしない。
全て原型を採用します。(is -> be, has -> haveもそうです)
非ネイティブスピーカーがミスなくこれを実施するのは大変かつ、getObjectとgetsObjectが混ざっていたりすると呼び出しがややこしくてしょうがないので、原型に統一するのが落とし所かなとおもっています。
名詞の複数形は可能な限り別のSuffix等で対応する
非ネイティブスピーカーに、単複の判断は辛いものが多いです。
代表的なものはdatum/dataなど(data自体が複数形です、、、)
一方で、返り値の型などを直感的にわかりやすくするために、複数値なのかどうかは判別できた方が良いです。
なので、そもそも複数形が発生しないような命名をできるだけします。
例えば"単数系+List/Array"等で複数値を表すようにします。
例
Customers -> CustomerList
こうすればある程度統一されるはずです。
Discussion