Checking function parameters in Phobos
Simen Kjærås
simen.kjaras at gmail.com
Wed Nov 20 16:16:00 PST 2013
On 20.11.2013 19:30, Dmitry Olshansky wrote:
> 20-Nov-2013 22:01, Simen Kjærås пишет:
>> On 20.11.2013 18:45, Simen Kjærås wrote:
> [snip]
>>> May I suggest:
>>>
>>> struct Validated(alias fn, T) {
>>> private T value;
>>> @property inout
>>> T get() {
>>> return value;
>>> }
>>
>> Uh-hm. Add this:
>> alias get this;
>>
>
> And it decays to the naked type in a blink of an eye. And some function
> down the road will do the validation again...
And guess what? That's (often) ok. It's better to do the validation once
too many than missing it once.
The point (at least in the cases I've used it) is to enforce that only
validated values are passed to functions that require validated strings,
not that validated values never be passed to functions that don't really
care. Doing it like this also lets you call functions that take the
unadorned type, because that might be just as important.
The result of re-validating is performance loss. The result of missed
validation is a bug. Also, in just a few lines, you can make a version
that will *not* decay to the original type:
struct Validated(alias fn, T) {
private T _value;
@property inout
T value() {
return _value;
}
}
// validated() is identical to before.
Sure, using it is a bit more verbose than using the unadorned type,
which is why I chose to make the original version automatically decay.
This is a judgment where sensible people may disagree, even with
themselves on a case-by-case basis.
--
Simen
More information about the Digitalmars-d
mailing list