Progettazione della biblioteca: meglio lasciare una funzionalità potenzialmente distruttiva con un avvertimento o tagliarlo completamente?

0

Recentemente ho creato un albero rosso-nero in C # per capire meglio come funziona. Con esso, ho implementato un enumeratore in ordine, tuttavia mi sono subito reso conto che l'enumerazione di un albero può avere risultati distruttivi.

Considera questo codice:

RedBlackTree<Person> tree = new RedBlackTree<Person>();
tree.Add(new Person("Randy"));
// add more people
...

foreach(var person in tree)
{
    if (person.Name == "Randy")
    {
        person.Name = "Cheeseburger eater";
    }
}

L'albero richiede il parametro generico per implementare l'interfaccia IComparable , al fine di determinare correttamente l'ordine degli articoli.

Se la classe Person viene confrontata per nome, quindi, cambiando il nome durante l'enumerazione, è possibile che l'ordine sia stato interrotto. per esempio. randyNode.CompareTo(randyNode.Right) < 0 potrebbe essere false, che infrange la proprietà fondamentale del BST, che figlio sinistro è più piccolo del suo genitore e figlio destro più grande.

In questo caso, è meglio rimuovere del tutto l'enumerazione degli alberi, o dovrei tenerlo dentro, con un enorme avvertimento per non modificare gli elementi durante l'enumerazione?

    
posta isklenar 28.02.2015 - 20:24
fonte

2 risposte

5

Troverete con le raccolte C # esistenti, tentando di mutare la raccolta mentre l'iterazione causa delle eccezioni. Sarebbe idiomatico lanciare un'eccezione in quello scenario nella tua collezione.

Il problema che dovrai affrontare è che non importa se stai iterando. Se qualcuno cambia person.Name , il tuo RBT è già fuori servizio - iterazione o no.

    
risposta data 28.02.2015 - 20:32
fonte
0

Dipende se gli utenti (incluso te stesso) useranno la funzione di enumerazione della libreria. Se ci sono casi d'uso in cui renderebbe il lavoro migliore o più facile, sarà bello averlo. Molte librerie di enumeratori, incluso .NET, hanno requisiti che il set sottostante non cambia durante l'enumerazione.

Se, d'altra parte, la funzione non viene utilizzata molto, e porta solo alla frustrazione, quindi toglila. Se ti è utile internamente come implementatore della libreria, nascondilo dall'uso pubblico. Conoscete i dettagli del suo utilizzo e non sparatevi ai piedi con esso (si spera).

    
risposta data 28.02.2015 - 20:34
fonte

Leggi altre domande sui tag