Уменьшение дублирования кода при разборе

Я предпочитаю, чтобы в моей кодовой базе было как можно меньше дублированного кода, и поэтому я постоянно ищу способы его уменьшить.

Однако я немного застрял в следующем случае: скажем, у меня есть метод, который анализирует вывод одной программы в объект, чтобы сделать его доступным для чтения в другой программе.

Мой текущий подход заключается в использовании регулярного выражения для сканирования ввода, чтобы сформировать новый объект для вывода.

Это создает длинный список операторов if, которые выглядят более или менее одинаково с небольшими различиями здесь и там. Есть ли значимый способ уменьшить дублирование кода здесь или это то, с чем мне придется смириться?

if ((match = block.match(/bssid=([A-Fa-f0-9:]{17})/))) {
    parsed.bssid = match[1].toLowerCase();
}

if ((match = block.match(/freq=([0-9]+)/))) {
    parsed.frequency = parseInt(match[1], 10);
}

if ((match = block.match(/mode=([^\s]+)/))) {
    parsed.mode = match[1];
}

if ((match = block.match(/key_mgmt=([^\s]+)/))) {
    parsed.key_mgmt = match[1].toLowerCase();
}

person MSB    schedule 20.06.2016    source источник
comment
Для каждого условия есть совершенно другое действие, здесь действительно нет никакого дублирования или способа абстрагироваться от этого. Вы можете создать таблицу, в которой вы храните регулярное выражение и связанное с ним действие, но в основном вы получите больше кода и, вероятно, даже не более понятный в этом отношении.   -  person cviejo    schedule 20.06.2016


Ответы (1)


Я предполагаю, что вы хотите что-то вроде этого:

var parseConfig = {
    bssid: {
        expr: /bssid=([A-Fa-f0-9:]{17})/,
        handle: match => match[1].toLowerCase()
    },
    frequency: {
        expr: /freq=([0-9]+)/,
        handle: match => parseInt(match[1], 10)
    },
    mode: {
        expr: /mode=([^\s]+)/,
        handle: match => match[1]
    },
    key_mgmt: {
        expr: /key_mgmt=([^\s]+)/,
        handle: match => match[1].toLowerCase()
    }
};

function parse(block, cfg) {
    var parsed = {};

    Object.keys(cfg).forEach(key => {
        var item = cfg[key],
            match = block.match(item.expr);

        parsed[key] = match ? item.handle(match) : null;
    });

    return parsed;
}
person Tomalak    schedule 20.06.2016
comment
Хотя я понимаю, что большинство людей сочтут это «менее эффективным» и «более запутанным», я благодарю вас за ваш ответ. При разборе более 40+ подобных записей это того стоит. (для моего ОКР) - person MSB; 20.06.2016
comment
Не только для ОКР. Это разделение интересов. parse теперь представляет собой чистую функцию, которую можно настроить с помощью параметров, что повышает вашу гибкость при работе с ней (и ее тестировании, если уж на то пошло). Насчет менее эффективных я сомневаюсь. - person Tomalak; 20.06.2016