Вопрос

У меня есть функция, которая определяет координаты на странице, и я возвращаю их в виде

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

Я склоняюсь к последнему варианту, но я очень ценю вашу проницательность.

Это было полезно?

Решение

Последний вариант, безусловно, самый лучший.Я обнаружил, что при приеме или возврате сложных данных с несколькими значениями создание сложного типа для инкапсуляции этих данных является наилучшей практикой по ряду причин.

Во-первых, ваши возвращаемые данные, вероятно, будут меняться по мере изменения вашего дизайна.Инкапсуляция этих данных в объект позволяет вам изменять то, что он содержит, и то, как ваши методы работают с этими данными, не изменяя интерфейсы из ваших объектов.Очевидно, что ваш объект данных не должен реализовывать интерфейс;самое большее, иметь базовый класс с минимальным интерфейсом, а затем передавать ссылки на базу по кругу.

Во-вторых, вы можете обнаружить, что ваши данные усложняются до такой степени, что вам нужно будет выполнить их проверку.Вместо того чтобы проводить эту проверку во всех методах ваших классов, где вы воздействуете на эти данные, вы можете легко перенести это в класс data.Единая ответственность и т.д.

Другие советы

Похоже, вам нужно получить много данных.Последний вариант должен быть удобным и расширяемым;это вы хотели (для упрощения 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top