【问题标题】:How should I mark a method as "obsolete" in JS?我应该如何在 JS 中将方法标记为“过时”?
【发布时间】:2013-10-16 20:00:40
【问题描述】:

我正在重构一个相当大的 JS 文件,其中包含许多不相关的方法,该文件将根据它们的用法将这些方法重新组合在一起,并根据需要重命名其中的一些(以防止产生误导性名称)。

但是,实际上使用此代码的大多数网页都分布在不同的代码分支中,这使我无法进行简单的查找和替换。我可以在所有不同的分支中执行此操作,但这需要同时在 30 多个分支中进行维护,或者一旦更改合并到其他分支中(由我或其他团队成员),可能忘记执行重命名。

如果这是 C#,我可以只用 [Obsolete] 标记该方法,它会根据需要标记必要的更改,所以我正在寻找一些等效的东西。在一段时间内,我仍会通过将调用重定向到新方法来提供旧接口的功能,但我想“强制”人们在出于其他原因在页面上工作时切换到新接口。

除了添加debugger;之外,还有其他方法可以做类似的事情吗? 声明和对每个方法的详细注释,以便它在开发时中断而不是在生产中?

【问题讨论】:

  • 我不知道有任何足够的静态分析工具来解决这个问题——这似乎是大多数动态语言的弱点。
  • 您知道您是从事生产还是开发工作(即变量 debug=true)?
  • @megawac 我不相信我们在 javascript 方面的调试和发布之间有什么不同。不过,我显然可以在 C# 方面弄清楚这一点(如果调试,可能会在我的页面中注入一个变量?)其他开发人员最终都在 Debug 中进行编码和测试,而我们所有的生产代码都在 Release 中。
  • 是的,如果你有一个调试变量,你可以做一个像if(debug){console.warn("using obsolete method")}这样的语句

标签: javascript deprecated deprecation-warning


【解决方案1】:

在过渡期内,您可以做几件事。

  1. 添加@deprecated JSDoc 标志。
  2. 添加一条控制台警告消息,指示该函数已弃用。

一个样本:

/**
 * @deprecated Since version 1.0. Will be deleted in version 3.0. Use bar instead.
 */
function foo() {
  console.warn("Calling deprecated function!");
  bar();
}

【讨论】:

    【解决方案2】:

    以下是我们为 Visual Studio 2013 找到的内容:http://msdn.microsoft.com/en-us/library/vstudio/dn387587.aspx

    它还没有经过测试,因为我们还没有进行转换,但它看起来很有希望。

    与此同时,我会根据上下文在页面加载时插入一个标志,例如:

    <%
    #if DEBUG
        Response.Write("<script type=\"text/javascript\"> Flags.Debug = true; </script>");
    #endif
    %>
    

    然后我调用一个方法,如果标志为真,则抛出错误,或者如果它在发布配置中,则重定向到新调用。

    【讨论】:

    • 这似乎是一个 .Net 答案。这个问题没有.Net标签
    【解决方案3】:
    function obsolete(oldFunc, newFunc) {
      const wrapper = function() {
        console.warn(`WARNING! Obsolete function called. Function ${oldFunc.name} has been deprecated, please use the new ${newFunc.name} function instead!`)
        newFunc.apply(this, arguments)
      }
      wrapper.prototype = newFunc.prototype
      return wrapper
    }
    

    【讨论】:

    • 假设我有一个函数fun1,我想弃用它,而新函数是fun2。我怎样才能使用这个obsolete 函数?看起来很有趣
    • obsolete(fun1, fun2)
    • 好主意,谢谢!这仅在两个函数调用兼容时才有效,即当它本质上只是重命名时。根据我的经验,这仅适用于一小部分过时。
    猜你喜欢
    • 2014-05-24
    • 2013-01-05
    • 2010-12-18
    • 1970-01-01
    • 2019-10-05
    • 1970-01-01
    • 2011-11-01
    相关资源
    最近更新 更多