C# でハーフエッジ データ構造の実装を作成しています。この構造の詳細は私の質問には関係ないので、必要なだけ深く紹介しますが、興味のある人はフリップコードで簡単な要約を入手できます。
私のデータ構造のオブジェクト指向表現は、Halfedge
、Edge
、Vertex
およびの 4 つのクラスで構成されておりFace
、相互にいくつかの相互参照が含まれています。(具体的には、すべてのハーフエッジは頂点を参照しますが、すべてのエッジ、頂点、および面はハーフエッジを参照します。) この低レベル表現の処理と維持は困難な作業であるため、その変更をコードのユーザーに公開しないでください。データ構造の一貫性を保証します。
これを実現するために、5 番目Graph
のクラスを作成して、その上に高い抽象化レベルのレイヤーを提供しました。コード/ライブラリのユーザーはGraph
、トポロジ モデルを構築またはクエリするためにインスタンスと通信するだけでよく、ハーフエッジ、エッジ、頂点、および面の低レベルの関係を処理する必要はありません。したがって、破損することはありません。
今問題に。面、頂点、エッジ、およびハーフエッジは、 からクエリ可能である必要がありGraph
ます。ハーフ エッジ データ構造には、データに関するトポロジ情報が含まれているため、たとえば、特定の面またはエッジに隣接する面を要求するのは、リソース効率の高いクエリです。これらのクラスの使用方法のサンプル:
Graph graph = new Graph();
Face face = graph.AddFace(/* params about the vertexes of the face to create */);
// More data given to the graph ...
// Later:
Face[] faces = face.AdjacentFaces;
Vertex[] vertixes = face.BoundaryVertices;
明らかな目的のために、オブジェクトは、含まれている、、およびオブジェクトGraph
の内部状態を操作して、ユーザーからの入力からデータ構造を構築および維持する必要があります。ただし、これら 4 つのクラスに状態を変更するメソッド (またはプロパティ) がある場合、ユーザーが直接呼び出すことができるため、表現をユーザーから隠すという考え全体が台無しになります。(残念ながら、C# には現在、フレンド クラスの概念がありません。)Halfedge
Edge
Vertex
Face
public
、Halfedge
、およびクラスをネストして公開しないと、ユーザーがこれらの型を取得できなくなりますEdge
。例えば:Vertex
Face
Graph
public class Graph
{
private class Halfedge { /* ... */ }
private class Edge { /* ... */ }
private class Vertex { /* ... */ }
private class Face { /* ... */ }
// Cannot return a Face, since it is not public.
public Face AddFace(/* params about the vertexes of the face to create */)
{
/* Algorithm to create halfegdes, edges, vertices and a face */
}
}
したがって、基本的に私の質問は、このようなデータ構造を実装するためにどの設計に従うのが最善かということです。、、およびクラスHalfedge
は、クラス用に変更するためのインターフェイスを公開する必要がありますが 、他のクラス用には公開する必要はありません。アセンブリ全体に対してこれらの関数を公開するため、アクセシビリティは良くありません。Edge
Vertex
Face
Graph
Internal
.NET の多くのコレクションには読み取り専用ラッパー ( などList<T>
) があり、オブジェクトを返すときにそれらのみをユーザーに公開するため (たとえばAddFace()
)、それらの「読み取り専用」ラッパー クラスを作成しますか?