Pull to refresh

Comments 9

UFO landed and left these words here
4) В отдельный файл info.csv записываем строку с id записи, названием файла, из которого была извлечена функция и хешем функции

5) Загружаем файл info.csv в SQLite и делаем по нему всякие запросы, ведь эта база — не игрушка!

Простите, проорал. Зачем вам файл info.csv?


В остальном отличное исследование, спасибо!

Возможно это небольшое исследование кого-нибудь натолкнет на мысли какие-нибудь мысли о рефакторинге.
Учитывая, что самые распространённые функции — это либо заглушки либо однострочные хэлперы, не очень понимаю, что здесь предлагается оптимизировать? Сделать в npm пакет empty_fun.js, чтобы от него пол интернета зависело? :-)
UFO landed and left these words here
Какой-то совсем нераспространённый пакет, всего 150к загрузок в неделю. Вот то ли дело этот (кстати, от того же автора)
/s

top 2 и top 3 функции – это результат транспиляции Babel или Typescript, они генерируют такой код для import и export.


При желании его можно оптимизировать и взять переиспользуемые модули @babel/runtime или tslib соответственно.

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

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

Многие участки кода очень похожи, вплоть до копипасты, но у них разная судьба, разный план развития, делаешь универсальный класс и потом начинаешь все равно забивать его кастомизацией, декораторами (в ООП смысле, не в TS), наращивать сложность использования.

Многие функции и методы пишутся для того, чтобы облегчить понимание логики происходящего. Если заменить их на универсальные, читаемость от уровня «технический текст» упадет до уровня «абстрактная формула, которая непонятно что делает в нашем коде»

Некоторые функции очень коротки — настолько, что замена их на универсальную функцию не даст никакого выигрыша.

Вот пример из статьи. На какую универсальную функцию это можно заменить? Насколько короче станет код? В чем выигрыш?

const z=function(){return this};


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

Но к некоторым примерам вопросов нет, они действительно загадочны. Кто пишет свою обертку для forEach? Почему для читабельности он просто не разносит разные операции над своим массивом по разным методам?

Я полагаю, такой метод может быть оправдан, если кодер думает — «сейчас я использую массив, а потом, может быть, перейду на дерево Меркла, и мне понадобится переписывать проход по нему во всех местах. Сделаю-ка я сразу делегирование прохода в метод — тогда можно будет изменить и коллекцию, и её алгоритм, не повреждая остальной код»
const z=function(a,c){this._array.forEach(a,c)};


Отдельная больная тема — как и откуда брать универсальные мелкие функции? Тащить библиотеку? Добавлять еще зависимость в проект? Потом при обновлении библиотеки проверять, не сломалось ли что-то в билде (или как вариант — сразу чинить, что сломалось)? Вот подумаешь над этим и такой

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

Выглядит так, будто бóльшая часть функций — скомпилированный в ES5 более новый код (TS, ES6+).


Из ангуляра:


5911b29c89fa44f28ce030aa5e433327 - Object.copy
05c2b9b254be7e4b8460274c1353b5ad - deepCopy
fcaede1b9e574664c893e75ee7dc1d8b - Object.clone
e743dd760a03449be792c00e65154a48 - Object.clone

4728096fca2b3575800dafbdebf4276a - identity
d98a03a472615305b012eceb3e9947d5 - void
f6822db5c8812f4b09ab142afe908cda - void
27628ad740cff22386b0ff029e844e85 - identity
7d1e7aad635be0f7382696c4f846beae - void
285d00ca29fcc46aa113c7aefc63827d - void

b7081aad7510b0993fcb57bfb95c5c2c - alwaysFalse
d665499155e104f749bf3a67caed576a - Boolean()

Из реакта большинство — scoped functions (возвращают значение из верхнего замыкания), видимо скомпилированные arrow functions:


const z=function(){return cache};
const z=function(){return m[k]};
const z=s=>exposed.has(s);

Если бы не нужна была обратная совместимость с каким-нибудь IE11, вполне разумно было бы выбросить вот это вот все и заменить на "родные" API.


Меня эта статья наталкивает на мысль разработать утилиту (типа надстройки для yarn / npm / webpack / node) такого себе жесткого tree shaking.

В случае Ангуляра — бОльшая часть "повторяющихся" функций — это выход из tsc с даунгрейдом. Ангуляр, как и сам компилятор тайпскрипт, написан на TS, а автор в статье проверяет уже скомпилированные .js файлы.


Даунгрейд синтаксиса классов и вызовов super() — в прототипы. ES-module в CommonJS.
Вс остальное — это преимущественно "пустышки", которые бессмысленно рефакторить/переиспользовать.


Сборшики работают эффективно

Не, это просто в бандл вошли совсем не те файлы, которые были проаналзированые ранее. По списку самых больших файлов видно, что все это — сама система сборки (typescript, angular compiler, sass).

Sign up to leave a comment.

Articles