|
Not really an answer for the question you asked, but just a comment about error handling. A good strategy to avoid endless nested checks in error handling is to handle the opposite case first. So instead of writing
Test.NotNull(myObject);
if (myObject != null)
{
Test.NotNull(myObject.MyProperty);
if (myObject.MyProperty != null)
Test.IsPositive(myObject.MyProperty.Id);
...
}
we would have
Test.NotNull(myObject);
if (myObject == null)
return;
Test.NotNull(myObject.MyProperty)
if (myObject.MyProperty == null)
return;
Test.IsPositive(myObject.MyProperty.Id);
...
|
|
|
|
|
Not sure how that counts as handling the opposite case first, but I see what you mean and I do do that, though I do try and have only 2 exit points in a routine: 1 at the top when input fails, and the return at the end.
Hence my thought that it would be nice having a single chained line at the top.
All good discussion though. I love it.
cheers,
Chris Maunder
The Code Project | Co-founder
Microsoft C++ MVP
|
|
|
|
|
Sorry, I should have meant "handle the error case first and exit as soon as possible", even if this "as soon as possible" will only occur in the middle of the function. Usually I don't have problems with multiple exit points in a function. Those are particularly useful, for example, when implementing a syntax parser from a LL(1) grammar.
Another situation may happen, for example, if you are in the middle of a very nested loop and would like to exit them all. Refactoring the loop into its own function and using a return is often one of the clearest ways to quit all loops at once, specially in comparison with the alternative which is to maintain quite a number of done variables guarding the loop exits as in
for (int i = 0; i < n && !done; i++)
By the way, another sensible alternative for this case is also to use a goto statement, this being one of the few justified cases for using it.
I know this doesn't have anything to do with your question either, but I am just keeping up the discussion
|
|
|
|
|
Chris Maunder wrote: I was thinking it would be really cool to be able to do
Test.NotNull(myObject).NotNull(myObject.MyProperty).IsPositive(myObject.MyProperty.Id);
You can do that with extension methods!
Just saying!
My programming get away... The Blog...
Taking over the world since 1371!
|
|
|
|
|
Chris Maunder wrote: So this got me thinking: You can do
if (myObject != null && myObject.MyProperty != null)
because of short circuit boolean evaluation in C#, but I was wondering, with my fairly mainstream experience in languages, if there are languages out there that would allow chaining of methods with short circuit evaluation.
Well, I find myself doing a lot of those kind of checks and it would save me a lot of time and potential bugs if there was such a language. But now you have just stimulated me to think about a general purpose solution in C#. Maybe if I find something I'll post it on tips and tricks.
To alcohol! The cause of, and solution to, all of life's problems - Homer Simpson
----
Our heads are round so our thoughts can change direction - Francis Picabia
|
|
|
|
|
It might be simpler to just push the test down into a function call.
This keeps the calling method simple, making the code more understandable and maintainable. Anyone maintaining the code doesn't have to reason about a unique control structure, and can skip all the details to focus on the overall algorithm. If they're curious about the test, they can optionally browse the testing function.
The chaining looks cool, but is more complex than a sequence of plain, vanilla, if statements.
|
|
|
|
|
Actually, there is something like that.
It's called Embarcadero Prism (ex Delphi Prism). Borland made Delphi Prism using the Oxygene language (ex Chrome) through some agreement with RemObjects Software. Borland needed it as a .NET language replacement for the trully crappy Borland Delphi.NET.
Check this beauty out: http://wiki.oxygenelanguage.com/en/Oxygene_by_Example_-_Colon_and_Null
modified 11-Jan-13 20:00pm.
|
|
|
|
|
Test.NotNull(myObject).NotNull(myObject.MyProperty).IsPositive(myObject.MyProperty.Id);
You can't possibly call this cool. This is a code janitor's nightmare. If any part of that fails, you don't know what has failed so you end up breaking it down into
aa = Test.NotNull(myObject);
bb = aa.NotNull(myObject.MyProperty)
cc = bb.IsPositive(myObject.MyProperty.Id);
to see what is falling over.
Cool is only for those who make a mess then disappear off to another job and leave someone else to tidy up their mess. They've never had to maintain the crap they generate and they find it difficult to understand, let alone maintain someone else's mess. This means that you have to hire an expensive janitor to unravel the coolness.
You really don't want cool - you want maintainability so you can hire a cheap code janitor (fresh graddy).
|
|
|
|
|
I was discussing a concept, not presenting production code.
cheers,
Chris Maunder
The Code Project | Co-founder
Microsoft C++ MVP
|
|
|
|