Set di implementazione di valori specifici rispetto all'utilizzo di una sorta di set generico con controlli avanzati

8

Attualmente sto lavorando a un'implementazione impostata in JavaScript. Questo dovrebbe simulare i generici come noto da Java o C #. Ho bisogno di una versione mutabile di quella (consente di aggiungere / rimuovere valori impostati) e immutabile.

La mia firma del costruttore è la seguente:

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 ] );

Just GenericSet o un'implementazione impostata per tipo?

Inizialmente, il mio scopo principale era quello di avere set di valori di un tipo. Per esempio. un DataValuesSet che accetta solo valori di dati. Potrei quindi definire interfacce con funzioni che richiedono un'istanza DataValuesSet . Non potrei usare l'ereditarietà (e suppongo che sarebbe comunque un male), quindi userei la composizione e ho internamente un'istanza GenericSet / MutableGenericSet .

Un approccio alternativo sarebbe prendere sempre GenericSet e implementare e utilizzare GenericSet.requireSetOfType( type ) che genererebbe un errore se il tipo dell'insieme non fosse quello richiesto. La mia preoccupazione di farlo in questo modo è che le mie definizioni di interfaccia sembrerebbero meno esplicite.

Prendere

/**
 * @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 );
    // ...
}

forse usare @param GenericSet(DataValues) dataValues per documentare la seconda scelta andrebbe bene? Qualcuno vede ulteriori implicazioni con il secondo approccio o ci sono suggerimenti alternativi? Per quanto mi riguarda, il secondo sembra più intuitivo e la mia preoccupazione per il primo è che vorrei creare un sovraccarico maggiore con i costruttori, mentre al momento non riesco a vedere alcun chiaro vantaggio.

    
posta Daniel A. R. Werner 12.07.2013 - 23:37
fonte

3 risposte

3

Ero solito provare a risolvere questo tipo di problemi con JavaScript, il che serviva solo a complicare le implementazioni di ... Beh ... Qualunque cosa. Se non vuoi usare qualcosa come Typescript, documenta ciò che ti aspetti. Se la gente ignora la tua documentazione, entra in un territorio inesplorato.

Non cercare di forzare un piolo rotondo in un buco quadrato che chiunque può modellare in un buco rotondo. Questo è JavaScript. Abbraccialo. Non combatterlo, piccola. Documentalo e torna a scrivere codice.

    
risposta data 01.10.2017 - 02:33
fonte
0

Direi che il primo esempio è più leggibile. Non implica che venga generato un errore per il set digitato erroneamente. Dice che questa funzione richiede un DataValueSet . Essere espliciti nel tuo codice aggiunge chiarezza.

GenericSet.requireSetOfType offusca l'intento del controllo del tipo nella funzione di stampa. Sembra che stia verificando gli articoli con tipo DataValue .

    
risposta data 08.01.2016 - 11:19
fonte
0

Considerando le opzioni che presento, preferirei la prima soluzione, perché è più leggibile della seconda. Ma, se vuoi davvero fare una soluzione in stile JS, crea una funzione builder, sia che gli oggetti siano dello stesso tipo sia che siano di tipo misto ( MakeStrictCollection vs MakeMixedCollection ). Nella funzione builder, puoi testare se il tipo di ogni membro della tua collezione è dello stesso tipo o meno e lanciare un errore o restituire un oggetto da ogni costruttore, che ha un attributo type aggiuntivo "type":"strict" rispetto a "type":"mixed" .

Oltre a questo:

Dovresti dare un'occhiata a Typescript , che potrebbe essere quello che stai cercando. E c'è un pacchetto che sembra soddisfare le tue esigenze con raccolte generiche .

    
risposta data 07.05.2016 - 21:29
fonte

Leggi altre domande sui tag