2009-06-14 10 views
4

私はプライマリパーソナルプロジェクトの依存関係グラフを最近見ていました。ネストした名前空間のオブジェクト間に相互依存関係があることに気付きました。たとえば、私はMyNamespace.Fooにオブジェクトを持っていて、MyNamespace.Foo.Interfacesにジェネリックインターフェイスを実装しました。相互に依存する子/親の名前空間はコードのにおいですか?

namespace MyNamespace.Foo 
{ 
    internal class Foo : MyNamespace.Foo.Interfaces.IFoo<Foo> 
    { } 
} 

この場合、依存関係解析ツール(VS2010ベータ版)は、インターフェースの名前空間のメンバーになるインターフェースの一般的な「インスタンス化」(議論のために、これはC++ではないことを知っています)を合理的に考慮します。

私の考えを考慮した後、私の既存のデザインは、私の特別なケースではコード臭ですという結論に達しました。 Interfaces名前空間を親Foo名前空間にマージする必要があります。 (FooIFooを使用したい場合は、クライアントがインタフェースの名前空間に余分なレイヤーをドリルダウンする必要があります。)しかし、これは一般的なケースで当てはまりますか?

名前空間間の依存関係はどのように管理する必要がありますか?万一「広い」の名前空間(のようなMyNamespace.Fooは、一般的に「狭い」の名前空間(のようなMyNamespace.Foo.Interfaces)に依存し、またはより狭い名前空間が広いものに依存?それとも、いくつかのより良い、より微妙な答えはそこにあるべきか、特定の場合には

答えて

2

あなたの例について

一般に、より狭い名前空間は、より幅広いものからのクラスまたはインターフェイス、または共有の親名前空間の子であるクラスまたはインターフェイスに依存する必要があると私は考えます。モデルネームスペースが、コードが解決しようとしている問題のモデルを記述するクラスまたはインターフェイスを共有するように名前空間を配置している場合は、通常です。

私は、これらの規則がサードパーティの依存関係に必ずしも当てはまるとは思わないことにも注意してください。たとえば、コード内の狭い名前空間のコードに応じて、Spring.NETはコード臭を構成しません。

2

インターフェイスを実装から分離したい場合、可能性はMyNamespace.Foo.InterfacesパラメタとMyNamespace.Foo.Implementation名前空間とパラレルになる可能性があります。そうFooBarはそれぞれfoo.dllbar.dllのための名前空間のようになります。

デフォルトでは、名前空間がパッケージまたはアセンブリと等価であることのようです。

より高いレベルのグループ化が必要な場合は、名前空間にプレフィックスを追加します。たとえば、MyCorp.Server.Fooは、MyCorpによって生成されたサーバー側のネームスペースfoo.dllです。

接頭辞ではなく接尾辞を追加することに注意してください。Foo.Server.MyCorpではなくMyCorp.Server.Fooです。これらの構造化された名前空間は、ソースコードとプロジェクトが含まれているフォルダ/ディレクトリ構造に対応しています。

デフォルトでは、パッケージ内のすべてのファイルは同じ名前空間を持ちます(例:foo.dllのすべてのコードはMyCorp.Server.Foo名前空間に属しています)。私がサフィックスを追加した場合、これは残りのアセンブリからそのコードを隠す効果があります。たとえば、MyCorp.Server.Foo.EditorTransactions名前空間のコードはfoo.dllに存在しますが、他のほとんどのコードfoo.dll(明示的にはMyCorp.Server.Foo.EditorTransactionsを使用しているコードを除く)では認識されません。

関連する問題