Question

J'ai une fonction qui identifie les coordonnées d'une page et je les renvoie sous forme de

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

Cependant, plus tard, j'ai besoin d'informations sur chaque page - si elle est validée, quelle est sa résolution, couleur / nb, etc. Je pourrais créer une autre fonction et exécuter à peu près le même jeu de résultats que la fonction précédente et obtenir cette information.

Dictionary<int, PageInfo> GetDocumentAttributes(int DocumentId)

Une autre alternative serait d’ajouter un paramètre ref pour pouvoir récupérer ces valeurs.

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

Une autre alternative consiste à créer une classe englobante contenant le dictionnaire et les informations de la page:

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

puis définissez:

DocumentInfo GetDocumentInfo(int DocumentId);

Je me penche vers la dernière option, mais vos idées sont très appréciées.

Était-ce utile?

La solution

La dernière option est certainement la meilleure. J'ai constaté que, lors de la prise ou de la restitution de données complexes ayant plusieurs significations, la création d'un type complexe pour encapsuler ces données constitue la meilleure pratique pour un certain nombre de raisons.

Premièrement, vos données de retour changeront probablement à mesure que votre conception change. En encapsulant ces données dans un objet, vous pouvez modifier son contenu et le fonctionnement de vos méthodes sur ces données sans modifier les interfaces de vos objets. De toute évidence, votre objet de données ne doit pas implémenter d’interface; tout au plus, avoir une classe de base avec l’interface minimale puis passer des références à la base autour.

Deuxièmement, vous constaterez peut-être que vos données deviennent complexes au point d’obliger à les valider. Plutôt que d'avoir cette validation dans toutes les méthodes de vos classes où vous agissez sur ces données, vous pouvez facilement l'envelopper dans la classe de données. Responsabilité unique, etc.

Autres conseils

Il semble que vous ayez besoin de beaucoup de données. La dernière option devrait être bien, et est extensible; Si vous le souhaitiez (pour simplifier l'utilisation Dictionary<,>), vous pourriez encapsuler un peu plus, mais le fait que C # ne supporte pas directement les propriétés indexées nommées signifie que vous auriez besoin de quelques classes, à moins que vous utilisiez simplement des méthodes telles que :

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

 }

Je ne comprends pas très bien ce qu'est le int, je ne peux donc pas dire si c'est raisonnable (donc je l'ai laissé seul).

En outre, avec la première option, vous n'auriez probablement pas besoin de ref - il suffirait d'utiliser out.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top