英語できない人が変数名の命名を完璧にできるようになる方法を教えようと思ったけどめんどくさくて途中で投げ出すも結構長々といいこと書いてる記事
はじめに
クソな変数名をつける作業から脱却しよう。
↓まず下の名前を見て何をおもうだろうか
userNameRetrieveThis
吐き気を催したなら正常。そうでない人の全員英語レベルはちりめんじゃこレベルなので、この記事を読む価値があると思う。
まずぶっちゃけ話をすると、ほとんどすべてのプログラミング言語は、英語が使える人向けに作られている。なのでそもそもほとんどすべての概念が日本人向けではない。
話は少し横道にそれるけど、たとえばロードバランサーの話をしよう。ロードバランサーというのをはじめて聞いた日本人は、まず「ロード→道」と「バランサー→バランス取るマン」というふうに思い浮かべて、以下のようなイメージを抱くのではないだろうか。そんなことない?そんなことなくても読み進めてよ。
実際にはload balancer
と書くのだけど、じゃあこのloadというのは何かというと「積み荷」のことである。balancerとは「振り分けマン」のことである。つまり「積み荷振り分けマン」と言っているわけ。積み荷っていうのは要はデータのこと。
いろいろ渡されてくる積み荷を各担当の人に振り分けてくれるおじさんみたいな存在のことを、ロードバランサーという
※マスクをバランスしてくれたおじさんの図(政治的な意図はないです)
ロードバランサーにやってくるデータにはpayload(ペイロード)がある(厳密にいうとちがうけど)
ペイロードと言われると日本人はこう思うはずだ。
ちゃうねん。payloadっていうのは「トラックの積み荷」のことやねん。たとえばHTTPヘッダとかを取り除いた部分をトラックの積み荷に見立ててるわけ。
↓この袋ぜんぶがpayloadみたいな。
ほかにも、upload(荷物を上にあげる) / download(荷物を下におろす) / reload(荷物をもっかいもらう)/ workload(作業量)みたいなのがある。な〜んだ。インターネットというのは、たくさんのトラックが走っているだけだったんですね。
だからTraffic(交通量 / 運輸量)とかAddress(住所)とかPort(港)とか、Internet Gateway(インターネットの出入り口)とかTurn Around Time(往復時間)とかRouter(ルート決めるマン)とか言うんすね。ほーん。
とまあ、こんな感じの英語圏のアナロジーがつながってプログラミング言語もできている。そういうわけで、日本語的な英語をここに突撃させるとどうあがいてもカオスな感じになってしまう。
この記事は、そのへんをなんとかするための記事です。
きさまは品詞分解できているのか??
品詞分解の重要性を知らない人間は英語ができない人間である。
まず変数名うんぬんの前に、かんたんな英文を読む方法を知ってほしいので、品詞分解の重要性をさらっとおさらいしてしまいたい。
たとえば I like an apple.
はみんな「自分は読める」と思っている。しかし本当に読めているのだろうか。ぐうぜん合ってるだけじゃないだろうか。
He says that I like that apple.
はどうだろうか。もしこれが読めない場合や「たぶんこうなんじゃないか…?」と思った場合は、まず間違いなく英語の読み方をまともに習ってこなかったといえる。誰に言われるでもなく「絶対にこういう意味である」と確信できなければならないのだ!!!
ちなみにここで答えを言うと「あー、そうだった、そうだった。そういう意味か。惜しかった」と思われる可能性があるので、答えは載せないでおく。それはじつは全然惜しくなくて、大大ハズレなのだ。
英文を読むときのコツは、まず動詞を探すことである。
動詞というのは、ほかの語に働きかける語のことである。
He says that I like that apple.
を1つ1つパースしていくと、Heはこの形では動詞になりえないので違う。主語候補として頭の片隅に置いておく。そしてsaysにたどり着く。これで動詞が決まった。これによって、あとについてるやつはなんかオマケみたいなもんだということがわかる。
↓なのでこれもおなじ。彼は何かよくわかんないけど何か言ってるんすね。
He says that interrogating officers whose banana is impotent solidly replenished translucent cricket wardrobes along with a you-know-what person.
なんでそういうことがわかるかというと、英文は語順で語と語の関係性が決まるというルールだから。「なんで?」って言われてもそういうふうに英語がなっちゃったから仕方ない。日本語はその点語順から自由で、その代わり「は」とか「が」とか「の」とか「を」とかが入る。
好きだ私はりんごが、友達のあなたよりも
みたいに言える。素敵だ。でも英語はそんなの関係ない。語順が大事なんだ。like I an apple, a friend you than
だと意味不明になる。
基本となる語順が基本文型と言われる。どんなに難しい英文でもこの基本文型をもとにして作られる(※ただし「倒置」という語順を入れ替えて感情を表現するテクニックがあるので、一見語順が重要そうに見えないパターンがある)
だから文法と品詞分解を習う必要があったんですね。
品詞分解するだ
品詞分解というと何か高尚なことをやっているっぽく聞こえるけど、要は文の構成要素を分割するだけのことである。実際にやってみよう。(読むのがたいへんだとおもうので、たいへんなことをやらないと読めないのだということさえわかってもらえればいいです。慣れると自動的に脳が処理してくれるようになるので一瞬でできます。全然慣れない?慣れるまでやれば慣れます)
この文を品詞分解していくぞ。
He says that interrogating officers whose banana is impotent solidly replenished translucent cricket wardrobes along with a you-know-what person.
上記の文の動詞はsaysだったので、「that〜person.」までは目的語として扱える。なぜならsaysのあとは目的語が来るはずだから。なぜかというと、saysが他動詞だから。なぜsaysが他動詞かというと、saysが自動詞だとするとその次に副詞や前置詞が来なければならないがそうではなくthatが来ているから。だからこのthatはthat節か、形容詞のthat(あの○○)になる。ただしofficersが続くため、形容詞だとするならthoseが来るべきなので、that節に決まる。したがって次のように訳せる。
He says / that interrogating officers whose banana is impotent solidly replenished translucent cricket wardrobes along with a you-know-what person.
→ 彼はinterrogating officers whose banana is impotent solidly replenished translucent cricket wardrobes along with a you-know-what personと言う
「節」というのは、文を持っているカタマリで、つまり下の文は文になっていて、動詞がかならず存在する。存在しない場合はなんか読み間違えているのである。
動詞を探してみよう。これは実は難しくて、語彙力も問われる。officerが動詞だとすると「interrogatingがofficerする」となるが、残念ながら今回はwhoseがあるので違う。同様にwhose bananaのあとのisも、interrogating officers whose banana IS impotent.
となることはない。なぜならそうするとwhose bananaだけがofficersと絡む語となって、officersを正しく説明できてなくて尻切れトンボになるから。なのでreplenishedが候補に上がる。このreplenishedは動詞として良さそうだ。したがって、
interrogating officers whose banana is impotent solidly replenished translucent cricket wardrobes along with a you-know-what person.
→ interrogating officers whose banana is impotentは、solidlyにtranslucent cricket wardrobes along with a you-know-what personをreplenishedした。
となる。
説明がめんどくさくなってきた。
まあこんな感じで、最終的に
彼は、その人のバナナがインポである尋問する警察官たちがしっかりと半透明のクリケットの衣装ダンスを例のあの人と一緒に再補充したと言う。
と訳すことができる。
Google翻訳くんもなかなか正しく理解できてくれているようだ。
語順!変えてみる!
さきほどの、solidlyの場所を変えてみるとどうなるだろうか。solidlyをimpotentの前に持ってくると、いままでreplenishedにかかっていたsolidlyが、今度はimpotentにかかってくるのである。
それによって、いままでは「しっかり再補充した」と言っていたのが「しっかり無力(インポ)」になってしまったのだ。これはどえらい違いである。つまり!品詞、語順というのはしぬほど大事なのである。
変数名について
話が長くなってしまったけど、重要なのはおちんちんの話ではない。
そう、えーと、なんの話だったか……そう、変数名のことである。
ジャパニーズの大半は品詞が全然わかってないのである。なので、わけのわからない変数名をつけたがる。日本語のよくある語順と、知っている単語を並べてつくっているのだ。なので、動詞であるべきところが名詞になっていたり、名詞になるべきところが動詞になっていたりすることが多い。
たとえば「アルミ缶の上にあるミカン」というオブジェクトがあったとする。
そういうときは、mikansOnAluminumCan
と書いてほしいのだ。
これがAluminumCanMikanOn
とかになっていることがある。なんのことかわからない。「アルミはミカンオンできる!」になってしまう。こんなことなら ArumikanNoUeniAruMikan
の方が1億倍わかりやすい。
これは「ミカン、Can、オン、アルミ」と言われている状態に近い。なぞなぞか。
ごまかすな
まず、変数名をうまくつけられないことはしかたがない。なにせ難しいことだし、あまり時間もかけてられない。
だからなんか適当な感じになるのもわかる。
でもまず、適当な感じになったのにあたかも「わたしは正当な変数名です」のような顔をさせてコミットするのは良くない。
「変数名のつけかたがよくわからなかったけど、本当は日本語でこういうことが言いたかったんだよ」という言い訳をせめて書いてほしい。
userNameRetrieveThis
も、これが悪いというよりかは、たとえば、
// ユーザー名(userName)と会社名(companyName)を渡して、
// そのユーザーが最後に会社に来たのは何日前かを返す。
// 例: userNameRetrieveThis('Sonoda Tatsuo', 'Company XYZ') -> 1
function userNameRetrieveThis(userName, companyName) { }
みたいに書いてあればかなりマシになる。ほとんどの場合、意味不明な英文に加えて、意味不明な中身になっていて、そしてデバッグした結果「どうもこういうことをしているらしい……?わかんねーけど」となってしまう。そしてそれをわかんないまま放置して、いずれ誰も何もわからないコードになってしまう。そして伝説へ……
メソッド・関数の名前には動詞をつけるべし
メソッドや関数の名前には動詞をつけるのが正しい。なぜかというと関数は動きを表現するからだ。
たとえば「〜を投げる(throw)」「〜と戦う(fight)」「〜を殴る(hit)」「〜に登る(climb)」のどれも動きを表現している。
たとえば、「お湯をそそいで3分間待ったらカップ麺を食べる」というのは次のように書くべし。このように書くことで、とても直観的で見通しがいいコードになる。(※awaitがどうたらは置いておいて)
const ramen = takeoutRamen()
pourInto(ramen, boil(water)).then((hotRamen) => {
setTimeout(() => eat(hotRamen), 1000 * 60 * 3)
})
↓よく見かけるのはこういう感じのやつで、読むのが異様につらい。なにせ読まなければいけないのだから。
const ramen = getRamen()
result(ramen, hotWater(water)).then((hotRamen) => {
setTimeout(() => eat(hotRamen), 1000 * 60 * 3)
})
たとえばresult(ramen, hotWater(water))
の部分を読み解かないといけなくなる。hotWaterは、waterを引数にとって、hotWater
に関することらしいことをしているし、resultにいたっては「お湯をそそぐのだよ」というのは絶対にわからなくなってしまっている。
英語力の差なのかもしれないが、せめてこのようにすると急激にわかりやすくなる
// ラーメンをテイクアウトする関数(FIXME: 命名)
const getRamen = () => { ... }
const ramen = getRamen()
makeResult(ramen, createHotWater(water)).then((hotRamen) => {
setTimeout(() => eat(hotRamen), 1000 * 60 * 3)
})
いいから動詞にするんだ!
オブジェクトは名詞にするべし
オブジェクトというか、関数でないものには名詞をつけるべし。「メソッドだけど実質プロパティ!」みたいなやつには名詞をつけてもいい。
「名詞+名詞」で複合名詞にできることもあるけど、基本的には「名詞」「形容詞+名詞」などで変数名をつけるとありがたみが増す。
それから複数形にするととてもわかりやすくなる。
const patients = [{
name: 'Tanaka',
}, {
name: 'Suzuki',
}]
patientNames = patients.map(patient => patient.name)
const loyalCustomers = [ ... ]
const eneosMakingEnergyWonderful = {}
class MainComponentSupplier {
}
ほんとうは長々と語りたかったけど、自分が思っていたよりも長文になってしまったのでやめた。
まとめ
「名詞にする」「動詞にする」というのだけ注意してコードを書くと、とてもわかりやすくなる。
自分は(自分の書いた部分に関しては)命名でどういう挙動になるのかがあきらかなのでほぼ中身は読んでいない。
読み手に、関数やオブジェクトの中身を読ませるコードではなく、「名前だけ見れば全部わかるよ」というようなコードになっていると、とても助かります。
まあぶっちゃけ日本語で書いてある方がわかりやすいことも多いので、日本語で書いてあるコードが増えてくれることをねがっています。
Discussion