In-Place Or Operator Methods? |
Written by Ian Elliot | |||
Page 1 of 2 This particular C# puzzle is one of those that involves an error that no self respecting programmer would make... but are you so sure. If you use the DateTime class regularly then sure, you not only won't make the mistake you will spot the nature of the problem in no time at all. On the other hand if you browse the .NET framework and only venture into DateTime when needed then it really is the sort of problem that occurs often and even repeatedly if you leave it long enough! BackgroundObject-oriented programming is wonderful because objects can encapsulate the data and provide the methods to work with it. The methods are the verbs that do things to the objects and this is fine. There are some minor difficulties when more than one object is involved in an operation - then which object does the "verb" belong to? Even worse is when an operation is between objects of different types. Now consider the DateTime object. It has an Add method which takes a TimeSpan object and adds the interval it represents to the current date and time stored in the DateTime object. It is a bit messy but it works and you very quickly get used to it. For example: DateTime t1 = DateTime.Now; This creates a DateTime object with the current date time and then adds 12 hours to it as you can confirm if you examine the date printed. Yes it really is this simple. PuzzleAs always with a puzzle the actual details of the code that caused the real problem have been reduced down to the very minimum necessary. This should allow you to see the problem more quickly and without any diversions to waste your time. The program that caused the problem had a date stored in t1 and a date stored in EndDate and only if the end of the task was less than 12 hours away was it worth doing some thing. So the code came down to: if(t1.Add(new TimeSpan(12,0,0))>EndDate){ } This code worked perfectly. Then a bright enthusiastic programmer decided to take the Add operation out of the if statement in an effort to "improve" the code. The result was: t1.Add(new TimeSpan(12, 0, 0)); No error messages or warnings were produced but now the code didn't work. Even if t1 plus 12 hours was beyond the EndDate nothing ever got done! Why? And is there a fix? Turn to the next page when you are ready to find out. <ASIN:1871962714> |