Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9691

Roslynと複数形の不規則変化

$
0
0

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]をもとにした。なお、このリストは外来複数形のものなので英語の古い形に由来する不規則変化は載っていない。

正しく不規則変化されたもの

単数形複数形意味サジェスト
bacillusbacilliバチルス菌bacilli
stimulusstimuli刺激stimuli
algaalgaealgae
alumnaalumnae女子卒業生alumnae
larvalarvae幼虫larvae
addendumappenda付録appenda
bacteriumbacteriaバクテリアbacteria
datumdataデータdata
erratumerrata誤植errata
codexcodices古写本codices
analysisanalyses分析analyses
axisaxesaxes
basisbases理論的基礎bases
oasisoasesオアシスoases
parenthesisparentheses丸かっこparentheses
synopsissynopses概要synopses
synthesissyntheses総合,合成syntheses
criterioncriteria判断の基準criteria
phenomenonphenomena現象phenomena
corpscorps(単複同形)corps
rendezvousrendezvous(単複同形)約束による会合rendezvous

使用頻度の低そうな語にも対応していることに驚かされる。

規則変化と不規則変化両方がある単語

不規則変化が採用されたもの

単数形複数形意味サジェスト
cactuscacti, cactusesサボテンcacti
radiusradii, radiuses半径radii
syllabussyllabi, syllabuses教授細目syllabi
vertebravertebrae, vertebras脊椎vertebrae
aquariumaquaria, aquariums水族館aquaria
curriculumcurricula, curriculums教育課程curricula
memorandummemoranda, memorandumsメモmemoranda
symposiumsymposia, symposiumsシンポジウムsymposia
apexapices, apexes頂点apices
indexindices, indexes指標indices
matrixmatrices, matrixes行列matrices

サボテンが登場するコードでも安心だ。

規則変化が採用されたもの

単数形複数形意味サジェスト
antennaantennae, antennasantennae (触覚), antennas (アンテナ)antennas
formulaformulae, formulas公式formulas
nebulanebulae, nebulas星雲nebulas
spectrumspectra, spectrumsスペクトルspectrums
automatonautomata, automatons自動装置,ロボットautomatons
ganglionganglia, ganglions神経節ganglions
bureaubureaux, bureaus事務局bureaus
plateauplateaux, plateaus高原plateaus
tableautableaux, tableaustableaus
librettolibretti, librettos脚本librettos
tempotempi, temposテンポtempos
virtuosovirtuosi, virtuosos巨匠virtuosos

フランス語・イタリア語由来の語はどれも規則変化が採用されているようだが理由があるのだろうか?

誤って活用されたもの

単数形のままcamelCaseにされたもの

単数形複数形意味サジェスト
esophagusesophagi食堂esophagus
cirruscirri, cirruses巻雲cirrus
geniusgenii,geniusesgenii (守護神),geniuses (天才)genius
nimbusnimbi, nimbuses乱雲nimbus
corpuscorpora, corpuses集大成,言語資料corpus
genusgenera, genusesgenus

corpusやgenusなどは使いどころも多そう(少なくともalumnaよりはコード中に出てくるだろう)なのに誤った形が提案されている。
どの語も末尾がsで終わっていることから考えるとRoslynが単数形を規則変化の複数形と誤認している疑いがある。そうだとすると「正しく不規則変化されたもの」に挙げたcorpsやrendezvousも単複同形だったためたまたま正しい結果が出ただけで、Roslyn側は謝って複数形の名詞と解釈しているのかもしれない。実際、型名が複数形だと

//型名Booksは複数形だと判断しているらしいprivateBooks[]books;//型名Childrenは複数形ではないと判断している?privateChildren[]childrens;

のような提案がなされるためだ。

存在しない複数形が提案されたもの

単数形複数形意味サジェスト
chassischassis(単複同形)自動車の車台,シャシーchasses

これは不思議なパターンだ。本来存在しないはずの不規則変化の複数形*chassesがサジェストされている。(Weblioではハイパー英語辞書がこの形をchassisの複数形としているが、他の辞書による裏付けがないので疑わしい。もしOEDをお持ちの方がいたらこの形が載っているか調べていただきたい。自分でやればいいのだが図書館が閉館中なので調べにいけない……)

実装

RoslynのDeclarationNameCompletionProvider.csがこれらの処理に対応する実装のはず。
ただ肝心の名詞リスト(おそらく単数形から複数形を引ける辞書のようなものがあるはず)を見つけられていない。

まとめ

Roslynの変数名サジェスト機能は不規則変化する名詞にそれなりに対応しているが、漏れもあるので過信してはいけない。
規則変化と不規則変化どちらの複数形もある名詞に対しては一方の形にしか対応できていないと思われるが、どちらの形の複数形を採用するかの方針はよくわからない。


Viewing all articles
Browse latest Browse all 9691

Trending Articles