Safe Cursors and Ranges

Jonathan M Davis jmdavisprog at gmail.com
Thu Aug 26 16:09:03 PDT 2010


On Thursday, August 26, 2010 10:51:02 Andrei Alexandrescu wrote:
> On 8/26/10 9:18 PDT, dsimcha wrote:
> > I'm starting to think that the whole concept of ranges is starting to get
> > too complicated.  We're already seeing it with this moveFront() stuff
> > that's a special case to deal with structs that have expensive
> > postblits.  We need a healthy dose of "worse is better" to throw at
> > ranges.  IMHO generic code should solve 90% of the problem in a way
> > that's robust, not terribly hard to implement and easy to use and
> > understand.  Trying to solve 100% of the problem with generic code means
> > that your solution will be absurdly complicated in both interface and
> > implementation, and therefore will be a buggy POS that nobody can figure
> > out how to use.
> 
> [...]
> 
> > It's better to have ranges that can solve 90% of the problem for the most
> > competent 80% of programmers than ranges that can solve 100% of the
> > problem, but only for the 1% who are hardcore gurus.
> 
> I'm weary of this philosophy. I've seen a phenomenon happen time and
> again with myself and others: you hit a 10% case exactly when you (a)
> know what you want to do, (b) you know that the library could and should
> help you, and (c) you are working on a difficult enough problem to be
> wary of implementing it by hand.

I think that what it comes down to is that you need to be smart about what 
functionality that you do and don't include. David has an excellent point that 
when APIs become too complicated, they don't get used. For instance, I know 
_very_ few people who even _consider_ using C++'s algorithm library. It's just 
too hard to use. It has too many quirks (like how remove() works) and the lack 
of lambdas functions makes it incredibly painful to do simple things with it. 
Any library with much complexity is going to run into such issues, but they need 
to be minimized for a library to be properly useable. We can't afford to make 
ranges too complex. They need to be reasonably useable by your average 
programmer.

Any time that we need to add functionality to make them do more, we need to 
weigh the benefits and costs. If adding ability X makes it possible to do thing 
Y, but only a few people need to do thing Y, and adding feature X greatly 
increases the complexity, then it probably shouldn't be added. On the other 
hand, if adding feature X doesn't add much complexity and/or a lot of people 
need to do thing Y, then it would likely be a good thing to add feature X.

If we find something that a lot of people are trying to do and can't, then we 
need to really look at a reasonable way to make it possible. However, there are 
limits to what you can do without making Phobos' APIs unreasonably complex to 
understand and use. I do _not_ think that we should necessarily be hitting the 
100% case. The cost for that is likely too high. However, we probably should be 
going for more like the 98% or 99% case. (after all 90% indicates that 1 out of 
10 things that you try to do won't be feasible, and that's actually a lot, much 
as 90% sounds like a big number).

So, I do think that we should be making ranges (and the rest of Phobos) as 
powerful we reasonably can, but there _are_ limits to what they can reasonably 
do, and we should not necessarily try to make it so that they can do absolutely 
everything. And when we do make ranges more powerful, we need to strive to limit 
the increase to complexity as much as possible. Ultimately, ranges really should 
be powerful enough to do virtually everything that you would normally do with 
iterators (along with what they can do that iterators can't), but they should 
also be useable by the average programmer. Whatever we do needs to reasonably 
balance those goals. And I think that there is legitmate concern that ranges are 
risking becoming too complex.

- Jonathan M Davis


More information about the Digitalmars-d mailing list