はじめに:この記事を書いた動機
これらの素晴らしい先行記事を見て、「言語学を用いれば、共通点を見つけ出して一般化・大項目化したり、取り違えやすいエッジケースを明確化できるんじゃないか?」と思ったことが、この記事を書き始めたきっかけになります。
1章は3つの主要なパターンとその詳細・例外、2章はそれらに関する文法的な解説になっています。
構造化・体系化が必要な理由
太郎くんと花子さんが英作文の問題を解いています。
次の日本語を英文に訳せ。
(1) 彼女は楽しい人だ。彼女といると退屈することがない。彼女はいつも新しいことに挑戦して……
太郎くん(『楽しい』って英語で何やったっけ……)
狩井先生@ 1年6月「exciting は楽しいって意味やで~」
~~ 月日が流れる ~~
柱鈴先生@ 2年4月「excited は楽しいって意味やで~」
太郎くん(……って教わったけど、exciting か excited、どっちや…… )
花子さん(覚えてる!たしか……)
辺江師先生「人が主語なら excited 、モノが主語なら exciting ですよ。」
花子さん(だから、"She is an excited person." )
……残念。二人とも不正解です。ここで適切なのは "exciting" ですね。
「楽しさの原因」が主語であれば exciting, 「楽しく感じている人」が主語であれば excitedです。(ちなみに、impress, move, astonish, disappoint ... のような多くの動詞について、現在分詞(-ing)と過去分詞(-ed)の同様な対立関係があります。)
太郎くんのように、ポツポツと説明されただけなら、この対応関係を発見するまでの間ずっと 「楽しい」を正しく英語に訳す方法が分からないことになります。
それに対して 「現在分詞 <--> 過去分詞
の対立関係についての一般法則」 を念頭においた説明は頭に入りやすく、思い出す時にも苦労が少なくなるでしょう。
また、花子さんのように、意味の境界を誤った理解をしてしまうと、「人だけど原因になっている」ような特殊なエッジケースで誤答してしまいます。
このようなケースで躓かないためには exciting <--> excitied
の差・境界線の正確な理解が重要です。
このように 楽しい === exciting
のような 1:1 の対応関係ではなく exciting <--> excitied
のような 差・境界線 の理解が重要です。
言語学の父ソシュールも、「事柄と単語に対応関係があるんじゃなくて、単語と単語の対立関係によってその意味が定義される」と言ってました。(曖昧)
ちなみに、この考え方は、単語を調べる際にも重要です。
命名するとき、意味が広すぎる語や、request, function, component, class など技術用語と衝突して分かり難くなるモノは避けるべきです。
Google翻訳を使用すると、そういう語が1番上に来ることが多い(肌感覚)ので、
- Weblio等の辞書で複数の候補を見比べる
- "(元の単語) synonym" で類義語を探す
など試してみましょう。
私は言語学を修めていない、般教レベルのいわゆる "ゆる言語学徒" なので、誤解や不正確な説明があったり、句構造文法・依存文法・伝統文法がごちゃまぜになっているかも知れません。やさしく指摘していただけると幸いです。
ただし、プログラミングに使いやすいことを優先しているので、意図的に都合のよい説明をピックしているのはご容赦下さい。
ふだん React を利用しているため、その方向性に偏った解説である可能性があります。
1章 命名の3大パターン
変数名・メソッド名・関数名・クラス名などの付け方は、大雑把に分ければ以下の3つのパターンに分けることが出来ます。
パターン名 | 名付ける対象 | 構文 |
---|---|---|
1. 命令 | メソッド・関数 オプション指定 |
命令文findUserById
|
2. モノ・コト・ヒト | 非Booleanの変数 *1 クラス名など |
名詞・名詞句selectedItems
|
3. 命題 | Boolean型変数 *1 *2 | 三単現の肯定文or述語file.exists
|
その他
-
4. 条件付け
- 時・条件の副詞節
onClick
- etc.
【注】
- getter/ファクトリメソッド等も含む
- Rubyは、Booleanを返すメソッドの命名規約が少し違うようです。(三単現を避けて原形を使う、is・助動詞を使わない、など)
1,2,3 (と4)それぞれのパターンの詳細を見ていきましょう。
この記事の目次を見れば全体像が思い描けるように書いているので、ぜひPC版でご覧ください。
動詞が至る所に出て来ますが、動詞の形の違いが意味を大きく左右することに注目することをオススメします。
"verb(動詞)" の語源がラテン語で「言葉」そのものを指す "verbum" であることからも、その重要性が推し量れると思います。
1. 命令(メソッド・関数に)
主に動作・アクションを指すメソッド名・関数名に使われるパターンを「命令」と呼ぶことにします。このパターンでは命令文が使われます。
1-1. 命令文と同じ構造
動詞の原形から始まって、SV, SVC, ...etcの形で後ろに様々な要素がくっついた形になります。
confirm
activateUsers
fetchUsers
1-2. レシーバ+他動詞は動作対象
レシーバ.他動詞のメソッド()
のレシーバは動作の対象を指しています。
このあたりは、「この仕事は / 私が / やりました。」のように、主格でなくても主題が先頭に来る日本語と似た感覚ですね。
(TODO: 主題優勢言語についての解説)
-
userRepository.findUserById("xx-01234")
- userRepository について、ユーザーをIDで探せ(id は "xx-01234")
-
button.activate()
- ボタンを、活性化せよ。
-
john.setName("Conan")
- ジョンについて、名前を "Conan" に設定せよ。
↓↓「Object指向」は「目的語指向」という指摘。激しく同意。
1-3. オプション指定にも用いられる
- 「〇〇するように」
- オブジェクト・要素などの生成の文脈
- 一回きりではなく継続した動作が対象
- 「~しなさい、ただし〇〇するように」
- 命令に小さな命令を加える
Boolean型の場合も含めて、オプション・引数・(React の) Prop・HTML属性・ローカル変数等に限ってこのパターンが使われます。
ユーザーが判断材料として「読み取る」「利用する」側面よりも、
ユーザがライブラリ等に「指定する」フラグとしての側面が強いからでしょうか……
-
<Badge showZero>
- 指定した場合、ゼロであっても表示する
- 「生成の文脈」
- MUI の Badgeコンポーネントの Prop
-
capture
- trueの場合、イベントをキャプチャする
- 「小さな命令」
- addEventListener() - mdn web docs
-
"exclude": ["node_modules"]
- 指定されたディレクトリを除外する
- 「小さな命令」
- typescript の 設定項目 "exclude"
1-x. 例外:変換は convert を省略する
stringToInt
toString
1-y. 例外:get/set + (形容詞)
「get + (形容詞)」「set + (形容詞)」は、普通の英語と解釈が大きく異なるので注意。
-
button.getEnabled()
- ❌ 文字通りに「enabledな状態になる」意味( SVC 文型)で使う
- "getterのprefix" としての用法に限定
- 「enabled かどうか」を返すgetterとしては使える
-
button.setEnabled(true)
- 「set(V) - "enabled"(O) - true(C)」の SVOC 文型
- 「"enabled" のフラグを true にセットする」と解釈できる。
1-z. 例外:get/create 等の省略
getterメソッド、ファクトリメソッドは get, create 等の動詞が省略されることもある。
(少なくとも表面的には)副作用なく値を返すだけなので「モノ・コト・ヒト」のパターンでOKになる。
object.hashCode()
-
List.of("Apple", "Banana", "Chocolate")
- Java, "Apple", "Banana", "Chocolate" からなる(変更不能な)Listを生成する。
-
(クラス名).of
は汎用性が高そう
-
Optional.empty()
- Java, 空のOptionalを生成する。
2. モノ・コト・ヒト(クラス名等に)
主にクラス名・モノを指す変数・フィールド名・プロパティ名に使われるパターンを「モノ・コト・ヒト」と呼ぶことにします。このパターンでは名詞句が使われます。
2-1. 名詞句
(名詞句) := (前にくる修飾語句)? + (中心的な名詞) + (後ろにくる修飾語句)?
原則的に不可算名詞を避ける
文法的な解説は「c. 名詞句と句構造」の節を参照。
例:
users
-
userId
- 名詞 "user" で修飾することもできる
-
activeUsers
- 形容詞で修飾
-
usersOnStage
- 前置詞句で修飾
-
runningProcesses
- 現在分詞で修飾 — "それが主体となる動作"・進行中・継続した状態
-
usersRemovedByAdmin
- 過去分詞で修飾 — "それを対象とする動作"・完了した状態
-
usersToRemove
- to不定詞で修飾 — "主体"/"対象"どちらもあり得る・未来の動作に向かっていくイメージ
-
Iterator
- 動詞を「〇〇するモノ」という意味の名詞に変える接尾辞 -er, -or は頻出
-
optionalValue.orElse(fallback)
- 名詞句と名詞句を等位接続詞(and, or, but など)でつないだモノもまた名詞句です。
- メソッドだけど、純粋な関数のように働くので、このパターンに入ります。
2-2. 修飾語を後置するのも可
-
startInclusive
- (その値も含む)始点
-
endExclusive
- (その値を含まない)終点
- ともに Java / IntStream.range() static メソッド の引数
-
ButtonUnstyled
- スタイルを取り除いたコンポーネント
- https://mui.com/base/react-button/
通常の英語では、名詞を修飾する時、
- 重い修飾語("on the table" 、分詞句など)は後ろ
- 軽い修飾語(形容詞1語・分詞1語など)は前
のような語順ですが、
プログラミングの命名においては、軽い修飾語であっても、副次的な情報を後ろ側に置くことがあります。
以下のような利点、使い所があると思います。
- 「主要な情報が先 + 副次的な情報が次」 という意味では理解しやすい
- ソートした時に関連性するものが近くなる
- (例: Button, ButtonUnstyled)
- 重い修飾語と一貫性を持たせたい時に便利
- (例: tasksInProgress, tasksCompleted)
2-2. 注 :動名詞 (-ing) は避ける
「ユーザーを選択する機能」に名前を付けるとき
-
usersSelection
- ❌
selectingUsers
- 名詞を修飾する現在分詞とすると「選択している(主体)ユーザーたち」とも解釈される
- ❌
usersSelecting
- 同上(後ろ置き修飾)
このように、機能に名前を付けるとき、動名詞と現在分詞はともに selecting
で2通りの解釈ができるような名前になってしまわないように気をつける必要がある。
代わりに -ion, -ence, -ment といった接尾辞で名詞化する。
動名詞と現在分詞の違いについては「b. to不定詞・分詞で形容詞に変身」の節を参照。
2-x. 例外:名詞を省略できる場合
形容詞のみで名詞を省略できます。
ただし、短い関数の中のローカル変数、かつ頻出の単語のみに限定したほうが良いです。
ただし interface 等では形容詞のみで名前を付けることが出来ます。(→次の項目)
prev
current
2-y. 例外:interfaceは名詞を省略可
interface, mixin, trait などは、「〇〇できる」、「〇〇と同じ働きをする」という意味合いで、名詞を省略した、形容詞(句)や分詞句だけの名前を付けることが多いです。
-
ArrayLike
- Arrayと同じように振る舞うオブジェクト
-
Comparable
- 比較できる型
3. 命題(Boolean型変数に)
Boolean(真偽値)型の変数名や、Boolean値を返す関数名・メソッド名に使われるパターンを「命題」と呼ぶことにします。このパターンでは平叙文または述語が使われます。
平叙文とは、命令文・疑問文・感嘆文に並ぶ文の種類で、「〇〇である/でない」と述べるだけの文です。(つまり、肯定文と否定文を合わせて平叙文となります)
(平叙文) := (主語) + (現在形の動詞or助動詞) + (それに続く語句)
(平叙文の述語) := ∅ + (現在形の動詞or助動詞) + (それに続く語句)
注 「∅」 ... ここでは「主語なし」という意味
- 助動詞(& be動詞)について、
- is は be の三単現(つまり現在形)です。
- can, should, will の三単現は、それぞれ can, should, will です。
- (「命令」パターンに is, 助動詞は出て来ないので、このパターンのみに出てきます)
- 基本的に、動作動詞 (walk, throw) ではなく、状態動詞 (be, have, exist, wear)を使います。
3-1. 平叙文
button.isActive
-
form.isSubmitting
- 現在進行形
-
item.isSelected
- 現在時制・受動態 (完了的ニュアンスあり)
-
array.contains(something)
- 一般動詞ももちろん使えます
form.hasEmptyFields
-
form.hasSent
- 現在完了(ただ、
isSent
で済まされることが多い?)
- 現在完了(ただ、
artifact.canDeploy
props.willOpenConfirmDialog
3-1-a. ローカル変数
ローカル変数の場合は、その文脈を it としてそれを省略していると考えられます。
"It is dark." 「=(今いる場所の様子は)暗いです」 みたいな構文ですね。
isActive
3-2. 述語 predicate
チェックの対象がレシーバではなく、第1引数として渡される場合もあります。
つまり、(対象) => Boolean
型の関数です。このような関数を predicate (述語) といいます。
この時は、肯定文から主語が抜かれた形になります。(こちら文法用語としても predicate と言います)
詳しくは、「d. 述部-predicate」を参照して下さい。
// 与えられた数値が偶数であればtrueを返す述語関数
const isEven = (n: number): boolean => n % 2 === 0
// isEvenを満たすものだけを抽出する
[1, 1, 2, 3, 5, 8].filter(isEven) // -> [2, 8]
3-x. 例外:疑問文の語順
isButtonEnabled
3-y. 例外:be動詞省略パターン
enabled
buttonEnabled
3-z. 例外:オプション等は「命令」と同じ
「〇〇するか否か」のような条件を渡す時、
オプション・引数・(React の Prop)・属性、ローカル変数等では、1. 「命令」と同じパターンを用いることがあります。
詳しくは、「1-3. 命令 — オプション指定にも用いられる」の項目をご確認下さい。
<Badge showZero>
"allowJs"
capture
4. 条件付け
時・条件の副詞節
時・条件の副詞句や副詞節は、関数を受け取る関数の名前や、イベントハンドラを登録するインターフェースとして使われることがあります。
ただ、主語・be動詞は頻繁に省略されますし、実在しない副詞句(節)もどきも多いので、そういうパターンだと思いましょう。
-
ifPresent(fn)
- 空じゃないなら、渡された関数を実行する
- Java ドキュメンテーション - Optionalクラス
-
beforeSubmit
- 送信(submit)の直前に呼ばれるイベントハンドラを登録する時に使われる。
-
onClick
- イベントハンドラを登録するために頻出 (Reactなど)
-
On も、After, Before と同じように、条件の副詞節を作る
- 普通の英語には無い用法
events.on("eventType", ..)
-
events.off("eventType", ..)
- on <--> off の対比
- イベントハンドラを登録解除するメソッド
2章 文法用語の補足
句?二人称単数現在?分詞?なんだよそれ? 英語なのに述語があるのか?
という疑問文が頭に浮かんだ方もいらっしゃると思うので、一つ一つ解説していきましょう。
a. 原形・現在形・進行形と時制
原形 ≠ 現在形, 三単現 ∈ 現在形
一般動詞だけを見れば原形と現在形(三単現以外)は同じ形をしているので分かりにくいですが、
be動詞を見るとわかるように、原形と現在形は別のモノです。
(一般動詞では同じ形に合流してしまっただけです。)
そして、三単現は、"三人称単数現在形" の略称であることから分かるように、現在形の一種です。
make の活用 (現在のみ)
一人称 | 二人称 | 三人称 | |
---|---|---|---|
単数 | make | make | makes |
複数 | make | make | make |
be の活用 (現在のみ)
一人称 | 二人称 | 三人称 | |
---|---|---|---|
単数 | am | are | is |
複数 | are | are | are |
動詞の活用と英語の文構造は切っても切り離せない関係なので、「d-2.英語の述部」の節も見て下さい。
b. to不定詞・分詞で形容詞に変身
分詞は、現在分詞と過去分詞の総称です。
動詞でありながら動詞以外の働きをするときの形を準動詞といい、以下の3つがあります。
- 不定詞 ... 形容詞や副詞として働く
- to不定詞 ( tasks to do )
- 原型不定詞 ( I'll let you know )
- 分詞 ... 形容詞や副詞として働く
- 現在分詞 (running process)
- 過去分詞 (selected items)
- 動名詞 ... 名詞として働く (You should stop smoking here)
動名詞は現在分詞と同じ形で紛らわしいので、名詞句の主要部(後述)を表すのには使わず、動詞や前置詞の目的語として使われるのがほとんどだと思います。
次の章のテーマが「名詞を修飾する」ことなので、不定詞や分詞が名詞を修飾している例を挙げます。
- to不定詞の形容詞的用法
- users to register
- = 登録するべきユーザーたち
- 過去分詞による修飾(それを対象とした動作・時間的には完了した状態のイメージ)
- selected items
- = 選択された項目たち
- 現在分詞による修飾(それが主体となる動作・時間的には現状を説明するイメージ)
- running processes
- = 稼働中のプロセスたち
c. 名詞句と句構造
c-1. 句構造
まず、句構造とは何でしょう?
Tjo3ya - 投稿者自身による著作物, CC 表示-継承 3.0, リンクによる
「句」とは、中心になる単語(主要部, head)と、その前後に置かれる修飾語句からなるユニットです。
上の図の左側が、句構造文法を表しています。 (どことなくASTと似てますね。)
- 名詞句 (図中の NP )
- 名詞を主要部とした、名詞と等価な働きをする句
- 動詞句 (図中の VP )
- 動詞を主要部とした、動詞と等価な働きをする句
数式の中で、(a + b)
を 新しい未知数 X
を使って置き換えても意味が崩れなかったのと同様に、名詞句はit, he, she, theyに、動詞句はdo, be動詞, 助動詞 にそれぞれ置き換えても構文として成り立ちます。
例:
The robot I bought yesterday can lift up my dumbbells.
(私が昨日買ったロボットは、私の鉄アレイを持ち上げることが出来ます)
→ It can lift up them.You can make this website over with React from scratch, right?
(あなた、このウェブサイトをゼロからReactで作り直せるんですね?)
— Yes, I can.
(はい。出来ます。)
c-2. 名詞句
では、具体的に、名詞を修飾して名詞句を作ることのできる修飾語とはどういったものでしょうか?
以下がそのリストになります。(プログラミングで頻出のものは太字で強調しています。)
- 限定詞 - 冠詞・所有限定詞・数量詞など。英語では、the、this、my、someなど、(以下略)
- 形容詞(限定用法) - 英語では、large、beautiful、sweeterなど。(以下略)
- 形容詞句 - extremely large(とても大きい)、hard as nails(釘のように硬い)など、形容詞句の内部に、その主要部である形容詞を修飾する語句が含まれている。
- 分詞句 - made of wood(木でできている)、sitting on the step(段の上に座っている)など、英語では過去分詞または現在分詞が主要部になっている句。
- 修飾名詞(英語版) - a college studentという名詞句におけるcollegeなど、名詞が名詞を修飾する。
- 接置詞句 - 英語ではin the drawing room、of his auntなどの前置詞句、(以下略)
- 関係節 - 英語ではwhich we noticedなど。
- that節など、名詞を補う節 - 英語では、the belief that God exists(神が存在するという信念)という名詞句におけるthat God exists(神が存在するという)など。
- 不定詞句(to句) - a desire to sing wellという名詞句におけるto sing well、the man to beatという名詞句におけるto beatなど。
引用元:https://ja.wikipedia.org/wiki/%E5%90%8D%E8%A9%9E%E5%8F%A5
強調は筆者による
これらの語が主要部の名詞を前後から修飾します。
selected
や、invalid
のような軽い修飾語は名詞の前に、to delete
のように、重い修飾語は名詞の後ろに置かれます。
(命名規約や文化によっては、軽い修飾語も敢えて後ろに置くことが認められるかも知れません。)
また、例外的なパターンとして、 the + 形容詞 パターンなども名詞句に含まれます。
プログラミングにおいては、値を更新する短い関数の中の一時変数などで、現在の値をcurrent
、一つ前の値をprev
(previous) と書くのに似ています。boolean型の変数とややこしいので、このように限定された場合のみ使われます。
d. 述部 (predicate)
d-1. 国語文法のおさらい
国語文法で「述語」「述部」を習ったと思います。
この [家は] / ドアが [重い]。
私が きのう 買った [家は] / ドアが [重い]。
という文について、スラッシュの左側が "主部"で、右側が"述部" というやつです。 (そして、「ドアが」-「重い」も 主語-述語 の関係です)
いやいや日本語には主語なんてなくて「は」は主題を表していて...
という話は一旦横に置かせてください。
d-2. 英語の述部
英語にも、同様の構造があります。
By Tjo3ya - , CC BY-SA 3.0, Link
つまり、(一つの節からなる)文は、大きな名詞句と動詞句に二分することができ、前者を 主部/subject 後者を 述部/predicate と呼ぶ、ということです。
ちなみに、進行形(be動詞 + 現在分詞(-ing))、受動態(be動詞 + 過去分詞(-ed))や、完了形(have + 過去分詞)など、あるいは助動詞が入り混じっている場合は、それらのうち最初に登場するものが定動詞(句の中心になる動詞) になります。
主語の人称・単/複・時制によって形が変わるのは定動詞、それ以外の動詞は原形または準動詞になります。(英語圏ではまとめて「infinite verb」と呼ぶようです。原形と原形不定詞の区別がないので。)
だから、
- "He is running." の "is" が三単現、"running" は現在分詞
- "She can run." の "can" も、実は三単現です。"run" は原形