Click here to Skip to main content
14,209,092 members
Click here to Skip to main content
Technical Blog
Posted 24 Mar 2010

Tagged as

Stats

36.7K views
2 bookmarked

Programming Language Misuse

,
Rate this:
4.24 (5 votes)
Please Sign up or sign in to vote.
4.24 (5 votes)
7 Sep 2017     CC (ASA 2.5)    
Programming language misuse

I’m feeling a bit guilty about some code I wrote:

using (new OperationTimer("MyOperation", this))
{
    // ... complete operation
}

This innocent looking C# snippet is hiding a tricky secret - the using statement is being misused (no pun intended). The documentation defines the intended usage clearly:

using Statement

  • Defines a scope, outside of which an object or objects will be disposed.

The problem? The notion of “object disposal” is being hijacked! In your garden variety IDisposable implementation, you’d be dealing with an external resource that needs to be released before the object can be removed from memory. Instead, I’m using it to time a block of code like so:

class OperationTimer : IDisposable
{
    private readonly string _operationName;
    private readonly ITimable _obj;
    private readonly Stopwatch _stopwatch;

    public OperationWrapper(string operationName, ITimable obj)
    {
        _operationName = operationName;
        _obj = obj;
        _stopwatch = new Stopwatch();
        _stopwatch.Start();
    }

    public void Dispose()
    {
        _stopwatch.Stop();
        _obj.OnOperationCompleted(_operationName, _stopwatch.Elapsed);
    }
}

The constructor starts a timer and the Dispose() method stops it and reports the elapsed time. (Aside: if you’re interested in how I’m using the timer, check out my previous article Simplified Performance Counters.) There are certainly other ways to accomplish this same behavior, but they lack the elegance of a neatly scoped code block. It’s arguably an acceptable way to repurpose the language. In fact, the ASP.NET MVC authors saw fit to use it in a similar fashion with the BeginForm helper. The only “resource” it disposes of is to render a closing </form> tag.

My question is: When does repurposing language constructs turn from “acceptable language use” to a “dirty trick”, or worse, “illegible line noise”?

It seems like a slippery slope. One instance that I don’t care for is controlling execution flow by-way-of logical operator precedence in most C-like languages:

expression1 && expression2 || expression3

Which is equivalent to:

if (expression1)
{
    if (!expression2)
    {
        expression3
    }
}
else
{
    expression3
} 

This takes advantage of the order of evaluation in a logical statement – it is assumed (correctly) that expression2 will never be evaluated if expression1 is evaluated as false, and instead, expression3 will get to run. Likewise, if the first two evaluate to true, the truth value is known for the statement and expression3 is never evaluated. This is clearly not the intended usage which the language designers had in mind, but it works, and it saves any keywords from being written.

Some truly beautiful code has been written by way of hijacking the language. For instance, here’s a program that will calculate the value of pi using an ASCII circle. Truly neat - but also completely useless from a software development standpoint.

What do you think? Should I just get over my guilt about repurposing IDisposable? Or, should I be true to the original intent of the language and find another way?

License

This article, along with any associated source code and files, is licensed under The Creative Commons Attribution-ShareAlike 2.5 License

Share

About the Author

James Kolpack
Software Developer (Senior)
United States United States
No Biography provided

Comments and Discussions

 
GeneralBoolean short circuiting is not misuse Pin
LintMan6-Apr-10 3:59
memberLintMan6-Apr-10 3:59 
AnswerRe: Boolean short circuiting is not misuse Pin
Florian Leeber8-Sep-17 2:07
memberFlorian Leeber8-Sep-17 2:07 
GeneralCorrection regarding: expression1 && expression2 || expression3 Pin
RMessier29-Mar-10 18:55
memberRMessier29-Mar-10 18:55 
GeneralRe: Correction regarding: expression1 && expression2 || expression3 Pin
James Kolpack30-Mar-10 17:58
memberJames Kolpack30-Mar-10 17:58 
GeneralNot a "dirty trick" but a great technique that improves robustness: RAII! PinPopular
wtwhite29-Mar-10 17:16
memberwtwhite29-Mar-10 17:16 
You have rediscovered a technique known in C++ as Resource Acquisition Is Initialisation (RAII). This is not a "dirty trick" but an extremely useful technique with many usability and maintenance benefits!

The primary, and very real, maintenance benefit is this: Regardless of how you exit the block, be it by normal flow out the end, return or a thrown exception, you do not need to remember to clean up the resource. Over time, as code grows and is modified, it becomes harder to keep track of exactly which resources are still live at any given point in the code and need to be disposed of -- so having all such "knowledge" about when disposal is necessary embedded just once, at the same place where the resource is first acquired (rather than distributed throughout your code) becomes invaluable. It's one less thing for you to have to worry about when coming back to edit the code down the road -- one less thing to rely on "programmer discipline" to get right.

Now, the fact that you are interpreting "resource" more widely here than you are accustomed to is not bad, but good! The abstraction fits your timer perfectly, with "dispose of the resource" replaced by "stop the timer". The only possible downside is that this usage might initially confuse other programmers; but once they experience the maintenance benefits for themselves they'll be converted very quickly. RAII is one of the (arguably few) things C++ got absolutely right.

The secondary benefit is simply that your code is less cluttered with calls to dispose functions. Usually this improves clarity, since these dispose functions often don't do anything interesting in the application domain.

End result: less code to wade through AND stronger guarantees that it will continue to work in the future.

Smile | :)
GeneralRe: Not a "dirty trick" but a great technique that improves robustness: RAII! Pin
torial31-Mar-10 9:07
membertorial31-Mar-10 9:07 
GeneralCaveats with "using" Pin
supercat925-Mar-10 4:45
membersupercat925-Mar-10 4:45 
GeneralRe: Caveats with "using" Pin
wtwhite29-Mar-10 17:43
memberwtwhite29-Mar-10 17:43 
GeneralRe: Caveats with "using" Pin
supercat931-Mar-10 7:27
membersupercat931-Mar-10 7:27 
GeneralRe: Caveats with "using" Pin
wtwhite31-Mar-10 15:24
memberwtwhite31-Mar-10 15:24 
GeneralRe: Caveats with "using" Pin
IGood6-Apr-10 22:03
memberIGood6-Apr-10 22:03 
GeneralSeems fine to me. Pin
dwilliss24-Mar-10 13:41
memberdwilliss24-Mar-10 13:41 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Cookies | Terms of Use | Mobile
Web03 | 2.8.190617.3 | Last Updated 7 Sep 2017
Article Copyright 2010 by James Kolpack
Everything else Copyright © CodeProject, 1999-2019
Layout: fixed | fluid