Skip to main content

Maintainablilty

A question:

What does the following code do? 
public static string GetThing1(string s) 

     return s.Substring(s.Length / 2 - (1 - s.Length % 2), 2 - s.Length % 2); 
}

Given that code, take a look at the following, what doe this code do?

public static string GetThing2(string s)
{
    //Given a string return the middle char if odd, middle 2 if even
    string retVal = "";
    bool even = (s.Length % 2 == 0) ? true : false;
    int middle = (s.Length % 2 == 0) ? s.Length / 2 - 1 : s.Length / 2;
    if (even)
        retVal = s.Substring(middle, 2);
    else
        retVal = s[middle].ToString();
    return retVal;
}


It probably didn't take too long to figure out they both do the same thing. They are two different answers to the following question:
Write a function to get the middle character of a string. Return the middle character if it the length is odd, or the middle 2 characters if the length is even.
Which version took less time to understand? Personally, I found the second version easier to understand. I also figure it will be easier to debug. 

And so?

I happened across these two solutions at CodeWars.com. The first answer was voted a best practice.  
Isn't maintainability a best practice? Isn't clarity a tool for enhancing maintainability? I think that under the assumption that the code I write will be looked at later by someone who has no idea what the code needs to do, I need to leave as many markers as possible. I need to be explicit in my coding. This might be an extreme example. The second version could be re-written to be more concise - especially to try and get rid of some of the extra memory used. 

But what about making the fact that the return is value is a "this" or "that" known explicitly? The intent is obscured in the one-liner. This becomes a more interesting trade-off - will this routine be called frequently? How much are we paying in performance for the conditional? Does it need to be streamlined? How do you keep maintainability and meet that goal? 

As Abelson and Sussman phrase it in “Structure and Interpretation of Computer Programs,” “Programs must be written for people to read, and only incidentally for machines to execute.”
(quote from Code Watch: Let's be clear about code clarity)
 
These are the questions I am asking myself about this code - what about you?

Comments

Popular posts from this blog

Unit Testing - What to Test

This I wrote to answer a question that came up when we were discussing our software process and I was training developers on how to unit test. It seems a simple enough question, but I kept pondering it and delving deeper until I realized I needed to write this monograph. What unit tests should we write? How do we know what to test? Ideally, unit tests should cover every path through the code. It should be your chance to see every path through your code works as expected and as needed. If you are practicing Test Driven Development then it's implied everything gets a test. In the real world, you might not be allowed to test everything - for instance, if the testing suite ends up taking a week to run, then the world will have changed by the time it finishes and the test results will be obsolete. Unit testing at it's basic is testing an object, a method - the smallest unit of your code that it can test independently. It should test the inputs "goes into" an

Healthcare and Health Informatics Glossary

Here is a glossary of terms useful in Healthcare and Health Informatics ACO (Accountable Care Organization) MEDICARE’s outcomes-based contracting approach Arden Syntax an approach to specifying medical knowledge and clinical decision support rules in a form that is independent of any EHR and thus sharable across hospitals ARRA (American Recovery and Reconstruction Act) the Obama administration’s 2009 economic stimulus bill Blue Button an ASCII text based standard for heath information sharing first introduced by the Veteran’s Administration to facilitate access to records stored in VistA by their patients. The newer Blue Button + format provides both human and machine readable formats. CCD (Continuity of Care Document) an XML-based patient summary based on the CDA architecture CCOW (Clinical Context Object Workshop) an HL7 standard for synchronizing and coordinating applications to automatically follow the patient, user (and other) contexts to allow the clinical u

Files as UI

Files as UI vs API  -  compares attributes of iCloud vs Dropbox. It starts on an interesting note - the model of a file system in the UI is dying, and should be let go. Beyond that it looks at mappings of each system to a file system from an API point of view and compares the successes of each. I find the initial thread the most interesting. Drop the mental model of a file system - which maps virtual concepts of files and directories to a physical model of papers, folders and file cabinets - and replace it with...what? This is a paradigm shift for me. I have to admit, I loath, hate, nay, despise looking for things. If I can't find something easily, it's only about a minute before I start growling and muttering things my mother would disapprove of. On this basis, I like the idea that I can save myself from thinking about where to put things or, where I have already put them. But how do we do this? It's non-trivial, since humans think of "things" and once they