Skip to content

Instantly share code, notes, and snippets.

@TakashiSasaki
Last active September 27, 2018 01:40
Show Gist options
  • Save TakashiSasaki/11f63619773de739f32e2653bd1b26f5 to your computer and use it in GitHub Desktop.
Save TakashiSasaki/11f63619773de739f32e2653bd1b26f5 to your computer and use it in GitHub Desktop.
Naming convention

概要

複数のシステムで横断的に何かを識別するために使う名前(name)について妥当な規則を考えてみる。 多くのシステムで利用でき、人間にとっての可読性と機械処理に必要な一意性が両立できていなければならない。 name は前者を優先したleaderと後者を優先したtrailerで構成することとし、trailerはオプションとした。

leader

leaderはハイフン("-")で区切られたtermの列である。これを順序付きのtermの集まりとして扱うか、順序無しの集合として扱うか、重複をどう扱うかなどはアプリケーションに任せるのが妥当だろうと思う。区切り文字としてハイフン以外を使えるようにする方が便利かもしれない。

term

termは人間にとって可読な文字列を意図しており英数字およびU+00A0以降のUnicode文字で構成される。ASCIIコード表からは記号や制御文字を含まない英数字のみを許容することで、多くのシステムにおいて予期しない動作を避けた。多くのプログラミング言語において識別子として使用できることを意図している。そのためtermは数字で始めることを禁止している。

trailer

trailerはオプションであり、機械処理において利用可能なアノーテーションの提供を意図している。 アノーテーションとしてはやOID、UUID、何らかのハッシュ値またはその一部、バージョン番号、ファイルシステムにおける拡張子などを想定している。 現時点でのtrailerはピリオド(".")にtermを続けたものとしているが機械処理おいてはより広い範囲の文字を含めた方がいいかもしれない。 しかしIRIの一部として使った時の安全性を考慮する必要がある。 ucscharとiprivateはRFC3987での定義を用いている。

trailerで意図している型は、プログラミング言語における厳密な型というよりも、 「カインド」とか「アノーテーション」とでも呼ぶことがふさわしいような緩いものを想定している。 そこでtrailerには16進数文字列とドット(".")区切りの10進数文字列の両方を収容できるようにした。両者を区別するため、後者については"1.2"のように必ずドットを含む形式であることを要求し、曖昧さを回避するためドットで区切られたそれぞれの10進数文字列については2桁以上の場合について先頭の0を禁止する。そのため"1.02"のようなtrailerは許されないが"1.0.0"のようなtrailerは許される。そのためOIDやIPv4アドレスの一部なども使用できる。

考察

leaderとtrailerの間はピリオド(".")で区切られる。 現在の仕様においてleaderに現れる文字は英数字とハイフン("-")だけであるが、 仮にコロン(":")やセミコロン(";")、カンマ(",")などの区切り文字を許容したとしても 多くの自然言語においてピリオドは文の終わりを意味し、それ以外のどの区切り文字よりも強いと認識される傾向にあるからである。 ファイルシステムにおける拡張子の直前の区切り文字がピリオドであることもこれと無関係ではないだろう。

termにドット(".")、アンダースコア("_")、カンマ(",")のいずれか、あるいは任意の組み合わせ、あるいはすべてを許容することもできる。識別子として取り扱いたい場合にはすべてアンダースコアに変換することで対応できる。しかしtermにこれらを許容することでハイフンとの優先順位があいまいになる。ハイフンが優先されることを明文化すれば規格として問題ないが、そのルールは自明ではないし、確認しなければ明確にならないルールはたいてい守られないのである。

leaderとキャメルケースとの間の相互変換は自明ではない。大文字小文字といった特定の自然言語を表現するために用いられるアルファベットの属性に依存した方法は、Unicodeを許容することとと相容れないと判断した。termでは大文字小文字の両方を許容しているうえ、仮にtermに使えるアルファベットを小文字だけに制限したとしても、数字を含むキャメルケースの取り扱いは依然として曖昧である。

参考

ABNF記法についてはBill's ABNF Parserでチェックした。 ASCIIコード表

name = leader *("." trailer)
leader = 1*term *( "-" term)
trailer = 1*hexchar / decimals
term = ( ALPHA / ucschar / iprivate ) *( ALPHA / DIGIT / ucschar / iprivate )
hexchar = HEXDIG / "a" / "b" / "c" / "d" / "e" / "f"
decimals = integer "." integer *( "." integer )
integer = ( %x31-39 *DIGIT ) / "0"
ucschar = %xA0-D7FF / %xF900-FDCF / %xFDF0-FFEF / u1234 / u56789 / uabcde
u1234 = %x10000-1FFFD / %x20000-2FFFD / %x30000-3FFFD / %x40000-4FFFD
u56789 = %x50000-5FFFD / %x60000-6FFFD / %x70000-7FFFD / %x80000-8FFFD / %x90000-9FFFD
uabcde = %xA0000-AFFFD / %xB0000-BFFFD / %xC0000-CFFFD / %xD0000-DFFFD / %xE1000-EFFFD
iprivate = %xE000-F8FF / %xF0000-FFFFD / %x100000-10FFFD
ALPHA = %x41-5A / %x61-7A
DIGIT = %x30-39
HEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment