Description
Hey there,
From the perspective of idiomatic JavaScript, I was wondering why the API has so many classes and custom add/remove/clear methods, instead of using objects and arrays.
That is, instead of the example at https://github.com/WICG/handwriting-recognition/blob/main/explainer.md#perform-recognition, I would have expected something like this:
// Create a new stroke. It's a plain JS array.
const stroke = [];
// Add a point.
const point = { x: 84, y: 34, t: 959 };
// The point dictionary is added to the stroke array
stroke.push(point)
// Modifying a point added to a stroke does have an effect.
point.x = newX // This does work.
stroke[0].x = newX // This also works.
// The point's value has changed
stroke[0].x === 84 // => false
// Point's time attribute is optional.
stroke.push({ x: 93, y: 54 })
// Create a new drawing. It's a JS array of strokes.
const drawing = [stroke];
// Add more points to the stroke.
stroke.push({ x: 93, y: 54, t: 1013 });
// Get predictions of the partial drawing.
// This will take into account both points that were added to the stroke.
await handwriting.getPrediction(drawing);
// The returned value is the same as for the original drawing.getPrediction() API.
// Add a new stroke.
const stroke2 = []
stroke2.push({x: 160, y: 39, t: 1761});
drawing.push(stroke2);
// Get all strokes:
drawing
// => [stroke, stroke2]
// Delete a previous stroke.
drawing.splice(0, 1);
// Get a new prediction.
await handwriting.getPrediction(drawing)
// No need to free up resources, since it's just a JS array of objects, which the GC handles normally.
I'm not sure why the current API has so many mutable classes and extra copies. All the actual work seems to happen in the async drawing.getPrediction()
(or, in my version, handwriting.getPrediction(drawing)
). So transforming that data into HandwritingStroke
and HandwritingDrawing
classes seems like extra work.
Are there implementation reasons why these mutable classes are necessary? If so, it'd be good to be clear about them in the explainer, and especially to explain why they are necessary in all implementations and not just a Chromium implementation limitation. I found https://github.com/WICG/handwriting-recognition/blob/main/explainer.md#alternative-api-design which maaaybe explains why a HandwritingDrawing
class is necessary (although I had to read a lot between the lines; I'm guessing the idea is that you have some sort of side table mapping earlier versions of the drawing to recognition results, and then reuse those partial results in future calls to getPrediction()
? And that's impossible to do based on normal JS objects---for some reason?). But I'm not sure it explains why the HandwritingStroke
class is necessary.
Activity