Design by contract
October 24, 2007Something that was bothering me for a while now was writing the following piece of code over and over again:
public void DoSomething(Request request)
{
if(null == request)
{
throw new ArgumentNullException("request");
}
}
Last week, I decided to do something about it. In a previous post, I mentioned the concept of a fluent interface. So, I tried using it while finding a solution for writing this kind of boilerplate code. While I was half way through, I found this post from Sean Chambers (via DotNetKicks) that describes (almost) the same solution as I was developing using fluent interfaces. Although he beat me to it, his post confirmed that I was on the right track. Here goes ...
Instead of writing the code above, I can now write this:
public void DoSomething(Request request)
{
// Throws ArgumentNullException
Check.Argument(request, "request").IsNotNull();
}
I also created a couple of other checks:
Strings
public void DoSomethingElse(String request)
{
// Throws ArgumentException
Check.Argument(emptyString, "request")
.IsNotNullAndNotEmpty();
}
or
public void DoSomethingElse(String request)
{
// Throws ArgumentException
Check.Argument(emptyString, "request")
.IsNotNullAndNotEmptyAndNotWhiteSpace();
}
Collections
public void DoSomethingElse(ICollection requests)
{
// Throws ArgumentException
Check.Argument(requests as ICollection, "requests")
.IsNotNullAndNotEmpty();
}
or
public void DoSomethingElse(ICollection<String> requests)
{
// Throws ArgumentException
Check.Argument(requests as ICollection<String>, "requests")
.IsNotNullAndNotEmpty();
}
Enums
public void DoSomethingMore(DayOfWeek dayOfWeek)
{
// Throws InvalidEnumArgumentException
Check.Argument(dayOfWeek as Enum, "dayOfWeek")
.IsValidEnumValue();
}
Value types
public void DoSomethingMeaningfull(Int32 someNumber)
{
// Throws ArgumentOutOfRangeException
Check.Argument(someNumber, "someNumber").IsNotNegative();
}
or
public void DoSomethingMeaningfull(Int32 someNumber)
{
// Throws ArgumentOutOfRangeException
Check.Argument(someNumber, "someNumber").IsNotPositive();
}
or
public void DoSomethingMeaningfull(Int32 someNumber)
{
// Throws ArgumentOutOfRangeException
Check.Argument(someNumber, "someNumber").IsNotZero();
}
You can download the code here. Please let me know what you think. I would love to hear your feedback. It's the only way I will ever learn how to become good programmer.
If you and your team want to learn more about how to write maintainable unit tests and get the most out of TDD practices, make sure to have look at our trainings and workshops or check out the books section. Feel free to reach out at info. @ principal-it .be
Jan Van Ryswyck
Thank you for visiting my blog. I’m a professional software developer since Y2K. A blogger since Y2K+5. Provider of training and coaching in XP practices. Curator of the Awesome Talks list. Past organizer of the European Virtual ALT.NET meetings. Thinking and learning about all kinds of technologies since forever.
Comments
Writing Maintainable
Unit Tests
Watch The Videos
Latest articles
-
Contract Tests - Parameterised Test Cases
June 28, 2023
-
Contract Tests - Abstract Test Cases
April 12, 2023
-
Contract Tests
February 1, 2023
-
The Testing Quadrant
June 15, 2022
-
Tales Of TDD: The Big Refactoring
February 2, 2022
Tags
- .NET
- ALT.NET
- ASP.NET
- Agile
- Announcement
- Architecture
- Behavior-Driven Development
- C++
- CQRS
- Clojure
- CoffeeScript
- Community
- Concurrent Programming
- Conferences
- Continuous Integration
- Core Skills
- CouchDB
- Database
- Design Patterns
- Domain-Driven Design
- Event Sourcing
- F#
- Fluent Interfaces
- Functional Programming
- Hacking
- Humor
- Java
- JavaScript
- Linux
- Microsoft
- NHibernate
- NoSQL
- Node.js
- Object-Relational Mapping
- Open Source
- Reading
- Ruby
- Software Design
- SourceControl
- Test-Driven Development
- Testing
- Tools
- Visual Studio
- Web
- Windows
Disclaimer
The opinions expressed on this blog are my own personal opinions. These do NOT represent anyone else’s view on the world in any way whatsoever.
About
Thank you for visiting my website. I’m a professional software developer since Y2K. A blogger since Y2K+5. Author of Writing Maintainable Unit Tests. Provider of training and coaching in XP practices. Curator of the Awesome Talks list. Thinking and learning about all kinds of technologies since forever.
Latest articles
Contract Tests - Parameterised Test Cases
Contract Tests - Abstract Test Cases
Contract Tests
The Testing Quadrant
Contact information
(+32) 496 38 00 82
info @ principal-it .be