2019年6月23日日曜日

Web APIのパラメーターはキャメルケース?スネークケース?

…という話を先日社内でしました。

https://example.com/api/search?user_id=1
https://example.com/api/search?userId=1

↑どっちを使う?という話です。

個人的には、GET/PUT/POST含めて統一さえされていればどっちでもいいんですが、それで終わってはつまらないのでちょっと語ってみます。

もう一度いいますが、個人的にはぶっちゃけどっちでもいいです

記法の種類

識別子の記法として考えられるのは、ざっとこんなかんじでしょうか。
  • lower_snake_case
    • C/C++やPythonなどで使うことが多い
    • C/C++では、フレームワークのネーミングルールがlowerCamelCaseになっている場合もあり
  • UPPER_SNAKE_CASE
    • 言語を問わず、定数はこれを使うことが多い
  • lowerCamelCase
    • JavaやJavaScriptなどで使うことが多い
    • Goではパッケージプライベートな識別子にこれを使う
  • UpperCamelCase
    • クラスのある言語ではクラス名に使うことが多い
    • Pythonもクラス名はこれを使う
    • Goではこの書式の識別子がexportされる
  • lower-kebab-case
    • プログラミング言語ではハイフンは演算子として扱われるので識別子には使えない
    • URLに使われることもある
  • UPPER-KEBAB-CASE
    • あまり見ない
kebab-caseはchain-caseとも呼ばれるようですが、ケバブ(串刺し)のほうがネーミングセンスを感じるので好きです。
日本人ならyakitori-caseでもいいんじゃないですかね。

ケバブケースは使わないよね

まずケバブケースは脱落。
上で書いた通り、ハイフンが識別子として扱われるのであえて使うメリットがないからです。

アッパースネークケース / アッパーキャメルケースは?

続いてスネークケース・キャメルケースの中でも大文字で始めるものはほとんど見た記憶がないです。

複合語でないパラメーター(id等)もIDIdと書かないと整合性が取れないのが原因でしょうか。

ようやく本題

user_iduserIdはどっちがいい?という話。

まず最初に、「今現在APIの開発に使っている言語がJavaだからJavaのスタイルに合わせてキャメルケースのほうがいい」という理論には説得力を感じません
仮にPythonで書き直すことになったら全部スネークケースにするつもりかと。バックエンドの言語を変えただけでAPIの互換性をなくすつもりかと。

それぞれの長所・短所を軽く書いてみますので、説得力のあると思った方を選んでください。
  • キャメルケースのほうが文字数が少なくて済む
    • 数文字短いから何だ、別にそれで帯域が節約されるわけじゃないぞというのは言わない約束
  • 日本語キーボードでは_入力するのがちょい面倒
    • シフトを押しながらキーボードの右下を押すのがだるい
    • USキーボードならシフト+-なのでそんなにだるくない
  • 全部小文字で統一されるスネークケースのほうがIlといった紛らわしい文字がない
    • 紛らわしいのはIlくらいしかないけどね
大事なことなので3回言いますが、個人的には統一さえされていればどっちでもいいです。

おまけ: URLにケバブケースが使われるのは?

リンクってデフォルトのスタイルだと文字に下線がつくじゃないですか。
スネークケースのURLだとリンクがついたときにアンダースコアとリンクの下線がくっついて見づらい(スペースのようにも見える)からでしょうか。

ちなみにGoogleもケバブケースを推奨しています
URL にはアンダースコア(_)ではなくハイフン(-)を使用することをおすすめします。
理由が書いてないけど。

2 件のコメント:

  1. URLに_を使わないのはDNS名で使える文字に_が無いからなのではないかと…ファイルパス名部分では_が問題無く受け容れられるものの、サーバー名部分では_が使えないですから。

    返信削除
    返信
    1. あ、本当だ!RFC952のことすっかり忘れてました。ありがとうございます!
      そしてコメント気づくの遅くてごめんなさい!

      削除