Задать вопрос

Какой код лучше?

Возник спор по поводу того как лучше реализовать метод printStream. Какую реализацию в код вставишь, а какую в корзину отправишь?

1) Дедовский подход:
async function printStream(stream) {
    let line = '';
    for await (let chunk of stream) {
        chunk = chunk.toString();
        while (chunk.length) {
            const i = chunk.indexOf('\n');
            if (i === -1) {
                line += chunk;
                break;
            }
            
            line += chunk.slice(0, i);
            console.log(line.trim());
            line = '';
            chunk = chunk.slice(i + 1);
        }
    }
}


2) Хипстерский, на генераторах:
async function printStream(stream) {
    await pipe(
        stream,
        toString,
        chunksToLines,
        trim,
        print,
    );
}

function pipe(value, ...fns) {
    let result = value;

    for (const fn of fns) {
        result = fn(result);
    }

    return result;
}

async function *toString(chunks) {
    for await (const chunk of chunks) {
        yield chunk.toString();
    }
}

async function *chunksToLines(chunks) {
    let previous = '';
    for await (const chunk of chunks) {
        previous += chunk;
        while (true) {
            const i = previous.indexOf('\n');
            if (i < 0) {
                break;
            }
            yield previous.slice(0, i + 1);
            previous = previous.slice(i + 1);
        }
    }

    if (previous.length > 0) {
        yield previous;
    }
}

async function *trim(values) {
    for await (const value of values) {
        yield value.trim();
    }
}

async function print(values) {
    for await (const value of values) {
        console.log(value);
    }
}
  • Вопрос задан
  • 469 просмотров
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 7
nightvich
@nightvich
ITman
1. Вариант предпочтительнее, так как он проще читается.
Ответ написан
Комментировать
daemonhk
@daemonhk
ПсиХоПат
2. портянка не пойми чего, которая делает непонятную херь.

Код должен быть ПОНЯТНЫМ, а не мэйнстримовым.
Ответ написан
@davidnum95
В вопросе компактность(без осложнения читаемости) vs портянка кода логичнее выбрать первое.
Ответ написан
@mayorovp
Заметим, что оба варианта содержат ошибку: нельзя вот так декодировать чанки. Но если во втором примере ошибка локализована в одной функции toString - то в первом она перемешалась с остальной логикой.

Если теперь рассмотреть случай, когда подобный код разбросан по всему проекту - то окажется, что второй вариант починить намного проще...
Ответ написан
Stalker_RED
@Stalker_RED
Когда человек пишет код, у него обычно есть какие-то цели. Например:

1. Побыстрее запустить и забыть
Тогда он может взять первую попавшуюся либу с гитхаба, подключить jQuery там, где хватило бы трех строк на ванильке, скопипастить нечто странное с SO. Главное что оно хоть как-то заработало.

2. Легкая поддержка
Тут приходится блюсти некий баланс читабельности, лаконичности и гибкости, чтобы не удариться в портяночный оверинжиниринг или напротив, в однострочники

2. Производительность
Полноценно реализуем несколько полностью работающих вариантов, прогоняем тесты, смотрим профайлером, вот это все. Времени уходит несравненно больше, чем в первом подходе.

4. Попробовать новое
Предположим студент или хипстор увидал новую фичу, и решил ее применить. Потому что может.

Этот список можно бы и продолжить, но в реальных условиях зачастую преследуются несколько целей одновременно. То есть нужна читабельность и производительность. Или приспичило поэкспериментировать, но при этом производительность терять нельзя.

Это я все к тому, что задавая вопрос "как лучше" - неплохо бы выложить критерии для оценки.
Потому что по пункту "новое" - однозначно рулит второй вариант, по производительности - надо тестировать, может быть даже на разных движках. По первому пункту - будет тот, который раньше нагуглится.
Ответ написан
mcm5324
@mcm5324
врач
Лайкую код должен быть понятен. А хипстеры это 00000,1процентов
Ответ написан
Комментировать
faiwer
@faiwer
frontend-developer
Оба варианта нормальные. Второй уместнее в случае, если планируется много кода по работе со stream-ми и тогда весь дополнительный код выносится в library или helper-file. Первый уместнее, если это просто единичный случай, тогда мишура из генераторов выглядит overhead-ом.

И зачем было сюда это писать? :) Опросы какие-то создавать. Давайте ещё на stackoverflow топик создадим. А потом на hackernews статью про хипстеров которые всё заполонили. "Як диты малэньки".
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы