3/19/2010
LifeCycle Solutions - Home ( the software development blog )
 

<March 2010>
SunMonTueWedThuFriSat
28123456
78910111213
14151617181920
21222324252627
28293031123
45678910

Subscribe to this feed:

RSS 2.0 | Atom 1.0 |CDF






Thursday, February 26, 2009

I've recently started playing with NDepend again.  This tool is a sort of data mining utility for your code.  Feed it your assemblies and it can tell you almost anything about them.  Using a custom query language with a SQL-like syntax, you can dig into all sorts of metrics and useful information. Out of the box, it ships with tons of useful queries for common code problems. 

I ran some of our code through it and got dinged on some of the code complexity queries:

 image

In this case, I had several huge methods that needed to be broken up and optimized.  Thanks to NDepend's prodding, I spent some time refactoring using ReSharper, and whittled those down to 0s:

image

That's helpful, but not nearly everything that NDepend can do.  For example, the code I'm testing with is involved in some multithreading, so with a little digging through the docs, I came up with this query to show all methods that change state (besides property and event setters), but don't use any locks:

WARN IF Count < 0 IN SELECT METHODS WHERE
!IsDirectlyUsing "System.Threading.Monitor" AND ( ChangesObjectState OR ChangesTypeState ) AND
!IsConstructor AND !IsClassConstructor AND !IsPropertySetter AND !IsEventAdder AND !IsEventRemover

This doesn't guarantee thread-safe code, but it definitely helps drill down to potential problem areas.

Another area I can see us using this in is to provide metrics for our customers.  Generally they are not concerned with things like Cyclomatic Complexity, but some simple numbers may be useful.  We use FinalBuilder, so it's possible we could run NDepend's console utility to roll the numbers into some XML and publish to their customer wiki.  For example, here's a quick query to spit out the total number of tests for a project:

SELECT METHODS FROM ASSEMBLIES "TestAssemblyName" WHERE HasAttribute "NUnit.Framework.TestAttribute"

Once we get a customer set up with these metrics, we'll post more about how to automate that.  Until then, go check out NDepend!

Posted by Daniel Root

Wednesday, February 25, 2009

SharePoint is a great product, but one area where it really lacks is in it's Rich Text Editor.  It doesn't work in anything but IE, and doesn't include an image upload feature.  With a little digging, I found this free replacement from Telerik:

http://www.telerik.com/community/free-products.aspx (ASP.NET RadEditor for MOSS Lite)

Installation is non-obvious in the normal sharepoint way:

  • Run stsadmin.exe to install a wsp
  • Deploy in central admin
  • Turn on in site settings -> site features
  • Restart IIS.

It comes with a chm help document (which if you’re using vista you’ll need to unblock to view) that outlines the steps.  To turn on for a Wiki, follow the steps in ‘Using RadEditor in List Items’, and you'll have a much more usable SharePoint Wiki!

Posted by Daniel Root

Friday, February 06, 2009

If you're not familiar with jQuery, it is a JavaScript library that lets you quickly access page elements using CSS-like selectors, and then do common effects, animations, and transformations against those elements.  It nicely brushes away browser-compatibility issues and gives you a clean, simple way to do client-side "stuff". 

It ships in ASP.NET MVC, so I've been using it in one of our first MVC apps, and love it.  What I particularly like, though, is using it to develop 'convention over configuration' for the app's client-side behavior.  Instead of wiring up each individual form element, button, etc., I can declaratively say 'all elements with this class should behave this way.'  This is done once in my site.master, so that in the actual pages, applying a behavior is as easy as including a css class name on an element.

Let's look at some examples.  The first step in most jQuery code is to wire up the document ready function.  This tells the browser to execute some function whenever the document finishes loading, which believe it or not is quite difficult to do in a cross-browser way that plays well with other scripts.  To do this, I have a script in my site.master's <head> section that looks like this:

<script type="text/javascript">
        $(document).ready(function() {
            //TODO: set up conventions
        });
</script>

The dollar is how you select page elements in jQuery.  $(document) says "get the current document" (also non-trivial in un-aided javascript).  You can also use css-like selectors.  For example $("#myButton") will return all elements with the id "myButton".  $(".initialFocus") will return all elements with the class "initialFocus".  Which leads to my first "convention":

$(".initialfocus").focus();

Now, in any page that uses the master page, if a particular field should get focus when the page loads, simply specify the class "initialFocus":

<input type="text" class="initialfocus" name="somefield"/>

Or, in MVC parlance:

Html.TextBox("QuantityDelivered", currentTransaction.QuantityDelivered, new { @class = "initialfocus" })

Which is a nice UI touch, but let's look at something more advanced.  I also want a convention to let me specify that a field can be populated using a pop-up date chooser.  For this, I download the jQuery UI framework, and set up the convention:

$(".shortdate").datepicker();

Similarly, I add 'shortdate' as a class to any textbox, and the date chooser appears on the element.  If I decide I want to change some behavior site-wide, I have one simple place to change it.  For example, I could use one of the dozen other jQuery date pickers, or roll my own.

It's also possible to 'stack' effects.  For example, this application displays informative message as a div with the class name "messageBox".  If one of these appears when the page first loads, it hides after a few seconds.  To accomplish this, you simply 'stack' an "animate" (which in this case is just used as a 5 second delay), followed by a fadeOut:

$(".messagebox")
    .animate({ opacity: 1.0 }, 5000)
    .fadeOut("slow"); 

All told, this particular app currently has 6 'conventions', with more planned:

$(document).ready(function() {
         $(".initialfocus").focus();
         $(".shortdate").datepicker();
         $(".longdatetime").datepicker();
         $(".print").click(function() { window.print(); });
         $(".delete").click(function() { return confirm("This record will be deleted.  Are you sure you want to continue? Click 'Ok' to delete this record or 'Cancel' to stay on this page."); });
         $(".messagebox")
             .animate({ opacity: 1.0 }, 5000)
             .fadeOut("slow"); 
     });
So, go get jQuery, whether or not you're using MVC.  With just a few lines, you can really spice up an application's client-side experience.
Posted by Daniel Root

© 2006 LifeCycle Solutions, LLC | All Rights Reserved