Quale schema di progettazione viene illustrato ereditando l'interfaccia IStructuralComparable?

5

Sappiamo che alcuni schemi di progettazione sono così utili che diventano funzionalità del linguaggio stesso.

Ad esempio, l'interfaccia IEnumerator implementata da Array oggetto. Questo aiuta a separare l'iteratore dall'oggetto di raccolta. La rappresentazione interna dell'oggetto è incapsulata.

Il pattern: Pattern Iterator

Ho appena incontrato un'altra interfaccia IStructuralComparable ( msdn ) . Viene utilizzato per confrontare la struttura di due tipi di raccolta utilizzando StructuralComparisons ( msdn ) class.

L'intento di questa interfaccia sembra essere così:

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)

Si tratta dell'implementazione di un modello di progettazione familiare? Se sì, quale modello è?

    
posta TheSilverBullet 08.03.2013 - 13:16
fonte

2 risposte

2

Non credo che ci sia uno schema comunemente usato per descrivere questo. Lo considererei un "pattern composito spezzato", perché mi sembra che utilizzino quasi il pattern composito e, se lo usassero, funzionerebbe meglio.

Come è stato implementato, si confrontano le raccolte utilizzando IStructuralComparable, che richiede di passare in un compendio IC da utilizzare nel confronto dei singoli elementi delle due strutture. Poiché IComparer e IStructuralComparable sono due interfacce diverse, si hanno problemi se gli elementi di IStructuralComparable sono essi stessi raccolte, che ora vengono confrontati con IComparer. Ma se preferisci IStructuralComparable a IComparer al livello più alto, perché non lo preferisci ora?

Se fosse stato utilizzato lo schema composito, i nodi interni (raccolte) avrebbero la stessa interfaccia dei nodi foglia (non collezioni) e gestiranno le sottostrutture ricorsive in modo più pulito. (In realtà ho implementato i confronti strutturali esattamente in questo modo).

Quindi, almeno per me il problema sembra un pattern composito, ma la soluzione sembra "vicina al pattern composito ma non è altrettanto buona". Questo deve essere stato fatto per ragioni storiche, dal momento che molti l'interfaccia IComparer è stata implementata molte volte dentro e fuori dal framework .NET, e un'interfaccia composita non corrisponderebbe.

    
risposta data 15.03.2013 - 19:59
fonte
3

Direi che questo sarebbe uno schema di strategia. In pratica stai estraendo i dettagli reali del confronto delle strutture con una classe esterna che sa come gestire le particolari strutture confrontate.

Ad esempio, un'implementazione di IStructureComparable per un elenco dovrebbe solo eseguire la scansione di un elenco semplice, mentre un'implementazione per un albero binario dovrebbe anche tenere conto della ramificazione dell'albero (ad esempio, potrebbe utilizzare la profondità del alberi come modo per ordinarli).

Proverò a disegnare un'immagine di esempio di questo, ma ho il sospetto che qualcuno potrebbe averne già uno e lo pubblicherà prima che io ne abbia la possibilità.

    
risposta data 11.03.2013 - 12:44
fonte

Leggi altre domande sui tag