Должен ли я абстрагироваться от вызовов функций с дублирующимися аргументами?

Должен ли я абстрагироваться от вызовов функций с дублирующимися аргументами?
Должен ли я абстрагироваться от вызовов функций с дублирующимися аргументами? - scoutthecity @ Unsplash

У меня есть интуиция, о которой я хотел бы прочитать, что говорят другие. Мне кажется достаточно интуитивным, что когда у вас есть функция, которая вызывается несколько раз с одними и теми же аргументами, лучше создать абстракцию, которая не требует аргументов, чтобы избежать дублирования. Так, например, если у меня есть:

getErrorMessage(username, 'foo', 'bar'), написанные 3 раза в коде, я бы, вероятно, хотел абстракцию, подобную следующей (при условии, что каждое из трех мест имеет одну и ту же причину для изменения).

function getFooBarErrorMessage(username) {
   return getErrorMessage(username, 'foo', 'bar')
}

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

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

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

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

Не совсем. Однако вы часто будете читать, что чем меньше аргументов, тем лучше. Функции с нулевым аргументом идеальны. Это особенно верно, когда аргументы не нужны, поскольку функция уже имеет к ним доступ. Или когда допускаются значения по умолчанию. Чем меньше информации вы заставляете "других" знать, тем лучше (IMO).

Это, на мой взгляд, лучше, потому что я уменьшаю количество ментальных сущностей, вовлеченных в каждый вызов функции,

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

Думайте в логгерах. Должна быть причина, по которой регистраторы предоставляют log.warn(message) и log.error(message) вместо (и только) logger.log(level, message). Они скрывают детали, которые вам не нужно знать. Детали, которые они могут предоставить сами.

Это, вероятно, связано с тем, что большинство реализаций никогда не будут использовать logger.log(level, message). Большинство не будет делать level динамическим. Так зачем им возиться с этим?


LetsCodeIt, 5 января 2023 г., 15:50