Que padrão de design é ilustrado pela interface IStructuralComparable herdada?

5

Sabemos que alguns padrões de design são tão úteis que se tornam recursos da própria linguagem.

Por exemplo, a interface IEnumerator que é implementada por Array object. Isso ajuda na separação do iterador do objeto de coleção. A representação interna do objeto é encapsulada.

O padrão: Padrão do iterador

Acabei de encontrar outra interface IStructuralComparable ( msdn ) . Isso é usado para comparar a estrutura de dois tipos de coleção usando StructuralComparisons ( msdn ) classe.

A intenção desta interface parece ser assim:

My understanding is that it's used for collection like types, and encapsulates the structural part of the comparison, but leaves the comparison of the elements to a comparer passed in by the user. (link) (Got from the comments section of the question)

Esta é uma implementação de qualquer padrão de design familiar? Se sim, qual é o padrão?

    
por TheSilverBullet 08.03.2013 / 13:16
fonte

2 respostas

2

Eu não acredito que haja um padrão comumente usado para descrever isso. Eu pensaria nisso como "padrão composto quebrado", porque me parece que eles quase usam o padrão composto e se eles realmente o usassem, então ele funcionaria melhor.

Como foi implementado, você compara coleções usando IStructuralComparable, que exige que você passe em um IComparer para usar na comparação de elementos individuais das duas estruturas. Como IComparer e IStructuralComparable são duas interfaces diferentes, você tem problemas se os elementos do IStructuralComparable forem eles próprios coleções, que agora são comparados com o IComparer. Mas se você preferir o IStructuralComparable ao IComparer no nível superior, por que você não o prefere agora?

Se o padrão composto tivesse sido usado, os nós internos (coleções) teriam a mesma interface que os nós folha (não-coleções) e lidariam com as subestruturas recursivas de maneira mais limpa. (Eu realmente implementei comparações estruturais exatamente dessa maneira).

Então, para mim, pelo menos, o problema se parece com um padrão composto, mas a solução se parece com "próximo ao padrão composto, mas não tão bom". Isso deve ter sido feito por razões históricas, pois a interface IComparer foi implementada várias vezes dentro e fora do .NET framework, e uma interface composta não combinava com ela.

    
por 15.03.2013 / 19:59
fonte
3

Eu diria que isso seria um padrão de estratégia. Você está basicamente extraindo os detalhes reais da comparação de estruturas para uma classe externa que sabe como lidar com as estruturas particulares que estão sendo comparadas.

Por exemplo, uma implementação de IStructureComparable para uma lista só precisaria varrer uma lista plana, enquanto uma implementação para uma árvore binária também precisaria levar em conta a ramificação da árvore (por exemplo, talvez usasse a profundidade da estrutura). árvores como forma de encomendá-las.)

Vou tentar desenhar uma imagem de exemplo disso, mas suspeito que alguém já possa ter uma e postá-la antes que eu tenha a chance.

    
por 11.03.2013 / 12:44
fonte