Ich arbeite derzeit an einer Set-Implementierung in JavaScript. Dies sollte Generika simulieren, wie sie aus Java oder C # bekannt sind. Ich benötige eine veränderbare Version davon (ermöglicht das Hinzufügen / Entfernen von festgelegten Werten) und eine unveränderliche.
Meine Konstruktorsignatur sieht folgendermaßen aus:
new GenericSet( 'number', [ 10, 20, 30 ] );
,
// mutable set of mixed values (allows to add further values via "add")
new MutableGenericSet( '*', [ 'foo', 42, {}, /./ ] );
oder
// DataValues.prototype.equals will be used by the set for determining equality.
new GenericSet( { type: DataValue, valueComparison: 'equals' }, [ dv1, dv2, dv3 ] );
Nur GenericSet oder eine Set-Implementierung pro Typ?
Anfangs bestand mein Hauptzweck darin, Wertesätze eines Typs zu haben. ZB ein DataValuesSet, das nur Datenwerte akzeptiert. Ich könnte dann Schnittstellen mit Funktionen definieren, die eine DataValuesSet- Instanz erfordern . Ich konnte keine Vererbung verwenden (und denke, das wäre sowieso schlecht), also würde ich Komposition verwenden und intern eine GenericSet / MutableGenericSet- Instanz haben.
Ein alternativer Ansatz wäre, immer GenericSet zu nehmen und zu implementieren und zu verwenden, GenericSet.requireSetOfType( type )
was einen Fehler auslösen würde, wenn der Typ des Sets nicht der erforderliche wäre. Mein Anliegen dabei ist, dass meine Schnittstellendefinitionen weniger explizit aussehen.
Nehmen
/**
* @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 );
// ...
}
Vielleicht @param GenericSet(DataValues) dataValues
wäre es in Ordnung, die zweite Wahl zu dokumentieren. Hat jemand weitere Auswirkungen auf den zweiten Ansatz oder gibt es alternative Vorschläge? Für mich sieht der zweite intuitiver aus und mein Anliegen beim ersten ist, dass ich mit Konstruktoren nur mehr Overhead schaffen würde, während ich momentan keinen klaren Vorteil sehe.