How do I use code contracts in .NET 4.0 without making my code look cluttered?
Asked Answered
D

1

8

I have started using Code Contracts and have found that it makes it difficult to immediately spot the 'guts' of a method.

Take this (very simple) example:

public static void UserAddNew(string domain, string username, string displayName)
{
    Contract.Assert(!string.IsNullOrWhiteSpace(domain));
    Contract.Assert(!string.IsNullOrWhiteSpace(username));
    Contract.Assert(!string.IsNullOrWhiteSpace(displayName));

    LinqDal.User.UserAddNew(domain, username, displayName);
}

Now I'm tempted to put the contracts in a region, so that they can be hidden away, but then I'm concerned that I'm losing a nice advantage of being able to glance at the method and see what it expects.

What do you do to keep your contracts 'tidy'? Or am I just being too picky?

Dialyser answered 15/2, 2011 at 8:35 Comment(4)
possible duplicate of: "How do I add new features to my application without making my code look cluttered?"Soerabaja
AFAICT, this is not new or specific to Code Contracts – the method was checking the parameters even before CC, wasn’t it? I don’t have any solution to this apart from a bit of whitespace…Ably
I agree with Mormegil. Before CC you were supposed to write "if(condition) throw new argumentexception".Quarrier
Just a related note, it would make more sense to use Contract.Requires() instead of Contract.Assert() here. Makes a difference in the calling code.Menagerie
Z
6

Have a look at the ContractClass and ContractClassFor attributes. This allows you to write classes with the code contracts in separate assemblies. This allows you to have the contracts available for dev work, doesn't clutter your code and also means you don't have to deploy the contracts with the live code:

Contract Class Attribute

Contract Class For Attribute

Zaller answered 15/2, 2011 at 9:7 Comment(3)
True, but that won't work on the static method he used in his example.Quarrier
Also: deploying the contracts depends on what settings you use in the Code Contracts Property Pane. Just not deploying the Contracts without the right settings will just give you trouble.Quarrier
I'd assume the developer would read the documentation about how to use the feature. :)Zaller

© 2022 - 2024 — McMap. All rights reserved.