Pergunta

Eu tenho uma função que identificam coordenadas em uma página, e eu estou retornando-los como um

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

No entanto, mais tarde eu precisar de informações sobre cada página - se ele foi validado, o que é a resolução da página, cor / BW, etc. eu poderia criar uma outra função e executado através de praticamente o mesmo conjunto de resultados como a função anterior e get essa informação.

Dictionary<int, PageInfo> GetDocumentAttributes(int DocumentId)

Outra alternativa seria a de adicionar um parâmetro ref para que eu possa obter esses valores de volta.

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

No entanto, outra alternativa é criar uma classe abrangente que contém o dicionário e as informações da página:

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

e, em seguida, definir:

DocumentInfo GetDocumentInfo(int DocumentId);

Estou inclinado para a última opção, mas suas idéias são muito apreciados.

Foi útil?

Solução

A última opção é definitivamente o melhor. Descobri que, quando se toma ou retornar dados complexos com múltiplos significados, criando um tipo complexo para encapsular esses dados é a melhor prática para uma série de razões.

Em primeiro lugar, os seus dados de retorno provavelmente irá mudar à medida que as alterações de design. Encapsular esses dados em um objeto permite que você altere o que ele carrega e como seus métodos de operar nesses dados sem alterar o Interfaces de seus objetos. Obviamente, o seu objeto de dados não deve implementar uma interface; no máximo, tem uma classe base com a interface mínima e, em seguida, passar referências à base de volta.

Em segundo lugar, você pode encontrar os seus dados fica complexo ao ponto em que você vai precisar para realizar a validação do mesmo. Ao invés de ter essa validação em todos os métodos de suas classes onde atuam sobre esses dados, você pode facilmente acabar com isto na classe de dados. Única responsabilidade, etc.

Outras dicas

Parece que você precisa de um monte de dados para fora. A última opção deve estar bem, e é extensível; que você queria (para simplificar o uso Dictionary<,>), você pode encapsular as coisas um pouco mais, mas o fato de que C # não suporta diretamente chamados meios propriedades indexadas você precisa de algumas aulas, a menos que você só embrulhar com 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];
    }

 }

Eu não sou muito claro o que o int é, por isso não posso dizer se isso é sensato (para que eu tenha acabado de deixar-lo sozinho).

Também - com a primeira opção, você provavelmente não precisa ref -. Que seria suficiente para uso out

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top