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

Почему такой код считается нормальным?

Всем привет. Открыл документацию к hapi.js и увидел такой пример кода:
const Hapi = require('hapi');
const server = Hapi.server({});

async function start() {
    try {
        await server.start();
    }
    catch (err) {
        console.log(err);
    }
};

start();


В универе я писал на С, и меня учили, что:
1) В функциях не должно быть глобальных переменных
2) Каждая функция должна быть написана так, чтобы её можно было скопировать в другой проект без изменений

В данном же примере кода всё это нарушается, ибо:
1) В функции start используется глобальная (для этой функции) переменная server
2) Если я перенесу функцию start в другой файл, то мне придётся ещё дописывать часть кода
3) Если вдруг я в другом проекте сделаю const app = Hapi.server({}), то функция start опять не сработает

Чего я не понимаю? Как мне понять, какие подходы более правильные?
  • Вопрос задан
  • 206 просмотров
Подписаться 1 Средний 5 комментариев
Решения вопроса 5
index0h
@index0h
PHP, Golang. https://github.com/index0h
В функциях не должно быть глобальных переменных

Да, это плохая практика, но nodejs ее пропагандирует, увы.

Каждая функция должна быть написана так, чтобы её можно было скопировать в другой проект без изменений

В реальной жизни это утверждение справедливо только для библиотек общего назначения. Когда ваши функции/методы реализуют бизнес логику приложения - лучше их написать менее универсальными, но более поддерживаемыми. Все равно переносить в другой проект вы их не будете
Ответ написан
@RidgeA
Такой подход общепринят в NodeJS.

Кстати, модуль в NodeJS по сути является функцией. Так что копирование функции `start` - это копирование части
функции по сути :-)

Ничто не мешает написать так:
async function start() {
    const Hapi = require('hapi');
    const server = Hapi.server({});

    try {
        await server.start();
    }
    catch (err) {
        console.log(err);
    }
};

start();
Ответ написан
Xuxicheta
@Xuxicheta
инженер
в данном случае это просто обертка для асинхронного выполнения.
Можно было написать
const Hapi = require('hapi');
const server = Hapi.server({});

server.start().catch(console.error);

И всё. Без всяких функций которые вы куда-то хотите копировать

Плюс в данном случае const server = Hapi.server({});
это не глобальная переменная. Это переменная с областью видимости в пределах текущего модуля (js файла)
Глобальные переменные в Ноде это свойста объекта global
Ответ написан
k12th
@k12th
console.log(`You're pulling my leg, right?`);
Да это же просто пример. В реальной жизни никто не мешает вынести эту функцию в отдельный файл и передавать в нее server параметром. Просто если бы в доках это все разбили на три файла, читать их было бы сложнее:)
Ответ написан
Комментировать
@pharrell
Здесь никаких противоречий нет. В NodeJS модуль это функция. Весь описанный вами код под капотом выглядит вот так
(function(exports, require, module, __filename, __dirname) {
const Hapi = require('hapi');
const server = Hapi.server({});

async function start() {
    try {
        await server.start();
    }
    catch (err) {
        console.log(err);
    }
};

start();
});
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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