Actualmente estoy trabajando en una implementación establecida en JavaScript. Esto debería simular genéricos como se conoce de Java o C #. Necesito una versión mutable de eso (permite agregar / eliminar valores establecidos) y una inmutable.
Mi firma de constructor se ve así:
new GenericSet( 'number', [ 10, 20, 30 ] );
,
// mutable set of mixed values (allows to add further values via "add")
new MutableGenericSet( '*', [ 'foo', 42, {}, /./ ] );
o
// DataValues.prototype.equals will be used by the set for determining equality.
new GenericSet( { type: DataValue, valueComparison: 'equals' }, [ dv1, dv2, dv3 ] );
¿Solo GenericSet o un conjunto de implementación por tipo?
Inicialmente, mi propósito principal para esto era tener conjuntos de valores de un tipo. Por ejemplo, un DataValuesSet que solo aceptaría valores de datos. Entonces podría definir interfaces con funciones que requieren una instancia de DataValuesSet . No podía usar la herencia (y supongo que sería malo de todos modos), así que usaría composición y tendría una instancia GenericSet / MutableGenericSet internamente.
Un enfoque alternativo sería tomar siempre GenericSet e implementar y usar GenericSet.requireSetOfType( type )lo que arrojaría un error si el tipo del conjunto no fuera el requerido. Mi preocupación por hacerlo de esta manera es que las definiciones de mi interfaz se verían menos explícitas.
Tomar
/**
* @param DataValuesSet dataValues
*/
function printDataValues( dataValues ) {
if( !( dataValues instanceof DataValuesSet ) ) {
throw Error( '...' );
}
// ...
}
vs.
/**
* @param GenericSet<DataValue>
*/
function printDataValues( dataValues ) {
// Throws error if dataValues is not a set or it it is a set with values of wrong type.
GenericSet.requireSetOfType( dataValues, DataValue );
// ...
}
tal vez usar @param GenericSet(DataValues) dataValuespara documentar la segunda opción estaría bien? ¿Alguien ve más implicaciones con el segundo enfoque o hay alguna sugerencia alternativa? Para mí, el segundo parece más intuitivo y mi preocupación con el primero es que simplemente crearía más gastos generales con los constructores, mientras que ahora no puedo ver ninguna ventaja clara.