【问题标题】:How to reuse code and avoid duplicate code Nodejs如何重用代码并避免重复代码 Nodejs
【发布时间】:2021-06-20 15:36:33
【问题描述】:

我有以下问题,我有一个函数可以检测消息何时到达,并且当消息包含前缀“#”例如“Hello I mean #LOL”时,它只会得到“LOL”。它确实工作得很好,但现在我希望它不仅能够检测到“#”前缀,还能够检测到“$”前缀,例如 $ MONEY。我想到的第一件事是从字面上复制整个函数并声明例如prefixD =“$”。问题是我有很多重复/重复的代码,我认为这样做不好,正确的方法是什么?我把我的代码留在这里(可行,但它有很多重复的代码)

client.on("message", function consigue(msg) {

  const prefix = "#";
  if (!msg.content.includes(prefix)) return;

  const pattern = new RegExp(prefix + "([a-z]+)", "i");
  const getMatch = (str) => str.match(pattern)?.[1];
  
  TRADE_OUT = getMatch(msg.content);

  if (TRADE_OUT != "") {
   // some here
  }

  });

  client.on("message", function consigueD(msg) {
  const prefixD = "$";

  if (!msg.content.includes(prefixD)) return;

  function escapeRegex(string) {
    return string.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
  }
  const pattern = new RegExp(escapeRegex(prefixD) + '([a-z]+)', 'i');
  const getMatch = (str) => str.match(pattern)?.[1];

  TRADE_OUT = getMatch(msg.content);

  if (TRADE_OUT != "") {
  // The same some here
  }
 });

例如我想替换它

if (TRADE_OUT != "") {
      
      }

在两个函数中重复并且是完全相同的代码,并且它内部的所有内容都与模块中的函数一起完成,这些函数仅声明为 name ();并且它们已经执行了它们内部的所有代码,您可以根据需要多次使用它。

在同一个函数中做所有事情的最佳方法是什么?我试过 || ,以及在许多其他方面,但事实是我不太擅长这个话题

【问题讨论】:

  • 所以您希望# 和$ 具有相同的行为?在这种情况下,您可以将它们存储在一个数组中并检查消息内容是否包含这些元素之一。
  • 不清楚您在设计中要求什么。你想要一个处理多个前缀的函数吗?您是否想要一个可以将前缀传递给它并处理该特定前缀的通用函数?还是别的什么?
  • 是的,处理两个前缀的函数会很棒但实际上任何解决方案都可以为我提供没有像我现在那样重复代码那么多的解决方案

标签: javascript node.js code-duplication


【解决方案1】:

你可以做一个工厂。

let handlerFactory = flag => {
    return msg => {
        const prefix = flag
        ...
    }
}

那么你会这样做

client.on("message", handlerFactory("X"))

其中 X 是“$”或“#”。

编辑: 如果您的意思是“只是 TRADE_OUT 位中的部分是重复的”,那么只需将其放入处理程序之前声明的函数中,然后从 TRADE_OUT 位中调用它。

【讨论】:

    最近更新 更多