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.
ProGet’s got you covered with security and access controls on your NuGet feeds. Learn more.