Frage

Ich habe eine Funktion, die Koordinaten auf einer Seite zu identifizieren, und ich sie als kehrte zurück

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

Doch später muß ich Informationen über jede Seite - wenn es bestätigt wurde, was die Seite Auflösung, Farbe / bw usw. ich eine andere Funktion schaffen könnte und durch so ziemlich das gleiche Ergebnis eingestellt, wie die vorherige Funktion ausführen und erhalten dass Informationen.

Dictionary<int, PageInfo> GetDocumentAttributes(int DocumentId)

Eine weitere Alternative wäre, einen ref Parameter hinzuzufügen, so dass ich wieder diese Werte erhalten.

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

Eine weitere Alternative ist es, ein Umgreifen Klasse zu erstellen, die die Wörterbücher und die Seite Informationen enthält:

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

und dann definieren:

DocumentInfo GetDocumentInfo(int DocumentId);

Ich bin Neigung in Richtung der letzten Option, aber Ihre Erkenntnisse sind sehr geschätzt.

War es hilfreich?

Lösung

Die letzte Option ist auf jeden Fall die beste. Ich habe festgestellt, dass bei der Einnahme oder komplexe Daten mit mehreren Bedeutungen Rückkehr, eine komplexe Art zu schaffen, diese Daten zu kapseln ist die beste Praxis für eine Reihe von Gründen.

Zuerst Ihre Rückkehr Daten werden wahrscheinlich als Ihr Design ändern. diese Daten in einem Objekt einkapseln können Sie ändern, was sie trägt und wie Sie Ihre Methoden auf diesen Daten arbeiten, ohne die Schnittstellen zu ändern Ihre Objekte. Offensichtlich Ihr Datenobjekt soll nicht eine Schnittstelle implementieren; höchstens eine Basisklasse mit der minimalen Schnittstelle hat und dann um Verweise auf die Basis übergeben.

Zweitens können Sie Ihre Daten bekommen Komplex bis zu dem Punkt, wo Sie benötigen Validierung es auszuführen. Anstatt diese Validierung haben in allen Methoden Ihrer Klassen, in denen Sie auf diese Daten handeln, können Sie einfach diese wickeln in der Datenklasse auf. Einzelne Verantwortung, etc.

Andere Tipps

Es scheint, wie Sie eine Menge Daten heraus müssen. Die letzte Option ist in Ordnung sein, und ist erweiterbar; es wollte Sie (die Dictionary<,> Nutzung vereinfachen), können Sie die Dinge ein wenig mehr einkapseln könnte, aber die Tatsache, dass C # direkt unterstützt nicht genannt indiziert Eigenschaften bedeutet, dass Sie ein paar Klassen brauchen würde, es sei denn, Sie nur mit Methoden wickeln wie:

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

 }

Ich bin ich nicht ganz klar, was der int ist, so kann ich nicht sagen, ob dies sinnvoll ist (so habe ich es nur in Ruhe gelassen).

Auch - mit der ersten Option, würden Sie wahrscheinlich nicht ref brauchen - es ausreichen würde, out zu verwenden

.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top