我正在构建自己的JS库;
我们的想法是,库应该由小型独立模块和一些稍大的实用程序组成,主要用于消除浏览器差异。
我无法完成任何事情,因为我无法决定保持干燥或松散耦合。
一个例子?给出:
我对模态框库的选择:
所以我浪费时间在两个极端之间摇摆,重构一百万次并且永远不会满足。
我想要一个更通用的问题,但后来我意识到它真的与JS有关,因为它的大小&性能问题以及广泛使用。
在这种情况下是否有任何已知的模式?什么是可以接受的方式?欢迎任何想法。
[编辑:]
这是我发现的only article,说明了我的担忧。就像文章所说,
DRY很重要,但低耦合和高内聚也是如此。 [...]你必须考虑所有[原则]并权衡每种情况下的相对价值
我想我无法在这种情况下衡量它们的价值。
答案 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.您的项目网站可以动态自定义下载,因此核心代码与可选组件一起下载。与modernizer download page一样。
帮助解决2.不是允许用户传入选项,而是使用合理的默认值来检测浏览器中已加载包的哪些部分并自动绑定它们。 这种松散耦合也可以为您提供巨大的优势,如果用户已安装它们,也可以依赖第三方框架。例如,selectivizr允许您使用jquery或dojo等,具体取决于浏览器已加载的内容。
也许您可以使用requirejs来帮助解决依赖关系管理问题。我得到的印象是它不是真正意义上的库直接使用,而是最终用户 - 开发人员......但它可能是一个不错的选择。
我意识到我的答案没有直接回答你的问题,但也许它可以帮助平衡DRY的一些负面因素。