2009-05-03 31 views
0

私はプロジェクトに取り掛かりました。という名前の問題に来ました。別の名前空間に同じクラス名がある場合、どうすればよいですか?

私はファクトリパターンを実装したいと思いますが、使用するクラス名がわかりません(私はもう一方のクラスに変更しています。それはかなり時間がかかります)。

私は通常グループクラスのを分離するために、名前空間のために行くが、私の問題は、このコードの特定の部分である:

class Mesh 
{ 
    ... 
}; 
namespace Factory 
{ 
    class Mesh 
    { 
     ... 
    }; 
} 
... 
Factory::Mesh meshFactory; 
Mesh *mesh = meshFactory.create(...); 

マイ問題は、私は、この構造を使用する場合、私はできることですMeshクラス(ファクトリクラスでも実際のMeshクラスでも)を混在させます。実際、これは単純化されています。私の問題にはいくつかの名前空間があり、同じ名前のクラスが両方の名前空間で使用されています。

私は多分クラスを分離し、例えば、同じ名前空間にそれらを置くために接尾辞を使用して考えていた:

class Mesh 
{ 
    ... 
}; 
class MeshFactory 
{ 
    ... 
}; 
MeshFactory meshFactory; 
Mesh *mesh = meshFactory.create(...); 

ので、各クラスが何をするかには混乱がありません。

私は名前空間名を使用して終了になるので、私はそれらを区別するか、別の名前空間を使用して別の名前を発明することでシンプルなソリューションを好きではない:

class Mesh 
{ 
    ... 
}; 
namespace Factory 
{ 
    class MeshFactory // I can't figure a better different name 
    { 
     ... 
    }; 
} 

私は2番目のオプションを好みます。

最初のオプションが優れている理由は何ですか?それとも別の方法がありますか?これに関してベストプラクティスは何を言いますか?

答えて

0

メッシュクラスに「メッシュ」という名前を付ける原因は何ですか?

メッシュインスタンスを生成するファクトリクラスは同じ理由で共有されますか?

もしそうなら、それらは同じクラスで同じ名前でなければなりません。

もしそうでなければ、名前が違う異なるクラスでなければなりません。

ファクトリクラスの目的はMeshクラスのインスタンスを生成することだけなので、MeshFactoryという名前を付けることをお勧めします。

名前空間は関係ありません。

0

使用の際には、完全に資格を取得する必要があります。完全修飾名が長すぎる場合は別名を使用してください。

一般に

a.Mesh b.Mesh

0

とその周り絶対にない方法(すなわちサードパーティ)がなかった場合は、.NETの土地(特にC#の)中で、私はクラスを再マッピングします:

using MyMesh = My.Mesh; 
using FooMesh = Foo.Mesh; 

それを禁止し、あなたは明らかにC#を話していません。(質問にはC++でタグ付けする必要があります)どちらかを参照するときには完全な名前空間を使用します。それをタイプすることは不都合であるが、面倒であることは1つの間違いだけを要する。

1

OO設計におけるこのベスト・プラクティスのゴールデン・ルールを覚えています。クラスの命名は設計ソリューションの50%に簡単です。エンティティの名前を付ける際に問題がある場合は、あなたが明確な概念モデルを持っていないという事実を示しています。

関連する問題