Erik Reppen wrote:
Well, I was thinking !== null for most tests I guess but I could see
potential for typeof in the simpler methods that return other stuff.
So by this standard would:
'squirrel'.match(/wombat/);
be better if it returned an empty array rather than null?
Probably not. Again, the main consideration is usability. If you want to
catch mismatch -- and regexp matchers do, often -- then with an empty
array on mismatch, you'd have to write
var m = r. match(s);
if (m.length == 0) { /* mismatch handling here */ }
or trickier equivalents, but not
if (!m) { /* mismatch handling here */ }
While empty array does convert to empty string, the match array in
general is not used as a concatenation part. Any captured groups would
add extra elements to the array, and a /g flag would make all the
matches pop out. The "blind concatenation" use-case isn't there, in my
experience.
Experience is what drivers good API design, namely user experience and
usability. Most match users want to know about mismatch and handle it.
Whether mismatch is "failure" or "fallback", it's a fork in the
program's control flow, most of the time.
This is much less so the case with charAt.
If that's the case, then I guess I wanted to clear the forest for the
sake of a few missing trees.
Systematizing a-priori based on a theory of failure or a one-true OOB
return value is probably a mistake. Sometimes -1 works, other times "",
yet others null or even a thrown exception. The design depends on the
particulars. Channel Aristotle, not Plato.
In what cases does a null-returning method make sense from a
language-design-perspective? Or is null also a side-effect of not
having try/catch from the start?
Null has its uses. If you think of undefined as "no value" and null as
"no object" and use undefined for any-value-returning methods, and null
for maybe-object returning methods, you won't go too wrong.
/be
On Thu, Aug 16, 2012 at 4:47 PM, Brendan Eich <[email protected]
<mailto:[email protected]>> wrote:
Andreas Rossberg wrote:
On 16 August 2012 00:35, Rick Waldron<[email protected]
<mailto:[email protected]>> wrote:
On Wed, Aug 15, 2012 at 6:02 PM, Erik
Reppen<[email protected]
<mailto:[email protected]>> wrote:
This topic has probably been beaten to death years
before I was even aware
of es-discuss but it continues to get mentioned
occasionally as a point of
pain so I thought I'd see if I couldn't attempt to
hatch a conversation and
maybe understand the design concerns better than I
likely do now.
Consistent Type Return for Pass and Fail?
The principle of consistent type-return has
occasionally skewered me as
somebody who came to non-amateur levels of
understanding code primarily
through JavaScript. I can see the value in maintaining
consistent types for
positive results but not so much for indicators that
you didn't get anything
useful. For instance:
* [0,1].indexOf('wombat'); //returns an index on
success or -1 to
indicate failure. -1 passed on to a lot of other array
methods of course,
indicates the last element. If you'd asked me the day
I made that mistake I
could have told you indexOf probably returns -1 on
failure to find something
but it didn't occur to me in the moment.
It would be far worse to have a different type of value as
a return, right?
Actually, no. It is far better to have something that produces
failure
as immediately and as reliably as possible when used improperly.
Sentinel values are a prominent anti-pattern.
Spoken like a true ML'er :-P. Also, you mention failure and it's
true that lack of try/catch in original-JS and ES1&2 meant APIs
had to overload return values with out-of-band failure codes.
However, JS hackers do not write refutable match expressions
cracking return value using typeof or better. *That* is the
anti-pattern here.
-1 as an out-of-band (for non-negative indexes) return code is
actually easier to test and works well with certain code patterns,
compared to a differently typed code. JS is not alone here, tons
of precedent even in other dynamic languages that do have
try/catch and even matching.
The issue is "failure". Sometimes not finding the wanted character
index is not failure but just a condition to test that leads to an
alternative strategem. Then the conciseness and clarity of the
test matters, and typeof rv != "number"is the wrong tool compared
to rv < 0.
However, I agree that there is no chance of fixing that for
existing libraries.
That's another thing. Deviating from existing patterns for new
APIs that have similar names and motivations is going to be a pain
for some users. It's not obvious to me that we have a real
"failure must be prompt" problem here that justifies breaking with
convention.
/be
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss