Software Is Hardwork

ISimplicityAffinative: The endless pursuit of anti-complexity.
The technology-centric blog of D. P. Bullington.

Email D. P. Bullington View D. P. Bullington\ Follow D. P. Bullington on Twitter Get Software Is Hardwork code on CodePlex

Blog Post(s)

Source Code Normalization and Diff/Merge
Monday, November 3, 2008

Eclipse IDE and Resharper for Visual Studio both offer a feature which reorders type members and reformats source code based on a configurable coding style. They also offer the ability to share this code style (spacing, tabs, etc) among other developers. I call this reordering and style application source code normalization. Consider the following example from Resharper:

using System;

using System.Web.UI;
using System.IO;


namespace PrettyUrlWeb.js
{
    public partial class Search : Page
    {
        private string data2;

        public string Data2
        {
            get
            {
                return this.data2;
            }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            this.ImageButton1.ImageUrl = System.IO.File.ReadAllText("DATA.URL");
        }

        private int data0;
        private object data1;


        public int Data0
        {
            get{return this.data0;}
        }


        public Search()
        {
        }

        public enum DataModes
        {
            Good,
            Bad,
            Ugly
        }
    }
}

It is clear to see that this code file has been edited by several developers with differing code styles. If apply a code style (as they call it in Resharper) template such as the one I created and use often, the result would be something such as:

using System;
using System.IO;
using System.Web.UI;

namespace PrettyUrlWeb.js
{
    public partial class Search : Page
    {
        #region Constructors/Destructors

        public Search()
        {
        }

        #endregion

        #region Fields/Constants

        private int data0;
        private object data1;
        private string data2;

        #endregion

        #region Properties/Indexers/Events

        public int Data0
        {
            get
            {
                return this.data0;
            }
        }

        public string Data2
        {
            get
            {
                return this.data2;
            }
        }

        #endregion

        #region Methods/Operators

        protected void Page_Load(object sender, EventArgs e)
        {
            this.ImageButton1.ImageUrl = File.ReadAllText("DATA.URL");
        }

        #endregion

        #region Classes/Structs/Interfaces/Enums/Delegates

        public enum DataModes
        {
            Good,
            Bad,
            Ugly
        }

        #endregion
    }
}

An organization can define code reorder/style templates and publish them to developers. Before a developer checks in code edits, they should run the template against their changes to ensure the source code normalized.

There are several benefits to normalized source code: better visual appeal, easier reading and maintainability, ability to region code automatically, uniformity across the organization, and easier diff/merges. The last benefits deserves a bit more discussion.

When source code is normalized, it is becomes naturally easier to diff/merge changes. Lets look a very simple non-code related diff/merge situation. Here we have a list of names in a text file, stored in a source control repository:

Chris
Eric
David
Nick
Todd
Obie
Ryan
David
Rob
Daniel
Michael
Brendan

Now, lets say we need to edit this file, say to add "Heather" and "Kevin", remove "Michael", and change the first "David" to "Dave". The following shows the diff result after an edit of the original non-normalized data and arbitrary positioning of edits:

(Click images for a larger view.)



The following shows the diff result after an edit of an alphabetical ordered normalization of the original data and normalizing of the edits:

(Click images for a larger view.)



Even in this simple example, the normalized diff is easier to read; now scale this in your mind to complex code file and you can see the benefit of normalized source code for ease of diff/merge operations.

0 comments:

Speaking Enagements

  • 11/18/2010 | Charlottesville .NET Users Group | Charlottesville, VA | Topic TBD
  • 09/14/2010 | Hampton Roads .NET Users Group | Cheaspeake, VA | Topic TBD
  • 07/01/2010 | Richmond .NET Users Group | Richmond, VA | Topic TBD
  • (past) 12/08/2009 | Hampton Roads .NET Users Group | Cheaspeake, VA | SharePoint Antithesis - A Case Study in Pragmatic Software Architecture and Engineering Processes
  • (past) 10/04/2009 | Richmond Code Camp 2009.2 | Richmond, VA | Soothing the Pain Points: Data Access, Validation, Rules, UI, Presentation, et. al
  • (past) 07/23/2009 | Charlottesville .NET Users Group | Charlottesville, VA | Debugging on the Windows Platform
  • (past) 05/23/2008 | NoVa CodeCamp 2009.01 | Reston, VA | Going Proxy-less - The WCF Proxy Factory
  • (past) 04/25/2009 | Richmond Code Camp 2009.1 | Richmond, VA | Software Programmer to Software Engineer: Concepts to Span the Divide
  • (past) 02/05/2009 | Richmond .NET Users Group | Richmond, VA | Debugging on the Windows Platform
  • (past) 10/04/2008 | Richmond Code Camp 2008.2 | Richmond, VA | Going Proxy-less - The WCF Proxy Factory

Blog Archive

Post Labels

.NET (64) .NETv4.0 (3) ACID (1) ActiveDirectory (1) ADF (2) Affiliate (1) Agile (6) AJAX (1) Allocator (3) Analysis (1) AOP (4) ASP.NET (6) ASP.NET MVC (1) Assembly (2) BadIdeaPile (1) BagOfBolts (5) Blogger (1) Books (2) BuildMgmt (8) C# (46) ChoDNUG (1) CLR (1) CLRv4.0 (2) CMP (1) CMS (2) CodeCamp (2) COM (1) Conversation (1) Coverage (1) CUI (1) Database (2) DDD (1) DeadFxs (1) Debugging (9) Design (4) DevAuto (3) DevCfg (1) Development (118) DI (6) DiffMerge (1) Domain (1) DTfW (2) EclipseIDE (1) ECM (1) EntityFramework (1) Estimating (1) FileShare (1) Frameworks (7) GAC (2) Google (1) Hardware (2) HRNUG (1) Humor (6) IIS (4) ILDASM (1) Impersonation (2) InstallError (1) IoC (6) KingTodd (1) LinkedIn (1) LINQtoSQL (2) MarketingHype (1) MBUnit (1) Mentoring (22) Metadata (1) Microsoft (7) MOSS2007 (5) MSBuild (2) MSIL (4) MSSCCI (2) NAnt (2) NCore (2) NCover (1) NDatabase (4) NetUse (1) NHibernate (2) NoVaCodeCamp (2) NTSD/CDB (2) NUnit (1) Observation (2) Office (2) OOD (7) OOP (6) OpenSource (14) Opinion (19) Personal (3) PMP (1) Polymorphism (1) PowerPoint (1) PowerShell (2) Presentation (3) Process (4) ProjectManagement (2) PublicKeyToken (1) QA (2) RDNUG (1) Reflection (2) Registry (2) Resharper (1) Reversing (2) RichmondCodeCamp (5) SCM (11) Scrum (5) Security (2) Series (3) Server2008 (4) ServicePack (1) SES (7) SharePoint (7) Silverlight (1) SoC (3) Software (49) SoftwareIsHardwork (17) Speaking (7) SQL (2) SSO (2) StrongName (2) Suite2008 (9) Suite2010 (1) SwEng (19) TechBlunder (1) Testing (14) Thread (3) Tools (8) Troubleshooting (10) Twitter (3) Types (2) UAC (1) UIP (1) Vault (2) VB6 (1) VC (1) Vista (3) VisualStudio (15) VSIP (2) VSTS (1) WCF (4) Web (4) WebForms (1) Win32 (3) WinDBG (3) WindowsIdentity (3) WinForms (1) WIT (1) Workhorse (1) WoW64 (1) WPF (1) WSS3 (2) x64 (2) x86 (2) xUnit (1)

Disclaimer

© D. P. Bullington, all rights reserved. Everything posted on this blog is my personal opinion and does not represent the views of my employer nor serves to infringe on the sovereignty of any nation.