Attualmente sto lavorando a un'implementazione di raccolta in JavaScript. Ho bisogno di una versione mutabile e immutabile di quello. Quindi quello che pensavo prima era qualcosa del tipo:
- Collection
- MutableCollection estende Raccolta
- ImmutableCollection estende Raccolta .
Il mio problema principale è che se voglio implementare raccolte più specifiche come Elenco o Set , potrebbero comunque ereditare da Raccolta mentre le loro implementazioni Mutevoli / Immutabili non possono ereditare da MutableCollection / ImmutableCollection .
Quindi questo mi ha fatto pensare se avere tutti e tre, Raccolta , MutableCollection e ImmutableCollection portasse effettivamente vantaggi significativi.
Un approccio alternativo che mi viene in mente sarebbe di avere solo Raccolta e quindi avere Collection.prototype.makeImmutable o freeze lì. Vorrei quindi introdurre anche un Collection.requireMutableInstance (collectionInstance) che può essere utilizzato in funzioni che richiedono esplicitamente una raccolta mutabile.
Ecco le mie principali preoccupazioni su come mettere tutto solo nella Collezione :
- La definizione del prototipo sta diventando molto più grande rispetto alla definizione di un prototipo MutableCollection che potrebbe quindi contenere il codice di tutte le operazioni di modifica. Immagino che potrei risolvere questo problema semplicemente definendo un secondo file comunque che estenderebbe la definizione di base Collection con quelle operazioni aggiuntive e l'operazione makeImmutable .
- La documentazione di quelle firme di funzioni che effettivamente si preoccupano di mutevole e immutabile e non richiede solo che la raccolta di base sia meno carina.
Prendere:
/**
* @param {MutableCollection} collection
/*
function messAroundWithSomeCollection( collection ) { /* ... */ }
vs.
/**
* @param {Collection} collection A collection not yet made immutable.
/*
function messAroundWithSomeCollection( collection ) { /* ... */ }
Quale sarebbe il modo più naturale di farlo in JavaScript? Soprattutto senza avere interfacce su cui poter controllare e considerare le catene più piatte di ereditarietà se implementerei anche una collezione Set e Map , l'approccio tutto in uno sembra più intuitivo a me.