In-Place Or Operator Methods?
Written by Ian Elliot   
Article Index
In-Place Or Operator Methods?
Solution

 

Solution

This is a very silly problem. It all comes down to a careful interpretation of what the Add method actually does. The programmer who had made the mistake had in his head:

"The Add method adds 12 hours to the date stored in t1"

And it clearly does because the test

if(t1.Add(new TimeSpan(12,0,0))>EndDate){

works perfectly.

In fact what he should have had in his head was:

"The Add method adds 12 hours to the date stored in t1 and then returns a brand new TimeDate object"

Now it all makes sense.

When you do

if(t1.Add(new TimeSpan(12,0,0))>EndDate){

it is the temporary object that is created by the Add method that is used to compare with EndDate and so it all works. However when you do:

t1.Add(new TimeSpan(12, 0, 0));
if(t1>EndDate){
Do something as the task nearly over
}

the new object created by Add is just thrown away and t1 doesn't change.

You can easily see that this is the case by writing:

t1.Add(new TimeSpan(12, 0, 0));
Console.WriteLine(t1);

and noticing that t1 hasn't changed.

It becomes even more obvious when you consider the operation written in terms of the overloaded "+" operator. For example, you would never write:

TimeSpan d1=new TimeSpan(12, 0, 0);
t1 + d1;

as it is obvious that the + operator doesn't modify t1 and you are clearly throwing away the result of an expression - something that C# doesn't allow so you will also see an error message.

The solution to the problem is obvious - just be aware that the Add method doesn't modify the object it is a member of.

csharp

Pattern

It is all to easy too write this problem off as trivial. In fact it reveals a lot about the way we think of things in procedural programming and in object-oriented programming. For example, when you first start writing code you quickly learn:

data=data+1;

and understand the idea of assignment in action. Notice that a mathematical interpretation of the above results in a deduction: i.e. if x=x+1 then 0=1 which is of course nonsense and here you have the distinction between math and programming.

So far so good but then, if you move on to the right programming language, you learn:

 data++;

or

++data;

both of which can be interpreted as telling data to add one to itself.

Moving on to object-oriented programming you then start to think about methods that do things to objects. For example you might invent a Sort method for an array that sorts it into order. For simple efficiency reasons it might never occur to you that the Sort method should return a new copy of the array and leave the original untouched.That is the Sort method actually sorts the original array - this is generally called an "In place Sort" or an in place method.

In-place methods may seem natural when you first start programming but the "always generate a new object" approach is becoming the norm today - partly because we believe that immutability is a good idea and partly to fit in with the operator semantics i.e. methods should be usable as operators.

As already pointed out just as methods can adopt operator semantics by creating a new object as a result so too can operators take on in-place semantics, i.e. ++data and data++

Whatever the reason we do have two conventions - in-place methods and operator methods and it important that you always know which is which.

Banner

More Puzzles

Javascript
The Undefined Defined Variable

Here's a teaser that poses a practical problem - one that's happened in everyday Javascript programming. See if you can work out the answer before looking at its solution and the pattern to follow to  [ ... ]


Sharpen Your Coding Skills
Sharpen your Coding Skills - Elevator Puzzle

Introducing Melvin and Bugsy, characters who figure in a series of challlenges from Joe Celko. Sharpen your coding skills with puzzles that will both amuse and torment you.


Javascript
Stringy Objects

A Programmer's Puzzle in which we contemplate situations in which string equivalence in Javascript is clearly not what it seems - and explain why it all goes wrong.


Other Articles

<ASIN:1871962714>