4

いくつかの実装 (つまり、メモリ内、NHibernate、xml ベースなど) を持つ可能性のあるインターフェイスのセットがある場合、クラス名自体に名前空間のヒントを提供するのが賢明ですか? 例えば:

MyDomain.Infrastructure.ISomeProvider
MyDomain.Infrastructure.ISomeOtherProvider
MyDomain.Infrastructure.IYetAnotherProvider

私はそれから持っているかもしれません:

MyDomain.Infrastructure.Impl.MemoryBased.SomeProvider
MyDomain.Infrastructure.Impl.MemoryBased.SomeOtherProvider
MyDomain.Infrastructure.Impl.MemoryBased.YetAnotherProvider
MyDomain.Infrastructure.Impl.XmlFileBased.SomeProvider // etc...
MyDomain.Infrastructure.Impl.NHibernate.SomeProvider // etc...

対。

MyDomain.Infrastructure.Impl.MemoryBased.MemoryBasedSomeProvider
MyDomain.Infrastructure.Impl.MemoryBased.MemoryBasedSomeOtherProvider
MyDomain.Infrastructure.Impl.MemoryBased.MemoryBasedYetAnotherProvider
MyDomain.Infrastructure.Impl.XmlFileBased.XmlSomeProvider // etc...
MyDomain.Infrastructure.Impl.NHibernate.NHibernateSomeProvider // etc...

2 番目のケースでは、クラス名自体によってコード内のどこでどの実装を使用しているかは明らかですが、それらを名前空間でグループ化してクラス名に含めるのは少し冗長に思えますね。

3 番目のオプションは次のとおりです。

MyDomain.Infrastructure.ISomeProvider
MyDomain.Infrastructure.Impl.MemoryBasedSomeProvider
MyDomain.Infrastructure.Impl.MemoryBasedSomeOtherProvider
MyDomain.Infrastructure.Impl.MemoryBasedYetAnotherProvider
MyDomain.Infrastructure.Impl.XmlSomeProvider // etc...
MyDomain.Infrastructure.Impl.NHibernateSomeProvider // etc...

冗長な名前空間を排除しましたが、クラスをグループ化/編成する唯一の方法は、クラス名のプレフィックスによるものです。それらをフォルダーに分けて、新しく作成されたファイルの名前空間を手動で調整できると思います。これらのスタイルのいずれかが他のスタイルよりも明確な利点はありますか?

4

2 に答える 2

4

良い質問。誰かが一度に複数の実装を使用する必要がある可能性はどのくらいありISomeProviderますか? もしそうなら、単純に名前空間によって曖昧さをなくすと、厄介な完全修飾名前空間が必要になります。

そうでない場合は、名前空間を使用して実装の性質を示しますが、全体で同じ名前を共有します。いずれにせよ、API が具体的な実装ではなくインターフェイスによって定義されているという事実は、どのオプションを選択するかに関係なく、人々が非常に簡単に実装を交換できることを意味します。

于 2012-05-21T21:26:39.633 に答える
1

オプション1

MyDomain.Infrastructure.Impl.MemoryBased.SomeProvider
MyDomain.Infrastructure.Impl.MemoryBased.SomeOtherProvider
MyDomain.Infrastructure.Impl.MemoryBased.YetAnotherProvider
MyDomain.Infrastructure.Impl.XmlFileBased.SomeProvider // etc...
MyDomain.Infrastructure.Impl.NHibernate.SomeProvider // etc...

私の好みのオプションになります。実装ごとに異なるプロジェクト (メモリ内、ORM、XML) にそれらを配置する必要があると主張できます。その後、IoC コンテナーとその時点の要件に応じて、必要な実装を実行時に読み込むことができます。

名前空間をいじり、クラスの名前に実装のタイプを追加するのはやり過ぎであり、名前空間が外部/他の開発者に無意味に見えるようになります。

于 2012-05-21T21:26:37.380 に答える