Quando la denominazione delle strutture di dati dovrebbe essere più astratta o letterale?

2

Supponiamo che crei una struttura di serie ordinata e scelgo di implementarla come un albero binario. Dò un nome alla mia struttura OrderedSet perché ritengo che la sua implementazione di base non sia necessariamente importante per l'utente, e vado avanti per la mia strada. Più tardi, torno al mio codice e decido che implementarlo come un albero rosso-nero potrebbe essere stato migliore. Tuttavia, ci sono alcuni utenti che, per una ragione particolare, preferiscono che il set rimanga implementato come un semplice albero binario. Questo mi lascerebbe con alcune opzioni come reimplementare la struttura originale in ogni caso o semplicemente creando una nuova struttura chiamata qualcosa come BalancedOrderedSet . Tuttavia, questo intero problema avrebbe potuto essere evitato se inizialmente avessi dato alle mie strutture più nomi letterali come BinaryTree e RedBlackTree , sebbene il loro uso principale non sarebbe più ovvio (specialmente per i programmatori meno esperti).

Mi rendo conto che ci sono molte librerie (specialmente le librerie standard) che tendono a nominare le loro classi e strutture in base al loro scopo generale piuttosto che alla loro implementazione sottostante. Volevo discutere / chiedere dei pro e dei contro di ogni lato di questo spettro di nomi astratti / letterali e quando e dove sarebbe meglio orientarsi in un modo o nell'altro, in particolare nelle codebase di librerie generiche dove l'uso futuro delle strutture è sconosciuto e molto diffuso.

    
posta Jared 20.05.2016 - 01:13
fonte

2 risposte

3

Non avrebbe senso avere un interface (Java speaking) OrderedSet e le classi BinaryTree e RedBlackTree implementare quell'interfaccia?

Se stai implementando una libreria e successivamente introduci l'interfaccia, questa richiederà una nuova versione principale. In questa nuova versione principale, potrebbe anche essere possibile rinominare la classe OrderedSet in BinaryTree e introdurre l'interfaccia OrderedSet per rendere più convenienti gli aggiornamenti delle librerie. Richiederà solo agli utenti della libreria di cambiare le chiamate del costruttore. Questo è positivo, perché devono decidere a quel punto quale implementazione preferiscono.

    
risposta data 20.05.2016 - 09:16
fonte
1

Affrontare la domanda da una prospettiva diversa, direi che fornire un'astrazione orientata al dominio può essere la risposta migliore. Piuttosto che descrivere le proprietà (astratte o concrete) dell'implementazione, definire un'astrazione che sia direttamente pertinente al dominio dei propri utenti e limitata alle capacità specifiche di cui hanno bisogno. Ciò significa che fornisci solo le esatte capacità di cui hanno bisogno, in termini di terminologia di dominio, piuttosto che tutte le capacità di OrderedSet o BalancedOrderedSet , ma invece di qualcosa orientato al dominio, come le presentazioni di qualche tipo (che possiamo implementare con un set ordinato).

    
risposta data 20.05.2016 - 01:50
fonte

Leggi altre domande sui tag