On Tue, 10 Nov 2009 18:49:54 -0500, Andrei Alexandrescu <seewebsiteforem...@erdani.org> wrote:

I think the best option for toString is to take an output range and write to it. (The sink is a simplified range.)

Bad idea...

A range only makes sense as a struct, not an interface/object. I'll tell you why: performance.

Ranges are special in two respects:

1. They are foreachable. I think everyone agrees that calling 2 interface functions per loop iteration is much lower performing than using opApply, which calls one delegate function per loop. My recommendation -- use opApply when dealing with polymorphism. I don't think there's a way around this. 2. They are useful for passing to std.algorithm. But std.algorithm is template-interfaced. No need for using interfaces because the correct instatiation will be chosen.

If you are intending to add a streaming module that uses ranges, would it not be templated for the range type as std.algorithm is? If not, the next logical choice is a delegate, which requires no vtable lookup. Using an interface is just asking for a performance penalty for not much gain.

Here's what I mean by not much gain: I would expect a stream range that does output to have a method in it for outputting a buffer (I'd laugh at you if you wanted to define a stream range that outputs a character at a time). So the difference between:

x.toString(outputRange, format)

and

x.toString(&outputRange.sink, format)

is pretty darn minimal, and if outputRange is an interface or object, this saves a virtual call per buffer write. Plus the second form is more universal, you can pass any delegate, and not have to use a range type to wrap a delegate.

Don't fall into the "OOP newbie" trap -- where just because you've found a new concept that is amazing, you want to use it for everything. I say this because I've seen in the past where someone discovers the power of OOP and then wants to use it for everything, when in some cases, it's overkill. Just look at some Java "classes"...

From another thread:
Walter does not feel strongly about Phobos.

Huh? I feel like this sentence doesn't make sense, so maybe there's a typo.

-Steve

Reply via email to