Användandet av goto i programkod

goto-jailNär man skriver programkod är det av yttersta vikt att det ska vara lättläst. Hellre lättläst än snabbt brukar jag arbeta efter. Ofta är det sällan någon större skillnad i snabbhet mellan kod man förstår och krånglig kod som ingen vågar röra.

Den här artikeln handlar om kommandot ”goto” och dess dåliga rykte. Goto finns i språket PHP sedan v 5.3 men tyvärr inte i Javascript. Det är på inget sätt dåligt att använda kommandot goto. Alla kommandon kan användas på ett sätt som gör det svårare eller lättare att läsa programkoden.

Här kommer ett exempel i Javascript som innehåller en massa if-kommandon.

Funktionen kommer från mitt projekt ”InfoHub”.

var internal_RemovePluginFromPluginIndex = function ($in) {
    "use strict";
    var $pluginIndex = {}, $response,
        $default = {
            'func': 'RemovePluginFromPluginIndex',
            'plugin_name': ''
        };
    $in = _Default($default,$in);

    $response = {
        'answer': 'false',
        'message': 'Please provide a plugin name'
    };

    if ($in.plugin_name !== '') {
        $response = internal_LocalStorageLoad({'key': 'plugin_index'});
        if ($response.answer === 'true') {
            $pluginIndex = $response.data;
            $response.message = 'Plugin was not in the plugin_index';
            if (typeof $pluginIndex[$in.plugin_name] !== 'undefined') {
                delete $pluginIndex[$in.plugin_name];
                $response = internal_LocalStorageSave({'key': 'plugin_index', 'data': $pluginIndex });
                if ($response.answer === 'true') {
                    $response.message = 'Removed the plugin from the plugin_index';
                }
            }
        }
    }
    return {'answer': $response.answer, 'message': $response.message, 'plugin_index': $pluginIndex };
};

Funktionen laddar in ett objekt från Local storage i webbläsaren och plockar bort det angivna plugin namnet och sparar sedan tillbaka objektet till local storage.

Du kan se det bakvända med att jag först måste berätta vad som gick fel och sedan göra if-testet.

’Please provide a plugin name’

if ($in.plugin_name !== ”) {

Du kan också se att koden bara blir djupare och djupare med if-kommandon tills vi kommer till själva delete kommandot. Och oavsett hur testerna går så ska alltid return-kommandot köras sist.

Eftersom Javscript inte har något goto-kommando så kan vi inte göra en test och om den misslyckas direkt hoppa till exit. Men Javascript har en annan finess där man kan namnge ett block och sedan bryta sig ut från blocket. Du kan kalla blocket vad du vill, jag döpte det till ’block’.

var internal_RemovePluginFromPluginIndex = function ($in) {
    "use strict";
    var $pluginIndex = {}, $response,
        $default = {
            'func': 'RemovePluginFromPluginIndex',
            'plugin_name': ''
        };
    $in = _Default($default,$in);

    $response = {
        'answer': 'false',
        'message': ''
    };

    block: {
        if ($in.plugin_name === '') {
            $response.message = 'Please provide a plugin name';
            break block;
        }
        $response = internal_LocalStorageLoad({'key': 'plugin_index'});
        if ($response.answer === 'false') {
            $response.message = 'Could not load the plugin_index';
            break block;
        }
        $pluginIndex = $response.data;
        if (typeof $pluginIndex[$in.plugin_name] === 'undefined') {
            $response.answer = 'true';
            $response.message = 'Plugin was not in the plugin_index';
            break block;
        }
        delete $pluginIndex[$in.plugin_name];
        $response = internal_LocalStorageSave({'key': 'plugin_index', 'data': $pluginIndex });
        if ($response.answer === 'false') {
            $response.message = 'Could not save the plugin_index';
            break block;
        }
        $response.message = 'Removed the plugin from the plugin_index';
    }

    return {'answer': $response.answer, 'message': $response.message, 'plugin_index': $pluginIndex };
};

Om det här är mer lättläst än förra koden är mer tycke och smak. Jag föredrar att minska djupet i koden och undvika if-kommandon i varandra.

Språket PHP däremot har goto-kommandot. Där går det att skriva samma kodstruktur som ovan men då används inget block, och istället för ”break block;” användas ”goto exit;” och innan return-kommandot en label som heter ”exit:”.

Du kan nu skriva kod som är platt och snabbt tar dig till slutet av funktionen om en test skulle misslyckas.

 

CharZam