- From: Peter Thatcher <pthatcher@google.com>
- Date: Tue, 23 Feb 2016 15:30:57 -0800
- To: Jan-Ivar Bruaroey <jib@mozilla.com>
- Cc: Martin Thomson <martin.thomson@gmail.com>, Harald Alvestrand <harald@alvestrand.no>, "public-media-capture@w3.org" <public-media-capture@w3.org>
- Message-ID: <CAJrXDUF+PpYsuB+NmBVoeonqJAwU3Yv9m4QE+r4KXJx3wv5bUA@mail.gmail.com>
I'm glad that you have given an example of where this all actually matters. Thank you for that. So now we know what the design trade-off is. Our options are: A. Make an API that prevents errors from occurring when foo(bar) is expected to mean foo(bar, false), at the cost of making the API call worse (for example, addTransceiver({send: "inactive"}) instead of addTransceiver({send: true})). B. Make the API call better (for example, createDataChannel({ordered: false}) instead of createDataChannel({order: "unordered"}) at the cost of making it possible to have errors when foo(bar) is expected to mean foo(bar, false). My opinion: B is better than A. I have no sympathy for someone calling foo(bar) and expecting it to be the same as foo(bar, false). This is JS, which does all kinds of bizarre things with undefined/false values, and that's just asking for pain. For example, what if foo() does addition? function foo(bar, baz) { return bar + baz; } foo("bar") // "barundefined" foo("bar", false) // "barfalse" foo(1, undefined) // NaN foo(1, false) // 1 Not the same! On Sun, Feb 21, 2016 at 8:31 AM, Jan-Ivar Bruaroey <jib@mozilla.com> wrote: > On 2/21/16 11:01 AM, Jan-Ivar Bruaroey wrote: > > On 2/20/16 2:36 AM, Peter Thatcher wrote: > > So how are we better off with an enum in this case? > > > Because there's precedent for expecting undefined to be interpreted as > false [1], and no such precedent for strings? > > > For example, imagine this code in your company's source tree written by > someone else: > > function foo(label, ordered) { > pc.createDataChannel(label, {ordered: ordered ? true : false }); > } > > then someone touching that area might feel compelled optimize it to: > > function foo(label, ordered) { > pc.createDataChannel(label, {ordered: ordered }); > } > > except today they'll unwittingly have introduced a bug, because elsewhere > in the tree people readily expect these two calls to mean the same: > > foo("label", false); > foo("label"); > > and in the second case, the person touching the code will have subtly > changed data channels to be ordered, which was not their intent. > > If instead the code looked like this: > > function foo(label, ordered) { > pc.createDataChannel(label, {ordered: ordered ? "ordered" : > "unordered" }); > } > > then there is no obvious optimization. > > .: Jan-Ivar :. > >
Received on Tuesday, 23 February 2016 23:32:06 UTC