如何在Javascript库中调和DRY和Loose耦合?

时间:2012-08-15 12:48:25

标签: javascript dry loose-coupling

我正在构建自己的JS库;
我们的想法是,库应该由小型独立模块和一些稍大的实用程序组成,主要用于消除浏览器差异。
我无法完成任何事情,因为我无法决定保持干燥或松散耦合。

一个例子?给出:

  • 负责从模板生成dom元素的小型库
  • 另一个负责鸭子打字问题的人(is_function,is_array ......)
  • 最后一个创建模态框。最后一个需要:
    • 某种类型检查
    • 将仅使用模板库中的一个函数创建模态

我对模态框库的选择:

  1. 100%干燥,并取决于其他两个库。但这意味着如果你是一个想要只下载模态框lib的用户,那么你必须与其他两个人一起做。
  2. 允许用户在启动时传递选项对象,以允许用户指定所需的功能;默认为图书馆的。这样做更好,但实际上,在90%的情况下,它仍然意味着使用提供的库,因为创建具有相同签名的函数可能很麻烦。此外,它增加了模态框代码的复杂性。
  3. 100%松散,并重现我的模态框库中所需的功能;可能更有效,因为更有针对性,不需要检查边缘情况;但是:任何错误都必须在两个地方修复,我的下载量会增加。
  4. 所以我浪费时间在两个极端之间摇摆,重构一百万次并且永远不会满足。
    我想要一个更通用的问题,但后来我意识到它真的与JS有关,因为它的大小&性能问题以及广泛使用。

    在这种情况下是否有任何已知的模式?什么是可以接受的方式?欢迎任何想法。

    [编辑:]
    这是我发现的only article,说明了我的担忧。就像文章所说,

      

    DRY很重要,但低耦合和高内聚也是如此。 [...]你必须考虑所有[原则]并权衡每种情况下的相对价值

    我想我无法在这种情况下衡量它们的价值。

2 个答案:

答案 0 :(得分:3)

就个人而言,我一直认为Loose Coupling指的是在代码中创建接缝。在诸如Java之类的经典语言中,这是通过创建隐藏具体实现的接口来实现的。这是一个强大的概念,因为它允许开发人员在应用程序中“取消接缝”并用模拟和测试双精度(或者实际上是他们自己的实现)替换具体的实现。由于JavaScript是一种动态语言,开发人员依赖于duck-typing而不是Interfaces:因为没有任何东西被冻结,所以每个对象都会成为代码中的一个接缝,并且可以被替换。

在直接回答您的问题时,我认为总是旨在将您的代码分解并模块化为更小的库,这是值得的。您不仅要避免重复代码(出于各种原因而不是一个好主意),而是鼓励其他开发人员重复使用,而这些开发人员只想重新使用您的部分库。

为什么不利用一些比较流行的JavaScript库,而不是重新发明轮子呢?例如,underscore.js是一个轻量级库,它为鸭型检查提供了丰富的工具包,Mustache.js可以很好地满足您的模板需求。

许多现有项目已经使用这种方法,例如,Backbone.js取决于underscore.js和jQuery Mobile取决于jQuery。 RequireJS等工具可以轻松列出和解析应用程序的javascript依赖关系,甚至可以用于combine all the separate.js files into a single, minified resource

答案 1 :(得分:1)

我喜欢DRY的概念,但是你的权利有几个问题。

  1. 您的最终用户开发人员需要知道他们需要下载组件的依赖关系。

  2. 您的最终用户开发人员需要知道他们需要配置依赖项(即传入的选项)。

  3. 帮助解决1.您的项目网站可以动态自定义下载,因此核心代码与可选组件一起下载。与modernizer download page一样。

    帮助解决2.不是允许用户传入选项,而是使用合理的默认值来检测浏览器中已加载包的哪些部分并自动绑定它们。 这种松散耦合也可以为您提供巨大的优势,如果用户已安装它们,也可以依赖第三方框架。例如,selectivizr允许您使用jquery或dojo等,具体取决于浏览器已加载的内容。

    也许您可以使用requirejs来帮助解决依赖关系管理问题。我得到的印象是它不是真正意义上的库直接使用,而是最终用户 - 开发人员......但它可能是一个不错的选择。

    我意识到我的答案没有直接回答你的问题,但也许它可以帮助平衡DRY的一些负面因素。