質問
ページ上の座標を識別する関数があり、それらを次のように返しています
Dictionary<int, Collection<Rectangle>> GetDocumentCoordinates(int DocumentId)
ただし、後で各ページに関する情報が必要です-検証された場合、ページ解像度、色/ bwなどは何ですか。別の関数を作成し、前の関数とほぼ同じ結果セットを実行して取得できますその情報。
Dictionary<int, PageInfo> GetDocumentAttributes(int DocumentId)
別の方法として、ref
パラメーターを追加して、これらの値を取得できるようにします。
Dictionary<int, Collection<Rectangle>> GetCoordinates(int DocumentId, ref Dictionary<int, PageInfo> PageAttributes)
さらに別の方法は、辞書とページ情報を含む包括的なクラスを作成することです:
class DocumentInfo
{
Dictionary<int, Collection<Rectangle>> Coordinates { get; set;}
Dictionary<int, PageInfo> PageAttributes { get; set; }
}
そして定義:
DocumentInfo GetDocumentInfo(int DocumentId);
私は最後の選択肢に傾いていますが、あなたの洞察は大歓迎です。
解決
最後のオプションは間違いなく最高です。複数の意味を持つ複雑なデータを取得または返す場合、多くの理由から、このデータをカプセル化するために複雑な型を作成することがベストプラクティスであることがわかりました。
まず、設計が変更されると、おそらく戻りデータが変更されます。このデータをオブジェクトにカプセル化すると、オブジェクトのインターフェースを変更することなく、このデータが運ぶものとこのデータに対するメソッドの動作を変更できます。明らかに、データオブジェクトはインターフェイスを実装すべきではありません。せいぜい、最小限のインターフェースを持つ基本クラスを用意し、その周辺への参照を渡します。
2番目に、データの検証を実行する必要があるほど複雑になる場合があります。このデータを操作するクラスのすべてのメソッドでこの検証を行うのではなく、これをデータクラスで簡単にラップできます。単一の責任など
他のヒント
大量のデータが必要なようです。最後のオプションは問題なく、拡張可能である必要があります。必要に応じて(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
を使用すれば十分です。