Pregunta

Tengo una función que identifica las coordenadas en una página y las devuelvo como

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

Sin embargo, más tarde necesito información sobre cada página: si se validó, cuál es la resolución de la página, el color / bw, etc. Podría crear otra función y ejecutar casi el mismo conjunto de resultados que la función anterior y obtener Esa información.

Dictionary<int, PageInfo> GetDocumentAttributes(int DocumentId)

Otra alternativa sería agregar un parámetro ref para que pueda recuperar estos valores.

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

Otra alternativa más es crear una clase que contenga el Diccionario y la información de la página:

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

y luego defina:

DocumentInfo GetDocumentInfo(int DocumentId);

Me estoy inclinando hacia la última opción, pero sus ideas son muy apreciadas.

¿Fue útil?

Solución

La última opción es definitivamente la mejor. Descubrí que, al tomar o devolver datos complejos con múltiples significados, la creación de un tipo complejo para encapsular estos datos es la mejor práctica por varias razones.

Primero, sus datos de devolución probablemente cambiarán a medida que cambie su diseño. Encapsular estos datos en un objeto le permite alterar lo que transporta y cómo funcionan sus métodos con estos datos sin alterar las interfaces de sus objetos. Obviamente, su objeto de datos no debe implementar una interfaz; a lo sumo, tenga una clase base con la interfaz mínima y luego pase referencias a la base.

Segundo, puede encontrar que sus datos se vuelven complejos hasta el punto en que necesitará realizar una validación en ellos. En lugar de tener esta validación en todos los métodos de sus clases donde actúa sobre estos datos, puede resumir esto fácilmente en la clase de datos. Responsabilidad individual, etc.

Otros consejos

Parece que necesita muchos datos. La última opción debe estar bien y es extensible; si lo desea (para simplificar el uso de Dictionary<,>), podría encapsular un poco más las cosas, pero el hecho de que C # no admita directamente propiedades indexadas con nombre significa que necesitaría algunas clases, a menos que simplemente se ajuste a métodos como :

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];
    }

 }

No tengo muy claro cuál es el int, así que no puedo decir si esto es sensato (así que lo dejé solo).

Además, con la primera opción, probablemente no necesite ref, sería suficiente usar out.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top