Implementación de un conjunto de valores específicos versus el uso de algún tipo de conjunto genérico con controles avanzados

8

Actualmente estoy trabajando en una implementación de conjunto en JavaScript. Esto debería simular genéricos como se conoce en Java o C #. Necesito una versión mutable de eso (permite agregar / eliminar valores establecidos) y una inmutable.

La firma de mi 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 una implementación de conjunto por tipo?

Inicialmente, mi principal propósito para esto era tener conjuntos de valores de un tipo. P.ej. un DataValuesSet que solo aceptaría valores de datos. Luego podría definir interfaces con funciones que requieren una instancia de DataValuesSet . No podría usar la herencia (y supongo que eso sería malo de todos modos), así que usaría la composición y tendría una instancia de GenericSet / MutableGenericSet internamente.

Un enfoque alternativo sería tomar siempre GenericSet e implementar y utilizar GenericSet.requireSetOfType( type ) , lo que arrojaría un error si el tipo de conjunto no fuera el requerido. Mi preocupación por hacerlo de esta manera es que mis definiciones de interfaz parecerí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 );
    // ...
}
¿

quizás usar @param GenericSet(DataValues) dataValues para documentar la segunda opción estaría bien? ¿Alguien ve alguna implicación adicional con el segundo enfoque o hay sugerencias alternativas? Para mí, el segundo parece más intuitivo y mi preocupación por el primero es que solo crearía más sobrecarga con los constructores mientras no puedo ver ninguna ventaja clara en este momento.

    
pregunta Daniel A. R. Werner 12.07.2013 - 23:37

3 respuestas

3

Solía intentar resolver este tipo de problemas con JavaScript, que solo servía para complicar las implementaciones de ... Bueno ... Cualquier cosa. Si no desea utilizar algo como Typescript, documente lo que espera. Si las personas ignoran su documentación, ingresan a un territorio desconocido.

No intentes forzar una clavija redonda en un agujero cuadrado que cualquiera pueda moldear en un agujero redondo. Eso es JavaScript. Abrázalo. No luches, bebe. Documéntalo y vuelve a escribir el código.

    
respondido por el Greg Burghardt 01.10.2017 - 02:33
0

Yo diría que el primer ejemplo es más legible. No implica que se genere un error para el conjunto escrito incorrectamente. Dice que esta función toma un DataValueSet . Ser explícito en tu código agrega claridad.

GenericSet.requireSetOfType confunde la intención del tipo check en la función de impresión. Parece que está comprobando si hay elementos con el tipo DataValue .

    
respondido por el Hasen 08.01.2016 - 11:19
0

Teniendo en cuenta las opciones que presentas, preferiría la primera solución, porque es más legible que la segunda. Pero, si realmente desea hacer una solución de estilo JS, haga una función de construcción, ya sea que los objetos sean del mismo tipo o que sean de tipo mixto ( MakeStrictCollection vs MakeMixedCollection ). En la función de constructor, puede probar si el tipo de cada miembro de su colección dada es del mismo tipo o no, y arrojar un error o devolver un objeto de cada constructor, que tiene un atributo de tipo adicional "type":"strict" vs "type":"mixed" .

Además de eso:

Debería echar un vistazo a Typescript , que puede ser, lo que está buscando. Y hay un paquete que parece que se adapta a sus necesidades con colecciones genéricas .

    
respondido por el Thomas Junk 07.05.2016 - 21:29

Lea otras preguntas en las etiquetas