「getHTTPResponseCode」をスネークケースに、よく見かける書き方は10言語中9言語で崩れた ― よく使う書き方を10言語で③

C#
B!

データベースの列名 user_id と JSON のキー userId を行き来させる。API を書いていると、どこかで必ず出てくる変換です。ネットでよく紹介される書き方を10言語で用意して、getHTTPResponseCode を get_http_response_code に変えさせました。

正しく変えられたのは、10言語中 Ruby の1言語だけでした。

何をしたか

CODE Polyglot の「よく使う書き方」 で、単語の切れ目の決まりを先に決めました(正解表14件)。

  • 小文字か数字のあとの大文字(user|Id)は切れ目
  • 大文字が続いたあと、次が小文字になる大文字(HTTP|Server)も切れ目

よく見かける書き方は10言語で用意しました。毎朝の検証と同じ Linux の環境で動かしています。

大文字が続くと、ばらけるか、くっつく

よくある書き方は、だいたい次の2つのどちらかです。

re.sub(r"(?<!^)(?=[A-Z])", "_", s).lower()     # 大文字の前に必ず _ を入れる
regexp.MustCompile(`([a-z0-9])([A-Z])`).ReplaceAllString(s, "${1}_${2}")  // 小文字のあとの大文字だけ

getHTTPResponseCode(c003)の結果です。

書き方出力
決まりget_http_response_code
大文字の前に必ず _(Python・PHP・C#・Rust・Swift・JS)get_h_t_t_p_response_code
小文字のあとの大文字だけ(Go・Java・Kotlin)get_httpresponse_code
Ruby(Rails の underscore と同じ2本の置き換え)get_http_response_code(一致)

HTTPServer(c002)も同じ10言語中9言語が崩れました。userID(c004)は、10言語中6言語が user_i_d にしました。

逆向きでは「先頭だけ大文字」の関数の差が出る

MAX_RETRY_COUNT を maxRetryCount に変える(c009)と、10言語中9言語が崩れました。この向きで通ったのは Java だけです。原因は、先頭だけ大文字にする関数が、残りの文字をどう扱うかの違いです。

関数RETRY が出力の例
Python の title・Ruby の capitalizeRetry(残りを小文字に)最初の部分を小文字にし忘れると MAXRetryCount
PHP の ucwords、Kotlin の replaceFirstCharRETRY(残りはそのまま)mAXRETRYCOUNT
C# の TextInfo.ToTitleCaseRETRY(全部大文字の単語は略語とみなして残す)mAXRETRYCOUNT

「英数字だけ」の確かめ方が、日本語を通す

入力が半角の英数字と _ だけかを \w で確かめると、userなまえ(c013)を通してしまう言語があります。Python・C# の \w、Rust の is_alphanumeric()、Swift の CharacterSet.alphanumerics は、ひらがなも「文字」として扱うからです。チェックを書かなかった言語も含めて、10言語中8言語がこの入力を変換しました。

どう書いたか

切れ目を2種類に分けて、それぞれに _ を入れました。Python ならこうです。

if not re.fullmatch(r"[A-Za-z0-9_]*", s):
    print("NG: 半角の英数字と _ だけにしてください")
elif mode == "snake":
    s = re.sub(r"(?<=[a-z0-9])(?=[A-Z])", "_", s)   # 小文字か数字の次の大文字(userId)
    s = re.sub(r"(?<=[A-Z])(?=[A-Z][a-z])", "_", s)  # 大文字の続きの最後(HTTP|Server)
    print(s.lower())

Go の正規表現には後読み・先読みが無く、Rust には標準の正規表現がありません。そのため、この2言語と Swift は1文字ずつ前後を見る形で書いています。Java は toLowerCase(Locale.ROOT)、C# は ToLowerInvariant() を使いました。動かす場所の言語の設定がトルコ語だと、I が点のない ı になるからです。10言語のコードは、どれも14件すべてで決まりどおりの答えを出しています。

まとめ

  • HTTPServer のように大文字が続く名前で、よく見かける書き方は崩れる(10言語中9言語)
  • 「先頭だけ大文字」の関数は、残りの文字を小文字にするかどうかが言語で違う
  • 使ってよい文字は \w ではなく [A-Za-z0-9_] と書いて決める

10言語のコードと全14件の結果は CODE Polyglot「スネークケースとキャメルケースを変換する」 にあります。

連載「よく使う書き方を10言語で」(全6回)
  1. 第1回:HTML のエスケープ、標準の関数の答えが言語ごとに違った
  2. 第2回:「2026-02-30T09:00:00Z」を、4言語の標準のパーサーが3月2日として読んだ
  3. 第3回:「getHTTPResponseCode」をスネークケースに、よく見かける書き方は10言語中9言語で崩れた(この記事)
  4. 第4回:アクセスログを空白で区切って集計したら、10言語すべてが壊れた行を数えた
  5. 第5回:重複を消したら順番が変わった、Swift は「が」を1つにまとめた
  6. 第6回:İstanbul の slug が5通りに割れた、日本語のタイトルはそのまま URL に入った
B!
← 一覧へ戻る