Container Models

A long time ago a friend of mine pointed out a sign of trouble in any program: defining a new container model. If you are working in a language that provides containers in the standard library, then use them. If you need a container with specific behaviour, then make it look like the standard containers. If you come across a program which introduces a new model, beware.

I’ve recently been adding Go support to SWIG. SWIG can be used to build interfaces between various different languages and C++. SWIG is a nice program in many ways: it provides a lot of power and flexibility in defining the interface. Internally, though, big chunks are written in C++ but it uses a totally different container model. I assume this is for historical reasons dating back to a beginning in C or possibly even Python. In C++, though, it’s a mess. There is no type checking: it’s all void * pointers. Practically every type (strings, lists, hash tables) converts to everything else implicitly. It brings all the weaknesses of a pure dynamically typed language into C++, without providing any of the benefits.

Sometimes one encounters a programmer who carries a container model from program to program, rewriting it into different languages as needed. The result is a program written for one person. Don’t do that. Use a language in the idioms of the language; don’t try to make it look like a different language. Use the containers which the language provides.

4 Comments »

  1. manuelsimoni said,

    April 30, 2010 @ 7:22 am

    I have a slightly different theory:

    If your data fits well into standard containers, use them.

    However, if you need an extremely (space or speed) efficient way to store data, go ahead and create a new container, and don’t care about making it look like a standard container, except when this is very easy.

    An example would be a very specialized tree for IP address lookup, for which the language’s containers aren’t adequate — for argument’s sake. Since you only use such a specialized container in very stylized and few ways, making such a specialized container look like a standard container may not be worth it.

    In that case, don’t worry, and simply create a very specialized container interface, and don’t make it look like a standard container.

    Makes sense?

  2. fche said,

    April 30, 2010 @ 7:35 am

    Amen.

  3. Ian Lance Taylor said,

    April 30, 2010 @ 8:48 pm

    manuelsimoni: Yes, that makes sense. There is nothing wrong with using special purpose code for special purposes.

  4. tromey said,

    May 12, 2010 @ 3:35 pm

    My rule of thumb for all programming is that boring is better.

    Whenever I see some exciting new data structure or algorithm or language choice or optimization, I start from a position of skepticism. Usually you don’t need this stuff, usually just the most typical thing in your current environment will be best.

RSS feed for comments on this post · TrackBack URI

You must be logged in to post a comment.