|
It seems to be a characteristic of Microsoft programmers, that they want to prove they are clever by producing less readable code.
At times, the attempts at "clever" also makes the code a bug. It took me a week to convince the manager this was a bug:
if ((CurrentThreadCount - StepThreadCount) <= MaxThreadCount) getMoreThreads();
And that was clear-cut code, not even close to "clever". Three to five seconds after I first read it, I saw the bug correction needed:
if ((CurrentThreadCount + StepThreadCount) <= MaxThreadCount) getMoreThreads();
(It did take me about 40 seconds to verify in my mind my first thought for a correction was correct and about 15 minutes to go through the code and verify the names and method did what was suggested.)
What I did like about it was that the variable and method names were so clearly doing what the names suggested was being done.
|
|
|
|
|
Filed under [Clock Cycle Fetish]
|
|
|
|
|
It might not be so bad depending on the context. If this code was ported into C then it might avoid a problem in interpreting what true and false actually are. Then again might have been C code originally and simply copied into place ...
|
|
|
|
|
If you're writing code in which the meaning of true and false are in question, this would be the least of your problems at a guess. I've never experienced such issues, and I code widely in C, C#, C++, JavaScript, occassionally D and Java. I'm assured no such issues are common moving to PHP either by my learned friend.
|
|
|
|
|
I was speaking in the context of C and where some systems have macros defined for TRUE and FALSE. Sometimes I've seen those macros setup as (1==0) and (1==1) or simply 0 and 1 or 0 and -1. On several systems I've worked on GOOD and BAD have been used for an error flag and many programmers might assume GOOD and BAD are true and false and they are not.
As ever with C, if in doubt be as explicit as you can be to avoid the compiler making choices for you. Most of the times you get away with those choices. Sometimes, for example when porting to another platform and compiler, you don't.
Another common problem with porting C code is the difference between short, int, long and long64 (or whatever). What an int could actually be can cause all sorts of problems in porting scenarios.
|
|
|
|
|
OK, by Hall Of Shame standards, this isn't too bad. Still worth sharing...
KeyValuePair<DateTime, string> lastItem;
if (lastItem.Value != null && lastItem.Value.ToString().Trim() != "")
{
Three things jump out at me:
1. Use of empty string literal instead of String.Empty
2. Seperate testing of null and empty string instead of String.IsNullOrEmpty()
3. Calling ToString() on something that is already a string.
#1 and #2 isn't too serious, especially if you consider that you also want to trim the string, so you need to check for null before trying to trim anyway. #3, on the other hand, confuses me. Why would you want to call ToString() on a string?
|
|
|
|
|
Maybe it wasn't always a string?
|
|
|
|
|
I think a coder is stringing you along.
Chris Meech
I am Canadian. [heard in a local bar]
In theory there is no difference between theory and practice. In practice there is. [Yogi Berra]
posting about Crystal Reports here is like discussing gay marriage on a catholic church’s website.[Nishant Sivakumar]
|
|
|
|
|
If the codebase originated from a dotNet1.1 codebase, then the statement makes complete sense because string.IsNullOrEmpty did not exist at that time.
Something that would definitely get updated in a code review: yes,
Horror: close, but not quite.
I wasn't, now I am, then I won't be anymore.
|
|
|
|
|
+1 plus they wouldn't know generics, thus the need to cast to String.
'As programmers go, I'm fairly social. Which still means I'm a borderline sociopath by normal standards.' Jeff Atwood
'I'm French! Why do you think I've got this outrrrrageous accent?' Monty Python and the Holy Grail
|
|
|
|
|
Refactoring Fail.
To match the original functionality what you need is String.IsNullOrWhiteSpace() . String.IsNullOrEmpty(lastItem.Value) will return false if lastItem.Value equals " ". String.IsNullOrEmpty(lastItem.Value.Trim()) will exception if lastItem.Value is null.
My other question would be how old the codebase is? IsNullOrEmpty() wasn't added until .net 2.0; IsNullOrWhiteSpace() wasn't added until 4.0.
I wrote an IsNullOrEmpty() method when I needed one in a 1.1 app; but unless you're doing it in multiple locations there's nothing wrong with inlining.
Did you ever see history portrayed as an old man with a wise brow and pulseless heart, waging all things in the balance of reason?
Is not rather the genius of history like an eternal, imploring maiden, full of fire, with a burning heart and flaming soul, humanly warm and humanly beautiful?
--Zachris Topelius
Training a telescope on one’s own belly button will only reveal lint. You like that? You go right on staring at it. I prefer looking at galaxies.
-- Sarah Hoyt
|
|
|
|
|
1. A wtf? There is no difference according to MSDN[^]
I actually prefer the "" instead of String.Empty, but that's personal taste.
I agree to two and three though, but not everyone knows the IsNullOrEmpty method.
V.
|
|
|
|
|
In .NET 4, there is IsNullOrWhiteSpace[^] as well, which is even more useful!
Ideological Purity is no substitute for being able to stick your thumb down a pipe to stop the water
|
|
|
|
|
Did you scroll down to the end?
VB Programmers: Null means Nothing in this method name
If it means nothing, then why did they put it into the name?
I'm invincible, I can't be vinced
|
|
|
|
|
Yep! And I have no problem with that at all...
Ideological Purity is no substitute for being able to stick your thumb down a pipe to stop the water
|
|
|
|
|
Shouldn't you have said "And I see Nothing wrong with that at all..."?
|
|
|
|
|
Just think about the poor SQL programmer where the standard setting is that "value != null" is always false and as a comparison, "value = null" is also always false.
|
|
|
|
|
I was told that string.Empty doesn't create a whole bunch of new string instances. I will keep that quote from the MSDN guy to hand for next time I'm told using "" is wrong. (I prefer it too because two characters is almost always better then 11 and it's immediately obvious what "" is without actually having to read a word.)
|
|
|
|
|
Yes, I know there's no difference and that it's a matter of personal taste, so the worst that can happen is that it might mildly annoy a maintenance programmer that expected a different coding style. That said, I probably should have mentioned earlier that it happens to be in a codebase in which things like this is discouraged. In fact, string literals in general are discouraged: there should be a separate class full of constants. This means that the code above sticks out like a sore thumb around here.
|
|
|
|
|
Sometimes you just have to make absolutely sure it is a string. And since it is OO programming they could have done this:
lastItem.Value.ToString().ToString().ToString().Trim()
just to make really, really sure.
|
|
|
|
|
I like that! But you know, sometimes you want to be a little more sure than other times. Therefore, I propose the that following method be added:
public static string ConvertToString(object objectToConvert, ulong howSureDoYouWantToBeThatItIsString)
{
string temp = objectToConvert.ToString();
for(ulong n = 0; n < howSureDoYouWantToBeThatItIsString; n++)
{
temp = temp.ToString();
}
return temp;
}
Now ain't that a piece of beauty!
|
|
|
|
|
I like that! I wanted to see how many times that is possible to be looped: 18,446,744,073,709,551,615. That's a few loops.
I figure, on my 2GH machine, that's approximately 272.19712525667353 years. (probably double that because 1 flop per loop and 1 flop per string conversion)
double years = (double)((ulong.MaxValue / int.MaxValue) / (3600 * 24)) / 365.25;
flop = "FLoating point OPeration"
Is it 1 or 2000 flops per string conversion for a 2000 character string?
PS Yes, I'm having fun with people without an understanding of precision too.
|
|
|
|
|
I didn't know about IsNullOrEmpty, and apparently we both didn't know about IsNullOrWhiteSpace which removes the need for Trim.
|
|
|
|
|
Maybe he was thinking of the 'String' theory!
Yeah, I know, it's a groaner.
Attempting to load signature...
A NullSignatureException was unhandled.
Message: "No signature exists"
|
|
|
|
|
Hi guys
im new here but i tough i would share this example of code i encountered a couple months back
in one class
Select field1,field2,field3
From table1
Where type="EDU"
the only fucntion using this result set was coded like this
If(field1=cond1 and field2=con4 and Active=true)
do something
else If(field1=cond1 and field2=con2 and Active=true)
do something
else If(field3=cond10 and field2=con2 and Active=true)
do something else
this went on for like 9 time
now someone added another If lower down in the code but forgot the Active=true hense causing a bug ! now after searching to make sure that the Selqct wasent used anywhere else(the name was a dead give away but you never know)
First off
Select field1,field2,field3
From table1
Where type="EDU" AND Active=True
PLEASE add this AND ... just reducing the result set will bost this application speed has its database was Huge
as for the rest we where not allowed to modify working code but come on 9 inbricked iff with some repeating coditions ....
modified 6-Feb-12 21:04pm.
|
|
|
|