1

我有一个识别页面坐标的函数,我将它们作为

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);

我倾向于最后一个选项,但非常感谢您的见解。

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 回答