-
Notifications
You must be signed in to change notification settings - Fork 0
MS_PackageNameVsNamespace
- 戻る(.NET開発)
「Java のパッケージ名」と「.NET の名前空間」の違いについて
補足(そもそも別の概念である): 名前が似ているが、
担っている役割の範囲が違う点を先に押さえるとよい。
Java のパッケージ .NET の名前空間 名前の衝突回避 ○ ○ ディレクトリ構造との一致 必須(強制される) 任意(一致させなくてよい) アクセス制御の単位 ○(package-private がある) ×(名前空間に可視性の概念は無い) 配置の単位 jar(パッケージとは独立) アセンブリ(名前空間とは独立) つまり **Java のパッケージは「物理と論理を兼ねる」**が、
**.NET の名前空間は純粋に「論理的な名前の入れ物」**である。
.NET では
- 1 つの名前空間が複数のアセンブリにまたがってよい、
- 1 つのアセンブリが複数の名前空間を含んでよい、
- フォルダ名と名前空間が一致しなくてよい(規約としては一致させる)、
という自由度がある。
可視性の制御は名前空間ではなく **internal(アセンブリ内)**が担う。
パッケージ名は、
- 製品:「jp.co.hitachi_solutions.(ファミリ名).(製品名).(サブシステム名など任意)」
- システム:「jp.co.hitachi_solutions.(システム名).(サブシステム名など任意)」
などが一般的です。
先頭の要素は、正規に取得しているドメイン名を、構成毎に逆にしたものになります。
また、パッケージ名は、小文字しか利用できません。
補足: 「小文字しか利用できません」は正確には
言語仕様上の制約ではなく規約(Java の命名規則)である。
ただし、大文字小文字を区別しないファイルシステム(Windows)で
問題が起きるため、実質的に守るべき規則になっている。
.NET の名前空間は、
- 製品:「HitachiSolutions.(ファミリ名).(製品名).(サブシステム名など任意)」
- システム:「HitachiSolutions.(システム名).(サブシステム名など任意)」
などが一般的です。
.NET の名前空間の頭文字は、大文字が推奨されています。
補足(Microsoft の規約): 名前空間は
<会社名>.<製品名>[.<機能>][.<デザイン>]が推奨されている
(PascalCase)。
Java のようにドメインを逆順にする慣習は無い。実務上の注意として、
- 名前空間と型名を同じにしない(
Foo.Fooは解決が曖昧になる)- 既存の .NET の名前空間と衝突させない(
System.*を自作しない)- 会社名は略さない(
HS.ではなくHitachiSolutions.)といったものがある。
名前空間(パッケージ名)には、「 - 」を使えません。
このため「 - 」は「 _ 」等に置換する必要があります。
「hitachi-solutions」 → 「hitachi_solutions」などとなります。
「サブシステム名など任意」の部分には
-
大規模なシステムでは業務の ID など
-
小規模のシステムでは
- コンポーネント区分
- 論理階層(レイヤ)
の ID など
が適用される事が多いようです(プレフィックスなどと併用される)。
補足(
-が使えない理由): 名前空間・パッケージ名は
識別子(identifier)であり、-は演算子(減算)と
区別が付かないため使えない。
一方、NuGet のパッケージ ID は識別子ではなく
単なる文字列なので-を含められる
(例:Microsoft.Extensions.DependencyInjection.Abstractionsは.のみだが、
Newtonsoft.Jsonのように慣例で.を使うものが多い)。NuGet パッケージ ID … Foo.Bar-Baz (- を含められる) アセンブリ名 … Foo.Bar.Baz.dll 名前空間 … namespace Foo.Bar.Baz (- は不可)3 つは独立しているが、規約としては揃えるのが分かりやすい。
先頭要素は、基本的に
-
「企業名」(名前空間の場合)
HitachiSolutions -
「企業の逆ドメイン※」(パッケージ名の場合)
jp.co.hitachi_solutions
となります。
OSS に関しては、
- 「OSS 名」(名前空間の場合)
- 「OSS コミュニティのドメイン※」(パッケージ名の場合)
などが一般的です。
※:正規に取得している(企業や OSS のサイトの)ドメイン名を、構成毎に逆にしたもの。
補足(なぜドメインを使うのか): Java の逆ドメイン方式は、
**「世界中で一意であることを、既存の仕組み(DNS)に委ねる」**という発想である。
ドメインは重複しないので、それを逆順にすれば衝突しない。.NET が会社名で足りるとしているのは、
アセンブリの厳密名(Strong Name)や
NuGet のパッケージ ID の一意性が別途担保されるためで、
名前空間自体に世界一意性を求めていないという設計判断による。
Tags: 移行, プログラミング, .NET開発
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。