異なる名前空間に同じクラス名がある場合はどうすればよいですか?
-
03-07-2019 - |
質問
プロジェクトに取り組んでいますが、次のネーミングの問題に遭遇しました。
ファクトリパターンを実装したいのですが、使用するのに最適なクラスの名前がわかりません(一方から他方に変更しているため、かなり時間がかかります:S)。
通常、クラスのグループを分離するために名前空間を使用しますが、私の問題はこの特定のコード部分にあります:
class Mesh
{
...
};
namespace Factory
{
class Mesh
{
...
};
}
...
Factory::Mesh meshFactory;
Mesh *mesh = meshFactory.create(...);
私の問題は、この構造を使用すると、メッシュクラスを混同できることです(ファクトリクラスまたは実際のメッシュクラス)。実際には、これは単純化です。私の問題にはいくつかの名前空間が関係しており、同じ名前のクラスが両方の名前空間で使用されています。
たとえば、サフィックスを使用してクラスを分離し、同じ名前空間に配置することを考えていました:
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番目のオプションを選択します。
最初のオプションの方が良い理由は確かですか?それとも別の方法がありますか?これについてのベストプラクティスは何を言いますか?
解決
Meshクラスに「Mesh」という名前を付けた理由は何ですか?
Meshインスタンスを生成するファクトリクラスは、同じ理由をすべて共有していますか?
もしそうなら、それらは同じクラスで同じ名前でなければなりません。
そうでない場合は、名前が異なる異なるクラスである必要があります。
Meshクラスのインスタンスを生成することがファクトリクラスの唯一の目的である可能性が高いため、MeshFactoryという名前を付けることをお勧めします。
名前空間は関係ありません。
他のヒント
「ベストプラクティス」のこの黄金律を思い出してください。オブジェクト指向設計の場合:クラスの命名は、設計ソリューションの50%に簡単になります。エンティティの命名に問題がある場合は、明確な概念モデルが頭にないという事実を示しています。
使用には完全に資格が必要です。完全修飾名が長すぎる場合は、エイリアスを使用します。
a。メッシュ b。メッシュ
一般的に.NETの土地(具体的にはC#)では、クラスを回避する方法がまったくない場合(つまりサードパーティ)、クラスを再マップします。
using MyMesh = My.Mesh;
using FooMesh = Foo.Mesh;
それと、あなたが明らかにC#を話していないということを除けば(質問にはc ++のタグを付ける必要があります)どちらかを参照するときは、完全な名前空間を使用します。入力するのは不便ですが、面倒になるのはたった1つのミスです。