On Tuesday, 11 September 2012 at 13:33:08 UTC, bearophile wrote:
monarch_dodra:

and forces the implementer to think about the required conditions to use the function,

I think this is usually considered a good practice in D, just like using template constraints.

If you look in Phobos, similar situations are handled with static ifs. As example see the several static if used inside MapResult() to disable some of its features:

[SNIP]

Bye,
bearophile

I'd argue it's horrible! Why should the coder bother making these conditional, if calling them would have failed anyways?

The fact that it is done like this in D, I'd argue, is by necessity, not necessarily by good practice.

IMO, being able to do this is a much better alternative:

    @property auto save()
    {
        static assert(isForwardRange!R); //Optional
        auto result = this;
        result._input = result._input.save;
        return result;
    }

It is cleaner and easier on the developer. The exact line that fails is reported (as opposed to "member not found"). An optional static assert can make the reason *why* it failed be bloody explicit.

The last reason why this approach is superior, is because above, "front(T)" *does* exist, but it is implemented as "can't work", and calling it MUST fail. This is different from not having it implemented, which allows a third party to define it via UFCS. In that case though, it would not be enriching the interface, it would be hijacking it.

Reply via email to