【问题标题】:Declarative coding or programmatic coding in Dojo Projects? [closed]Dojo 项目中的声明式编码还是程序式编码? [关闭]
【发布时间】:2013-10-02 05:11:20
【问题描述】:

根据我自己的经验,我喜欢程序化编码。在这里举几个好处:

  1. 更好的性能:无需解析。
  2. html 和 javascript 之间没有切换:没有 html,一切都在代码中(使用 css 控制布局。)
  3. 易于动态更改内容。
  4. 易于阅读和维护。

但是,这里有很多用户使用声明性编码。我的问题是:使用声明性编码有什么好处?哪一位是道场大师的最爱?

【问题讨论】:

  • 利益分离。另外,我认为您的问题不适合 SO。
  • 而且,我认为这个词是“命令式编程”而不是“程序化编码”。
  • @francisco.preller :我在询问 dojo 项目。我怀疑你是否理解我的问题。显然你没有足够的经验来使用dojo。我很感激 Dimitri,他的回答对我帮助很大。

标签: dojo declarative


【解决方案1】:

就像 fransisco 所说,您可以更轻松地分离代码。我的意思是,如果您在 JavaScript 代码中实例化所有小部件,您的 JavaScript 会变得非常大,而您的 HTML 通常会很小(仅包含用于放置小部件的“容器”节点)。

更好的性能:我必须同意你的观点,因为你必须解析整个页面,所以它确实会降低性能,但你可以通过禁用 parseOnLoad 并仅解析 DOM 来优化它您实际需要的节点。在我工作的公司,我们通过将所有 Dojo 小部件标记放在具有特定类名的 <div> 中来做到这一点。然后在我们的 JavaScript 代码中,我们执行以下操作:

query(".containsDojo").forEach(node) {
    parser.parse(node);
});

HTML 和 JS 之间没有切换:HTML 和 JS 之间的切换使您更容易理解代码并拥有上下文。例如,如果您需要通过放置在名为 C.html 的页面上的小部件 B 来修改小部件 A。然后很容易找到您的小部件 A,因为您知道它在哪个页面上以及它的位置(顶部,底部,...)。如果您将所有内容都放在 JavaScript 文件中,您将很难管理您的代码,因为您不知道小部件是在什么上下文中初始化的。您必须查看整个 JavaScript 代码,因为该小部件可以在代码中的任何位置初始化。

易于动态更改内容:如果您需要动态内容,我通常会自己创建某种小部件并将 JavaScript 逻辑放在那里,这样我的“主要”JavaScript 和 HTML 代码仍然看起来很干净。您可以随时使用 dijit/registry 模块来更改内容中的某些内容。

易于阅读和维护:我完全不同意这一点,类似于我在上一段中所说的 HTML 和 JavaScript 之间的切换。我的意思是,dijit/form/TextBox 和普通的 HTML 输入字段有什么区别?不多,它们都是 UI 项。但是,如果我按照您的想法进行操作,我会将 TextBox 放在 JavaScript 代码中的某个位置,并将普通的 HTML 输入字段放在您的 HTML 中。 HTML 不仅为您提供上下文,而且还集中了所有 UI 元素。

【讨论】:

  • 我不能完全同意你的解释。在我当前的项目中,我们只使用程序化 dojo 来插入小部件。以这种方式使用它有几个优点:您可以围绕 dojo 小部件编写包装器。如果属性将更改,您只需在 1 个文件中编辑它。理论上,您可以从一个工具包/框架切换到另一个。您提到“很难管理这么大的 javascript 文件”的原因对我来说似乎不合法。这是一个架构问题。我们正在使用 MVC(f) 设计模式并拆分每个文件。我创建了某种动态加载器来加载
  • 单独的文件,这样代码会非常干净(和简短)。不过,我给了你一个“+”来表示你的努力和解释
  • 如果您使用的是 MVC,那么在我看来,声明性小部件标记将变得更加重要。您的控制器应该只处理用户操作,它不应该关心按钮或小部件,这就是视图的用途。如果您需要一些复杂的行为,您确实可以使用程序化小部件,但我会将它们包装在一个单独的小部件中,我将使用声明性。这类似于其他 JS MVC 框架的工作方式,例如 AngularjS 和指令或 Ember.js 和组件。
  • 但是,使用 MVC 模式隐含意味着您将“供应商锁定”您的 HTML,因此不可能使用其他框架或工具包。我的意思是,视图不仅包含简单的 HTML 元素,还包含一些更复杂的内容。视图必须由框架“解释”才能与模型组合,以便它代表最终的用户界面,看看 AngularJS 及其 ng-markup、带有 Handlebars 的 Ember.js 甚至 Java 框架(如使用 Spring MVC) JSTL。
  • 但我认为我们在自己的方式上都是对的,这可能是这个问题主要基于意见而被关闭的原因。 ^^
猜你喜欢
  • 1970-01-01
  • 2014-03-25
  • 2016-04-09
  • 2015-10-15
  • 2014-11-15
  • 2017-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多