Стоит выбирать транспорт (если уж брать аналогию с транспортом), который довезет тебя до пункта назначения оптимальным образом и без особых проблем в пути. И да — иногда это может быть велосипед.
На мой взгляд мидлвары появились как раз потому что их было вот так вот просто реализовать. Ну а потом, как говорится, понеслось, и вот — все как в тумане, а потом вдруг оказывается, что мы потеряли контроль на реквестом из респонсом и любой из 100500 разработчиков, которые приложили руку к созданию мидлваров, взятых в наш проект из сомнительных репозиториев, которые не обновлялись с 2017 года, может сделать, пусть ненароком, практически все что угодно с данным до того, как они доберутся к тому месту в программе, которое мы контролируем. И словив проблему, мы будем дебажить до рези в глазах эти цепочки вызовов мидлвар в попытке понять, что происходит.
Я думаю самое главное зло, это сама концепция цепочки middleware и то, что мидлвары вообще могут что-то менять в реквесте. Что, на мой взгляд могло бы сделать эту концепцию немного более приемлемой:
1. Концепция контекста. Сам реквест readonly, если надо передать что-то дальше по цепочке — для этого есть объект контекста.
2. Мидлвара может добавлять свою информацию в контекст, и может читать то, что добавлено другими мидлварами, которые установлены для нее в зависимостях, что приводит нас к следующему пункту.
3. Должна быть реализована система зависимостей, т. е. например, авторизация может зависеть от аутентификации, а аутентификация от мидлвары, которая вытаскивает Auth token из реквеста.
Если бы изначально такое было сделано в экспрессе, было бы сейчас значительно меньше проблем.
у нее нет продолжения. Ибо join вернет строку, а вам то надо работать с файлом. И теперь надо эту строку передать каким-то образом в метод из fs.
const package_json_path = path.join(__dirname, 'node_modules/fstb/package.json');
fs.stat(package_json_path, (err, stat) => console.log(stat.size));
//либо (ну так вообще никто никогда не делает, да?):
fs.stat(path.join(__dirname, 'node_modules/fstb/package.json'), (err, stat) => console.log(stat.size))
Вызов функции для получения объекта пути, создает дополнительную когнитивную нагрузку и подвержен ошибкам. В примере выше многие, при чтении кода, будут спотыкаться о вызов метода unlink(), так как, ожидается, что происходит удаление.
Тут да, есть такое дело, я про этот недостаток писал в конце.
Так же, странно видеть атрибуты read и write, лучше либо переименовать на более очевидное, либо сделать их методами. Почему бы сразу не сделать readLineByLine() и writeText()?
Тут есть ряд причин, почему сделано именно так:
Во-первых, если их сделать методами, то будет путаница, потому что у модуля fs есть методы read и write будет с ними путаница.
Во-вторых хотелось разгрузить подсказку от портянки методов. Когнитивная нагрузка, помните? Если все, что можно делать с файлами в один список положить получится длинная портянка, пусть даже и структурированная по префиксам названий методов как вы предлагаете, так что нет, не вижу смысла делать, так как вы предлагаете. Думал об этом довольно долго, но в итоге решил сделать как есть сейчас.
Сначала хотел написать, что неудобно будет смотреть на экранчик «в поле» если точка, с которой меряешь неудобно расположена, например глубоко в недрах прибора, который надо чинить. Потом дошло, что для таких случаев есть приложение для смартфона. В общем, круто, так держать! Прикидывали, сколько такой девайс будет стоить?
Меня всегда удивляет, когда сравнивают ИИ и человеческий разум. На минуточку, чтобы получился «естественный интеллект» понадобились сотни тысяч поколений работы генетического алгоритма с огромными популяциями, где каждый агент в популяции имеет сложность, которая и не снилась современной вычислительной технике. Чтобы сформировать сознание человеку нужно 20 лет непрерывного 24/7 обучения на бесконечно разнообразном датасете, который есть реальный мир.
Прямо сейчас обучается почти 8 млрд. агентов, нейронная сеть каждого из которых многократно сложнее, чем все, что может дать современный датасайнс. Это ответ эволюции на «комбинаторный взрыв».
Меня знатно бомбит, когда кто-то критикует современные достижения в области ИИ. Голосовые ассистенты ошибаются? GPT-3 несет бред? Автопилот теслы попал в аварию? Пару десятков лет ничего этого не было вообще.
Я просто в восторге от того, чего удалось достичь за последние годы в области ИИ! И с каждым годом этот восторг только растет. То, что можно просто задать вопрос смартфону голосом и получить ответ, это так естественно, но расскажи об этом мне, 15-летнему школьнику, который потратил 2 недели, пытаясь обучить Dragon Dictate распознавать мой голос (безуспешно), и я тогда бы не поверил.
Для меня это просто невероятно круто, что все это появилось при моей жизни, я и с восторгом и замиранием сердца смотрю в будущее не в силах представить, что же будет дальше!
Я все собирался найти и перечитать повнимательнее вашу предыдущую статью, а вы оказывается уже фреймворк запилили. Поставил вам лайки и звездочки везде, где смог, ибо «во-первых, это красиво»!!!
Еще как в счет. Помню в детстве читал книгу Джеральда Даррела, так там был эпизод, как у него сбежал ленивец из клетки и каких трудов стоило его обратно упихать…
Выход из приложения с помощью process.exit() тоже можно предотвратить, подменив обработчик porcess.exit на свой. Это конечно грязный хак и в общем случае так делать не стоит, но в некоторых ситациях может пригодится и, если уж говорить о способах предотвращения выхода из программы, стоило бы об этом упомянуть. Можно использовать, например, в случае, если таким образом действует модуль, на поведение которого мы не можем повлиять другим способом.
Все правильно, если знаешь яваскрипт, то в каком-то смысле знаешь ноду. А яваскрипт они судя по всему знали, раз у них в стеке был англяр.
1. Концепция контекста. Сам реквест readonly, если надо передать что-то дальше по цепочке — для этого есть объект контекста.
2. Мидлвара может добавлять свою информацию в контекст, и может читать то, что добавлено другими мидлварами, которые установлены для нее в зависимостях, что приводит нас к следующему пункту.
3. Должна быть реализована система зависимостей, т. е. например, авторизация может зависеть от аутентификации, а аутентификация от мидлвары, которая вытаскивает Auth token из реквеста.
Если бы изначально такое было сделано в экспрессе, было бы сейчас значительно меньше проблем.
path.join классная штука, всегда ей пользуйтесь при работе путями )). Но вот в чем дело, эта ваша строка кода:
у нее нет продолжения. Ибо join вернет строку, а вам то надо работать с файлом. И теперь надо эту строку передать каким-то образом в метод из fs.
А вот этот код:
он может быть завершен как инструкция что надо сделать с файлом.
Вот так, например:
Тут вы прочитаете всю историю куда пойти, что там лежит и что с этим надо сделать. Слева на право, сверху вниз.
Если вам не нравится вариант заменить сегменты на свойства, можно написать вот так:
Кстати, подали мне идею, сделаю, чтобы можно было вообще писать вот так:
Так что спасибо за критику.
Тут да, есть такое дело, я про этот недостаток писал в конце.
Тут есть ряд причин, почему сделано именно так:
Во-первых, если их сделать методами, то будет путаница, потому что у модуля fs есть методы read и write будет с ними путаница.
Во-вторых хотелось разгрузить подсказку от портянки методов. Когнитивная нагрузка, помните? Если все, что можно делать с файлами в один список положить получится длинная портянка, пусть даже и структурированная по префиксам названий методов как вы предлагаете, так что нет, не вижу смысла делать, так как вы предлагаете. Думал об этом довольно долго, но в итоге решил сделать как есть сейчас.
Прямо сейчас обучается почти 8 млрд. агентов, нейронная сеть каждого из которых многократно сложнее, чем все, что может дать современный датасайнс. Это ответ эволюции на «комбинаторный взрыв».
Меня знатно бомбит, когда кто-то критикует современные достижения в области ИИ. Голосовые ассистенты ошибаются? GPT-3 несет бред? Автопилот теслы попал в аварию? Пару десятков лет ничего этого не было вообще.
Я просто в восторге от того, чего удалось достичь за последние годы в области ИИ! И с каждым годом этот восторг только растет. То, что можно просто задать вопрос смартфону голосом и получить ответ, это так естественно, но расскажи об этом мне, 15-летнему школьнику, который потратил 2 недели, пытаясь обучить Dragon Dictate распознавать мой голос (безуспешно), и я тогда бы не поверил.
Для меня это просто невероятно круто, что все это появилось при моей жизни, я и с восторгом и замиранием сердца смотрю в будущее не в силах представить, что же будет дальше!
Еще как в счет. Помню в детстве читал книгу Джеральда Даррела, так там был эпизод, как у него сбежал ленивец из клетки и каких трудов стоило его обратно упихать…
Я до сих пор поддерживаю несколько проектов на vb.net
на мой взгляд язык очень достойный получился, жаль что микрософт его решила прикопать...
Спасибо огромное за статью! Как же мне не хватало такого материала, когда сам разбирался с tsconfig!
Кроме того, 67 плат в партии на самом деле оказались полностью работоспособны и не требовали ремонта.
Можно было остальные выкинуть и было бы 67 плат меньше чем за фунт каждая. Уже неплохо ))