1

ページ上の座標を識別する関数があり、それらを

Dictionary<int, Collection<Rectangle>> GetDocumentCoordinates(int DocumentId)

ただし、後で各ページに関する情報が必要になります。検証された場合、ページの解像度、色/bw などです。別の関数を作成し、前の関数とほぼ同じ結果セットを実行して、その情報を取得できます。

Dictionary<int, PageInfo> GetDocumentAttributes(int DocumentId)

もう 1 つの方法は、refこれらの値を取得できるようにパラメーターを追加することです。

Dictionary<int, Collection<Rectangle>> GetCoordinates(int DocumentId, ref Dictionary<int, PageInfo> PageAttributes)

さらに別の方法として、Dictionary とページ情報を含む包括的なクラスを作成する方法があります。

class DocumentInfo
{
    Dictionary<int, Collection<Rectangle>> Coordinates { get; set;}
    Dictionary<int, PageInfo> PageAttributes { get; set; }
}

次に定義します。

DocumentInfo GetDocumentInfo(int DocumentId);

私は最後のオプションに傾いていますが、あなたの洞察は非常に高く評価されています.

4

2 に答える 2

6

最後のオプションは間違いなく最適です。複数の意味を持つ複雑なデータを取得または返す場合、このデータをカプセル化するために複雑な型を作成することが、さまざまな理由からベスト プラクティスであることがわかりました。

まず、デザインが変更されると、返されるデータが変わる可能性があります。このデータをオブジェクトにカプセル化すると、オブジェクトのインターフェースを変更することなく、データが運ぶものと、メソッドがこのデータに対してどのように動作するかを変更できます。明らかに、データ オブジェクトはインターフェイスを実装すべきではありません。せいぜい、最小限のインターフェイスを持つ基本クラスを用意してから、基本への参照を渡します。

次に、検証を実行する必要があるほどデータが複雑になることがあります。このデータを操作するクラスのすべてのメソッドでこの検証を行うのではなく、これをデータ クラスに簡単にまとめることができます。単独責任等

于 2008-12-31T19:38:03.757 に答える
1

大量のデータが必要なようです。最後のオプションは問題なく、拡張可能です。(使用を簡素化するためにDictionary<,>) 必要に応じて、もう少しカプセル化することもできますが、C# は名前付きのインデックス付きプロパティを直接サポートしていないという事実は、次のようなメソッドでラップするだけでない限り、いくつかのクラスが必要になることを意味します。

class DocumentInfo {
    Dictionary<int, Collection<Rectangle>> rectangles = ...
    public Collection<Rectangle> GetRectangles(int index) {
        return rectangles[index]; // might want to clone to
                                  // protect against mutation
    }
    Dictionary<int, PageInfo> pages = ...
    public PageInfo GetPageInfo(int index) {
        return pages[index];
    }

 }

私はそれが何であるかはっきりしていないintので、これが賢明であるかどうかはわかりません (だから私はそれをそのままにしておきました)。

また、最初のオプションでは、おそらく必要ないでしょう。ref使用するだけで十分outです。

于 2008-12-31T19:33:34.827 に答える