Matteo's company hired a Highly Paid Consultant. The HPC came in, took one look at their C# codebase, and said, "You're doing everything wrong. But don't worry, I can fix it!"
So he "fixed" it.
For example, what if you had a string
, and needed to parse it to some concrete type. Why, you just do this:
public static T ToType<T>(this string value, T defaultValue)
{
if (string.IsNullOrEmpty(value))
{
return defaultValue;
}
T result = defaultValue;
try
{
result = (T) Convert.ChangeType(value, typeof (T));
}
catch
{
}
return result;
}
This particular code doesn't do very much at all- a basic null
check followed by an attempt to convert, a swallowed exception and a default value output. There are built-in methods, like Int32.TryParse
, but that wouldn't work well with using generics. I don't love it, but it's not WTF.
public static T? ToNullable<T>(this string value) where T : struct
{
if (string.IsNullOrEmpty(value))
{
return null;
}
T? result = null;
try
{
result = (T) Convert.ChangeType(value, typeof (T));
}
catch
{
}
return result;
}
It's the same method, but this time where the default value is a nulled nullable. The real bonus here is that this time, they qualified the generic to require it to be a struct
- which in C# terms actually requires it to be a "value type". Which, as an aside, Convert.ChangeType
requires its type parameter to be a value type- which means for consistency, they probably should have put that qualifier on ToType
.
Again, this code, alone, isn't really a full on WTF. So we need to put it into context: this is the Highly Paid Consultant's home-grown JSON library, which handles both parsing and generating JSON.
Now, we're getting the sense that someone's been reinventing the wheel, awkwardly. So let's look at one last method- ToJS
. What do you think ToJS
does? If you said, "clearly, this must be what converts an object to JSON", you'd be wrong.
public static string ToJS(this string text)
{
return text.Replace(@"\", @"\\")
.Replace(@"'", @"\'")
.Replace("\"", "\\\"");
}
This just escapes your strings for you.
There's one last piece of context: all of the code this developer wrote, every method that could throw an exception had a handy, dandy, exception handler. That handler logged the exception and did nothing else.
Like a damp fart, the HPC hung around the office for awhile, and then slowly dissipated to another contract. The stench, however, is going to take Matteo some scrubbing to remove.