У меня есть интуиция, о которой я хотел бы прочитать, что говорят другие. Мне кажется достаточно интуитивным, что когда у вас есть функция, которая вызывается несколько раз с одними и теми же аргументами, лучше создать абстракцию, которая не требует аргументов, чтобы избежать дублирования. Так, например, если у меня есть:
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
динамическим. Так зачем им возиться с этим?