Thursday, April 16, 2009

C# - Keep me from hurting myself

I just fixed a funny bug where it was behaving very odd and it was because I had a return statement where I intended to have a continue. I musta looked at that line a dozen times and did not think anything of it. Just went back to the basics of debugging and ran through the code line by line, iteration by iteration. What an embarassing relief!

[Upon further reflection]
What if there was new language feature that made this less likely to happen. Does it help readability and/or intent? Take the following loop.

foreach (var i in theCollection)
{
if (i.Visible == false)
continue;

// other code goes here
}

What if I could change the syntax to something like this...

foreach (var i in theCollection)
except i.Visible == false
{
// other code goes here
}

Upon futher thought what if I just used LINQ instead?

var iVisible = theCollection.FindAll( i => i.Visible)

foreach( var i in iVisible)
{
// other code goes here
}

Not to bad from a syntax point of view. I don't like that I am making a shallow copy of the original list for the purposes of only iterating through it. The language extension above works on the original list.

Monday, April 6, 2009

Pattern for Extension Methods?

The more extension methods I see and write the more I am starting to see a loose pattern forming. If I write an extension method for IQueryable then why not write something similar for IEnumerable. Sure the implementation is different, but from the outside they both feel similar. Take for instance Distinct; why only have that on IQueryable? I ended up writing my own, which was not a big deal, but byt the time I finished all the tests and a quick peer review I had spent almost a 4 hours. Not to metion the email & SharePoint entry to everyone else in the org announcing a new release of the our extensions dll. Not bad, but just distracting. Here is the code for anyone that is interested. Sorry about the formatting, this editor is pretty lame for code.

///
/// Takes a List of type and a function as the key selector
/// and returns a unique list of .
///

/// A class instance that uniquely identifies the current item. Strings work well.
/// The type of items in the target and return lists.
/// The input list. Not changed by this method.
/// The function that returns a KEY that uniquely identifies the current item
/// A list of where every item is unique by KEY
///
/// List<MyClass> aDistinctList = aTargetList.Distinct( i => i.Id);
///

///
///
/// Worth noting that there is a distinct method on the IQueryable<T>, but this does not work
/// on List<T>. This is an entirely different implementation form that method.
///

///
/// The order of the original list is maintained, only duplicats are removed.
///

///

public static List Distinct(this List pList, Func pGetUniqueKeyFunc)
{
if (pGetUniqueKeyFunc == null)
throw new ArgumentNullException("pGetUniqueKeyFunc");

if (pList == null pList.Count == 0)
return new List(0);

var aDistinctKeyHash = new Hashtable(); // the list of unique keys - used for lookup
var aDistinctItemList = new List();

// go thru each item in the source list and get the key for that item from the delegate
// if the key does not exist in the hashtable then add it to the hashtable and the item return list
// rinse - repeat...
foreach (var aItem in pList)
{
var aKey = pGetUniqueKeyFunc.Invoke(aItem);

if (!aDistinctKeyHash.ContainsKey(aKey))
{
aDistinctKeyHash.Add(aKey, aItem);
aDistinctItemList.Add(aItem);
}
}

return aDistinctItemList;
}

eReading

Yes I have a couple of free minutes today. Just clearing some stuff out of my Inbox that has accumulated over the last 5 weeks of pounding out a cool POC.

A bunch of people here at work have bought a Kindle. A good friend uses his for both technical and personal reading. He was about to buy a v1 Kindle and opted to wait for v2. So far he is still on board. It gets me wondering if I would really use one or whether I just like the cool factor.

Honestly, I am not feeling like I would use it very much and it would be relegated to the long list of toys I end up giving away. Why? Because there are very few technical books I actually read cover to cover. I do much more browsing, skipping and flipping all of which just don't work in the e-mediums. I still like the feel of books. I like to highlight and write in the margins. I like to flip through a book I have not picked up in a while and find something new or something I marked up previously.

Take Safari. Every programmer here at work has a Safari membership. Nice. But I just don't use it that much for actually reading books. In fact when I talked to the Safari folks originally; their main use case is not for eReading but rather for finding answers to questions or topics.

My other use case for Safari is what I used to used Borders and Barnes & Noble for - to check a book out before I buy it. This is sweet. First to Safari, then to a discount book seller or Amazon to buy it used (love this).

What I am currently reading

...Pragmatic Thinking and Learning: Refactor Your Wetware

I am only 50% through. No code samples or object diagrams in this book. It's more about how to approach what I do as opposed to specifically how to do it. I like have been thinking more about this myself and am finding this book very interesting.

I liked the book by the same author (with others) called Pragmatic Programmer. Bernie turned me onto that book when it first came out and I recommend it highly. It's still as pertinent as the day it was written.

Twitter

I finally bit the bullet and signed up for Twitter. I have no expectations of finding any value in this, but I wanted to at least say I gave it a try. It's also one of the few networking sites that is not currently blocked by our corporate firewall (LinkedIn is the other one). As a side note, eBay is not blocked either - sometimes I just don't understand the corporate mentality. Like we are buying our office supplies on eBay. Now that would be funny.

Blogging from the Enterprise

I have not blogged in some time and was lamenting the fact all weekend. It's not that I don't want to it's just that I don't know what to say - and I have plenty to say.

When I created this blog (and it's previous incarnation) it was my intention to use it as a public forum for professional things only - little to no personal stuff. At that time I owned my own company and .NET was still in beta; so there was plenty to write about. I did not want to just link to what other people said unless I thought I could add value in some way; whether by commenting or contributing value.

For the last 3 years I have worked for a Fortune 100 (probably lost a notch or two given our current valuation) company and it feels like there isn't much I can write about. So much of what I do can be considered "sensitive" or a "competitive advantage". We are in a highly competitive financal world that is currently under a great deal of pressure (I work for an Investment Mgmt company). Add to this the increase of patent applications and infringement cases and it creates a challenging situation.

I am going to try harder to find the line and just be sure to err on being conservative about what I say. Hopefully it still means something.