Domanda

Ho una funzione che identifica le coordinate su una pagina e le sto restituendo come

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

Tuttavia, in seguito ho bisogno di informazioni su ciascuna pagina: se è stata convalidata, qual è la risoluzione della pagina, il colore / bw, ecc. Potrei creare un'altra funzione ed eseguire praticamente lo stesso set di risultati della funzione precedente e ottenere quell'informazione.

Dictionary<int, PageInfo> GetDocumentAttributes(int DocumentId)

Un'altra alternativa sarebbe quella di aggiungere un parametro ref in modo da poter recuperare questi valori.

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

Un'altra alternativa è creare una classe comprensiva che contenga il Dizionario e le informazioni sulla pagina:

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

e quindi definire:

DocumentInfo GetDocumentInfo(int DocumentId);

Sono incline all'ultima opzione, ma le tue intuizioni sono molto apprezzate.

È stato utile?

Soluzione

L'ultima opzione è sicuramente la migliore. Ho scoperto che, quando si acquisiscono o si restituiscono dati complessi con significati multipli, la creazione di un tipo complesso per incapsulare questi dati è la migliore pratica per una serie di motivi.

Innanzitutto, i dati di ritorno probabilmente cambieranno man mano che il design cambia. Incapsulare questi dati in un oggetto ti consente di alterare ciò che trasporta e come i tuoi metodi operano su questi dati senza alterare le interfacce dei tuoi oggetti. Ovviamente, il tuo oggetto dati non dovrebbe implementare un'interfaccia; al massimo, avere una classe base con l'interfaccia minima e quindi passare i riferimenti alla base in giro.

In secondo luogo, potresti scoprire che i tuoi dati diventano complessi fino al punto in cui dovrai eseguirne la convalida. Piuttosto che avere questa convalida in tutti i metodi delle tue classi in cui agisci su questi dati, puoi facilmente includerli nella classe di dati. Responsabilità unica, ecc.

Altri suggerimenti

Sembra che ti servano molti dati. L'ultima opzione dovrebbe andare bene ed è estensibile; se volessi (per semplificare l'utilizzo Dictionary<,>), potresti incapsulare un po 'di più le cose, ma il fatto che C # non supporti direttamente le proprietà indicizzate significa che avresti bisogno di alcune classi, a meno che non ti limiti a metodi come :

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

 }

Non sono del tutto chiaro quale sia il int, quindi non posso dire se sia sensato (quindi l'ho lasciato da solo).

Inoltre - con la prima opzione, probabilmente non avresti bisogno di ref - sarebbe sufficiente usare out.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top