Review for YourCodeReview (ru) - #1
Conversation
|
Переход на модульную архитектуру
|
| } | ||
|
|
||
| /** Read args from cmd */ | ||
| var args = Parse(process.argv); |
There was a problem hiding this comment.
Возможно, для парсинга аргументов имеет смысл воспользоваться готовыми библиотеками, на подобие minimist
There was a problem hiding this comment.
Стараюсь не использовать внешние библиотеки или включать их технические решения в свой код.
Функция Parse взята из одной библиотеки по разбору аргументов - думаю стоит указать автора
| req.write(requestJSON); | ||
| req.end(); | ||
| }; | ||
| } |
There was a problem hiding this comment.
Код, связанный с отправкой и обработкой запроса можно несколько сократить при использовании сторонней библиотеки axios или https://www.npmjs.com/package/node-fetch .
There was a problem hiding this comment.
Стараюсь не использовать внешние библиотеки или включать их технические решения в свой код
There was a problem hiding this comment.
Есть несколько моментов:
- большой размер зависимостей и их зависимостей, что увеличивает размер билда
- при формировании билда (использую webpack для формирования единого JS-файла) поподает очень много "мусора" (т.е. реально не используемого кода на который ссылаются реализации)
- если не использовать билды - проблема развертывания в изолированных пром. средах
- желание иметь только реально задействованный код (пример: если подтянуть lodash для использования 2-3 методов, в билд упаковывается почти весь lodash)
| console.log('\t--method\t*\texecuted method') | ||
| console.log('') | ||
| return | ||
| } |
There was a problem hiding this comment.
Библиотека commander.js предоставляет удобный интерфейс для вывода подобного рода сообщений (да и предоставляет больше возможностей для работы с командной строкой, чем упоминаемый ранее minimist )
There was a problem hiding this comment.
Стараюсь не использовать внешние библиотеки или включать их технические решения в свой код.
Однако спасибо за подсказки в части предлагаемых библиотек
| @@ -0,0 +1,41 @@ | |||
| // /** | |||
There was a problem hiding this comment.
Видимо, файлы src/ext/_all.js и src/ext/dns.js не нужны.
There was a problem hiding this comment.
Данный файл временно закомментирован (что бы не мешался в процессе билда), но в последующем будем адаптирован
| @@ -0,0 +1,29 @@ | |||
| const caller_drivers = require('./caller/_all') | |||
There was a problem hiding this comment.
Изменился код стайл, раньше использовался camesCase
There was a problem hiding this comment.
В следующей итерации приведу стилистику кода в порядок
| @@ -0,0 +1,29 @@ | |||
| const caller_drivers = require('./caller/_all') | |||
|
|
|||
| class CALLER { | |||
There was a problem hiding this comment.
Изменился код стайл, раньше для классов использовался PascalCase
There was a problem hiding this comment.
В следующей итерации приведу стилистику кода в порядок
| return true | ||
| } | ||
| return false | ||
| } |
There was a problem hiding this comment.
В конструкторе не имеет смысла возвращать boolean, он всё равно вернёт инстанс
There was a problem hiding this comment.
Большое спасибо, учту данный аспект
|
|
||
| default: | ||
| return false | ||
| break |
There was a problem hiding this comment.
На уровне исполнения кода - да. Однако оставил для соблюдения общей конструкции switch
| * @param {float} value | ||
| */ | ||
| ring(metric, level, value) { | ||
| this.$driver.ring(metric, level, value) |
There was a problem hiding this comment.
$driver может быть undefined, стоит учесть или здесь или в конструкторе
There was a problem hiding this comment.
При создании инстанса класса будет проверятся заполненность $driver и инстанс будет исключаться из пула как не инициализированный.
Подобное поведение можно увидеть в загрузчике RPCs
| */ | ||
| start() { | ||
| console.log('RPC', 'JSON', 'start', this.$dsn) | ||
| if (this.$active) { |
There was a problem hiding this comment.
Можно уменьшить вложенность
if (!this.$active) {
console.log('RPC', 'JSON', 'is disabled')
return
}
...
There was a problem hiding this comment.
Большое спасибо, не обратил внимания
| if (options.methods) { | ||
| assert(typeof options.methods === 'object' && !Array.isArray(options.methods), 'methods must be an object') | ||
| const keys = Object.keys(options.methods) | ||
| for (let n = 0; n < keys.length; n += 1) { |
There was a problem hiding this comment.
Копи-паст из (https://github.com/sangaman/http-jsonrpc-server)
| * Class representing a HTTP JSON-RPC server | ||
| * @see https://github.com/sangaman/http-jsonrpc-server | ||
| */ | ||
| class RpcServer { |
There was a problem hiding this comment.
Верное замечание, однако я стремлюсь что бы каждый модуль был самодостаточным.
Возможно в последующем сформирую секцию кода провайдеры куда и отправится данный сегмент кода для пере использования в других модулях
| this.applyOptions(options) | ||
| } | ||
|
|
||
| this.server = http.createServer(reqHandler.bind(this)) |
There was a problem hiding this comment.
reqHandler используется только внутри класса, лучше его и сделать методом класса. Остальные функции ниже - тоже
There was a problem hiding this comment.
Копи-паст из (https://github.com/sangaman/http-jsonrpc-server)
| jsonrpc: '2.0', | ||
| } | ||
|
|
||
| if (request.id) { |
There was a problem hiding this comment.
Валидацию (вместе с кодами ошибок) лучше вынести в отдельный класс
There was a problem hiding this comment.
Копи-паст из (https://github.com/sangaman/http-jsonrpc-server)
|
Общие советы по коду:
|
| method: 'POST' | ||
| } | ||
|
|
||
| var buffer = ''; |
There was a problem hiding this comment.
Стоит переходить на современные стандарты и использовать let/const
There was a problem hiding this comment.
Хорошее замечание, спасибо
| console.log('\t--p.[key]\t\tset params key \t"{}"') | ||
| console.log('\t--method\t*\texecuted method') | ||
| console.log('') | ||
| return |
There was a problem hiding this comment.
; в конце выражений в одних файлах есть везде (местами пропущены), в других их нет совсем.
В пределах проекта стоит придерживаться одного стиля кода
There was a problem hiding this comment.
Спасибо, буду внимательнее
| } | ||
|
|
||
| $readConfig(path) { | ||
| if (fs.existsSync(path)) { |
There was a problem hiding this comment.
Если сделать обратную проверку и выйти из функции - вложенность станет меньше
| try { | ||
| this.$config = JSON.parse(fs.readFileSync(path)) | ||
| } catch (error) { | ||
| throw new Error(error.toString()) |
There was a problem hiding this comment.
а в чем смысл ловить исключение и прокидывать его дальше без дополнительной логики?
There was a problem hiding this comment.
В текущей реализации - логики нет 😄
Уже есть понимание вынести обработку конфигурации в модуль что бы можно было использовать разных поставщиков данных (файлы, БД, и другие хранилища)
Основные изменения:
Вопросы:
Архитектура
Интересны ваши мысли, идеи, замечания по архитектуре, системе модульности и что угодно
Механизм передачи контроля дочерним модулям
src/server.js#146-210linkКакие есть другие варианты?
Игнорировать:
src/ext/dns.js- временно закомментирован для последующей адаптацииconsole.log- используется для логирования всего и вся на этапе разработки