C#の命名規則
C#ではMicrosoftの指針(識別子名 | Microsoft Docsや大文字の仕様規則)に従って名前を付けることが多い。
今回の話題に関わる点だけ挙げると
- 型名はPascalCase
- 変数名はcamelCase
という規則は一般に使われていると思う。
変数名サジェスト
C#で開発しているとVisualStudioでもVSCode&OmniSharpでもRoslynによる優秀なインテリセンスが使用できる。
このインテリセンスには型名から変数名を提案する機能があり、変数名としてその変数の型名をPascalCaseからcamelCaseに変換したもの、あるいは型名をPascalCaseに従って分離したうえで一部を取り出してcamelCaseにしたものを提案してくれる。
具体的には以下のような提案が現れる。
//型名はPascalCaseclassSpecialRapidServiceTrain{}//この型の変数名として//型名のPascalCaseをcamelCaseに変換したものprivateSpecialRapidServiceTrainspecialRapidServiceTrain;//型名から一部を取り出してcamelCaseにしたものprivateSpecialRapidServiceTrainrapidServiceTrain;privateSpecialRapidServiceTrainserviceTrain;privateSpecialRapidServiceTraintrain;privateSpecialRapidServiceTrainspecial;privateSpecialRapidServiceTrainspecialRapid;privateSpecialRapidServiceTrainspecialRapidService;//が提案されるまたこの機能はある型のコレクションに対しては型名の複数名のcamelCase、あるいは変数名と同様に型名の一部を複数形にしたcamelCaseを提案する。
//型名を複数形のcamelCaseに変換したものprivateSpecialRapidServiceTrain[]specialRapidServiceTrains;//型名を分離した上で一部を取り出して複数形のcamelCaseにしたものprivateSpecialRapidServiceTrain[]rapidServiceTrains;privateSpecialRapidServiceTrain[]serviceTrains;privateSpecialRapidServiceTrain[]trains;privateSpecialRapidServiceTrain[]specials;privateSpecialRapidServiceTrain[]specialRapids;privateSpecialRapidServiceTrain[]specialRapidServices;//が提案される。本題 : 不規則変化の名詞
ここからが本題。実はこの機能は不規則変化する名詞の複数形にも対応している。
分かりやすいところで言うと次のようなものがある。
//型SmallChildのコレクションに対して……privateSmallChild[]smallChildren;//型LegalPersonのコレクションに対して……privateLegalPerson[]legalPeople;じゃあこれはいったいどのくらいの不規則変化名詞に対応しているのか?
以下、不規則変化する名詞一単語からなる型名のコレクションに対してどのような変数名がサジェストされたかをまとめる。
英単語のリストは#3586. 外来複数形[plural][latin][greek][french][italian]をもとにした。なお、このリストは外来複数形のものなので英語の古い形に由来する不規則変化は載っていない。
正しく不規則変化されたもの
| 単数形 | 複数形 | 意味 | サジェスト |
|---|---|---|---|
| bacillus | bacilli | バチルス菌 | bacilli |
| stimulus | stimuli | 刺激 | stimuli |
| alga | algae | 藻 | algae |
| alumna | alumnae | 女子卒業生 | alumnae |
| larva | larvae | 幼虫 | larvae |
| addendum | appenda | 付録 | appenda |
| bacterium | bacteria | バクテリア | bacteria |
| datum | data | データ | data |
| erratum | errata | 誤植 | errata |
| codex | codices | 古写本 | codices |
| analysis | analyses | 分析 | analyses |
| axis | axes | 軸 | axes |
| basis | bases | 理論的基礎 | bases |
| oasis | oases | オアシス | oases |
| parenthesis | parentheses | 丸かっこ | parentheses |
| synopsis | synopses | 概要 | synopses |
| synthesis | syntheses | 総合,合成 | syntheses |
| criterion | criteria | 判断の基準 | criteria |
| phenomenon | phenomena | 現象 | phenomena |
| corps | corps(単複同形) | 団 | corps |
| rendezvous | rendezvous(単複同形) | 約束による会合 | rendezvous |
使用頻度の低そうな語にも対応していることに驚かされる。
規則変化と不規則変化両方がある単語
不規則変化が採用されたもの
| 単数形 | 複数形 | 意味 | サジェスト |
|---|---|---|---|
| cactus | cacti, cactuses | サボテン | cacti |
| radius | radii, radiuses | 半径 | radii |
| syllabus | syllabi, syllabuses | 教授細目 | syllabi |
| vertebra | vertebrae, vertebras | 脊椎 | vertebrae |
| aquarium | aquaria, aquariums | 水族館 | aquaria |
| curriculum | curricula, curriculums | 教育課程 | curricula |
| memorandum | memoranda, memorandums | メモ | memoranda |
| symposium | symposia, symposiums | シンポジウム | symposia |
| apex | apices, apexes | 頂点 | apices |
| index | indices, indexes | 指標 | indices |
| matrix | matrices, matrixes | 行列 | matrices |
サボテンが登場するコードでも安心だ。
規則変化が採用されたもの
| 単数形 | 複数形 | 意味 | サジェスト |
|---|---|---|---|
| antenna | antennae, antennas | antennae (触覚), antennas (アンテナ) | antennas |
| formula | formulae, formulas | 公式 | formulas |
| nebula | nebulae, nebulas | 星雲 | nebulas |
| spectrum | spectra, spectrums | スペクトル | spectrums |
| automaton | automata, automatons | 自動装置,ロボット | automatons |
| ganglion | ganglia, ganglions | 神経節 | ganglions |
| bureau | bureaux, bureaus | 事務局 | bureaus |
| plateau | plateaux, plateaus | 高原 | plateaus |
| tableau | tableaux, tableaus | 絵 | tableaus |
| libretto | libretti, librettos | 脚本 | librettos |
| tempo | tempi, tempos | テンポ | tempos |
| virtuoso | virtuosi, virtuosos | 巨匠 | virtuosos |
フランス語・イタリア語由来の語はどれも規則変化が採用されているようだが理由があるのだろうか?
誤って活用されたもの
単数形のままcamelCaseにされたもの
| 単数形 | 複数形 | 意味 | サジェスト |
|---|---|---|---|
| esophagus | esophagi | 食堂 | esophagus |
| cirrus | cirri, cirruses | 巻雲 | cirrus |
| genius | genii,geniuses | genii (守護神),geniuses (天才) | genius |
| nimbus | nimbi, nimbuses | 乱雲 | nimbus |
| corpus | corpora, corpuses | 集大成,言語資料 | corpus |
| genus | genera, genuses | 属 | genus |
corpusやgenusなどは使いどころも多そう(少なくともalumnaよりはコード中に出てくるだろう)なのに誤った形が提案されている。
どの語も末尾がsで終わっていることから考えるとRoslynが単数形を規則変化の複数形と誤認している疑いがある。そうだとすると「正しく不規則変化されたもの」に挙げたcorpsやrendezvousも単複同形だったためたまたま正しい結果が出ただけで、Roslyn側は謝って複数形の名詞と解釈しているのかもしれない。実際、型名が複数形だと
//型名Booksは複数形だと判断しているらしいprivateBooks[]books;//型名Childrenは複数形ではないと判断している?privateChildren[]childrens;のような提案がなされるためだ。
存在しない複数形が提案されたもの
| 単数形 | 複数形 | 意味 | サジェスト |
|---|---|---|---|
| chassis | chassis(単複同形) | 自動車の車台,シャシー | chasses |
これは不思議なパターンだ。本来存在しないはずの不規則変化の複数形*chassesがサジェストされている。(Weblioではハイパー英語辞書がこの形をchassisの複数形としているが、他の辞書による裏付けがないので疑わしい。もしOEDをお持ちの方がいたらこの形が載っているか調べていただきたい。自分でやればいいのだが図書館が閉館中なので調べにいけない……)
実装
RoslynのDeclarationNameCompletionProvider.csがこれらの処理に対応する実装のはず。
ただ肝心の名詞リスト(おそらく単数形から複数形を引ける辞書のようなものがあるはず)を見つけられていない。
まとめ
Roslynの変数名サジェスト機能は不規則変化する名詞にそれなりに対応しているが、漏れもあるので過信してはいけない。
規則変化と不規則変化どちらの複数形もある名詞に対しては一方の形にしか対応できていないと思われるが、どちらの形の複数形を採用するかの方針はよくわからない。