Code and decision trees

A lot of what programs do is transforming inputs into outputs. Take, for example, a piece of JavaScript code like this:

itemsToMarkup( items, viewType, galleryType ) {
    let markup;
    switch ( viewType ) {
        case 'gallery':
            if ( 'individual' === galleryType ) ) {
                markup = getHTML( items );
            } else {
                markup = getShortcode( items );
            }
            break;
        case 'image':
        default:
            markup = getHTML( items );
    }
    return markup;
}

What’s the purpose of this code? It takes some input data structures and outputs a markup, either proper HTML or a code to be processed by later stages of the pipeline. At the core, what we are doing is taking a decision based on the input’s state so it can be modeled as a decision tree:

By restating the problem in a more simple language, the structure is made more evident. We are free of the biases that code as a language for thinking introduces (code size, good-looking indenting, a certain preference to use switch or if statements, etc). In this case, conflating the two checks into one reduces the tree depth and the number of leaves:

Which back to code could be something like:

itemsToMarkup( items, viewType, galleryType ) {
    let markup;
    const isGalleryButNotIndividual = ( view, gallery ) =>
        view === 'gallery' &&
        gallery !== 'individual';
    if( isGalleryButNotIndividual( viewType, galleryType ) ) {
        markup = getShortcode( items );
    } else {
        markup = getHTML( items );
    }
    return markup;
}

By having a simpler decision tree, the second piece of code makes the input/output mapping more explicit and concise.


Comments

Leave a Reply

Your email address will not be published. Required fields are marked *