http://wiki.dlang.org/DIP25

Steven Schveighoffer via Digitalmars-d digitalmars-d at puremagic.com
Mon Jan 5 14:04:58 PST 2015


On 1/5/15 4:10 PM, Walter Bright wrote:
> On 12/30/2014 4:14 AM, Steven Schveighoffer wrote:
>> But I agree. The problem is, most times, you WANT to ensure your code
>> is @safe
>> pure nothrow (and now @nogc), even for template functions. That's a
>> lot of
>> baggage to put on each signature. I just helped someone recently who
>> wanted to
>> put @nogc on all the std.datetime code, and every signature had these 4
>> attributes except a few. I tried to have him put a big @safe: pure:
>> nothrow:
>> @nogc: at the top, but the occasional exceptions made this impossible.
>
> The way to do it is one of:
>
> 1. reorganize the code so the non-attributed ones come first
>
> 2. write the attributes as:
>
>     @safe pure nothrow @nogc {
>        ... functions ...
>     }
>
>     ... non attributed functions ...
>
>     @safe pure nothrow @nogc {
>        ... more functions ...
>     }

To give you an example of why that sucks, imagine that your accessor for 
member_x is nothrow, but your setter is not. This means you either "make 
an exception", or you just split up obvious file-mates into separate 
corners. Source control gets confused if one of those attributes 
changes. Nobody is happy.

Grouping by attributes is probably one of the worst ways to have 
readable/maintainable code.

One of the most important reasons why unittests are so successful is 
that you can just plop the code that tests a function right next to it. 
So easy to find the code, so easy to maintain when you change the target 
of the test. Making some way to bundle attributes, or be able to negate 
currently one-way attributes would go a long way IMO.

-Steve


More information about the Digitalmars-d mailing list