- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
这可能已经被问过很多次了,我已经搜索过 SO 但到目前为止,我读到的所有答案都不是我正在寻找的。
我在一个网站上工作,该网站具有适度的 DOM 元素显示/隐藏、一些 AJAX 调用,可能还有其他内容。所以我将有两个主要脚本文件(HTML5 样板标准)
plugins.js // third party plugins here
site.js // all my site specific code here
之前我使用的是对象字面量设计模式,所以我的 site.js
是这样的:
var site = {
version: '0.1',
init: function() {
site.registerEvents();
},
registerEvents: function() {
$('.back-to-top').on('click', site.scrollToTop);
},
scrollToTop: function() {
$('body').animate({scrollTop: 0}, 400);
}
};
$(function() {
site.init();
});
到目前为止一切顺利,可读性很好,所有方法都是公开的(我有点喜欢这样,因为如果需要,我可以直接通过 Chrome Dev Tools 测试它们)。但是,我打算将网站的一些功能分离为更模块化的样式,因此我希望在上面的代码下方(或在单独的文件中)有这样的东西:
site.auth = {
init: function() {
site.auth.doms.loginButton.on('click', site.auth.events.onLoginButtonClicked);
},
doms: {
loginButton: $('.login'),
registerButton: $('.register')
},
events: {
onLoginButtonClicked: function() {
}
},
fbLogin: function() {
}
};
site.dashboard = {
};
site.quiz = {
};
// more modules
如您所见,它的可读性很强。但是有一个明显的缺点,那就是我必须编写类似 site.auth.doms.loginButton
的代码。和 site.auth.events.onLoginButtonClicked
.突然间它变得难以阅读,并且功能变得越复杂,它只会变得越长。然后我尝试了模块化模式:
var site = (function() {
function init() {
$('.back-to-top').on('click', scrollToTop);
site.auth.init();
}
function scrollToTop() {
$('body').animate({scrollTop: 0}, 400);
}
return {
init: init
}
})();
site.auth = (function() {
var doms = {
loginButton: $('.login'),
registerButton: $('.register')
};
function init() {
doms.loginButton.on('click', onLoginButtonClicked);
}
function onLoginButtonClicked() {
}
return {
init: init
}
})();
// more modules
如您所见,那些长名称不见了,但我想我必须在 site.init() 函数中初始化所有其他模块来构造它们?然后我要记得返回需要被其他模块访问的函数。他们两个都很好,我想虽然有点麻烦,但总的来说,我是否找到了一个更好的使用模块化模式的工作流程?
最佳答案
这里的正确答案当然是:“视情况而定”。
如果您对所有数据和所有方法都完全满意,那么对于您网站的每个部分都是 100% 公开的,那么只需使用一个文字(或多个文字),如果需要,使用嵌套对象,就完全没问题,假设你可以防止它变成一个巨大的代码球。
如果您想要任何类型的私有(private)状态,它具有任何类型的持久性(即:不会在您每次运行函数时重置),那么揭示模块就很棒。
也就是说:
您根本不需要使用 .init
方法来揭示模块。
如果您的模块可以自包含,那么只需专注于导出您想要公开的内容。
为此,当我编写团队可能会查看的代码时,我发现自己创建了一个 public_interface
对象并返回它(匿名对象的命名版本你返回)。
这样做的好处是微乎其微的,只是增加了对任何需要公开的东西都需要附加到界面的理解。
您目前使用它的方式:
var module = (function () { /* ... */ return {}; }());
module.submodule = (function () { /*...*/ return {}; }());
不比字面量好或坏,因为你可以很容易地做到这一点:
var module = {
a : "",
method : function () {},
meta : { }
};
module.submodule = {
a : "",
method : function () {},
meta : { }
};
在您找到不适合您的东西之前,请使用满足您需求的东西。
就个人而言,我通常会将任何纯数据对象构建为文字:配置对象、来自其他连接的对象等...
任何可能需要一两个方法,并且可以通过仅嵌套一层或两层深度来构建的非常简单的对象,我也可以按字面意思构建(只要它不需要初始化)。
// ex:
var rectangle = {
width : 12,
height : 24,
area : 0,
perimeter : 0,
init_area : function () { this.area = this.width * this.height; return this; }, // buh...
init_perimeter : function () { this.perimeter = (this.width * 2) + (this.height * 2); return this; } // double-buh...
}.init_area().init_perimeter();
如果我需要其中的几个,也许我会制作一个构造函数。
但是,如果我只需要像这样独特的东西之一,那么做这样的事情难道不会让我头疼吗:
var rectangle = (function (width, height) {
var public_interface = {
width : width,
height : height,
area : width * height,
perimeter : (2 * width) + (2 * height)
};
return public_interface;
}(12, 24));
如果需要更高级的计算,我可以将任何额外的变量保密,并从内部处理它们。
如果我需要在对象内部拥有敏感数据,并需要函数来处理该数据,那么我可以拥有调用这些私有(private)函数并返回结果的公共(public)函数,而不是提供访问权限。
另外,如果我重构我的代码,并决定在某个时候重命名 rectangle
,那么任何嵌套 3 层或更深的函数,它们指的是 rectangle
将有也要修改。
同样,如果你正在构建你的方法,这样它们就不需要直接请求任何比 this
更上层的对象,那么你就不会有这个问题......
...但是如果您的界面如下所示:
MyApp.myServices.webService.send();
它期望找到:
MyApp.appData.user.tokens.latest; // where personally, I might leave tokens in a closure
如果您更改 appData 模块的结构,您的 webService 模块中将会出现各种错误,直到您找到所有对旧格式的引用并将它们全部重命名。
关于javascript - 对象文字或模块化 Javascript 设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15718757/
每个人(希望)都在努力实现代码模块化。我想要做的是有 1 个主要的 Sass 文件,它导入我的所有模块,这些模块是局部的,如果需要,这些局部可以调用它们自己的局部组。我想要的是,不是在我的代码库中调用
如何在 xslt 转换中模块化一组重复的输出?例如,我有如下内容(伪代码)。 并
假设我有几个简单的模型驻留在 food.py 中: import peewee as pw db = pw.SqliteDatabase('food.db') class BaseModel(pw.M
我正在开始一个新的 Angular 项目并尝试模块化我的所有代码——我厌倦了拥有大量的 app.js 文件,而且因为我正在为一家公司开发一个平台,所以我的代码整洁且模块化以便于测试、清洁和易于过渡到
所以,有人告诉我,在 nodeJS 中传递 request 和或 response 变量是“不好的做法”。但这意味着你的大部分代码都必须在 server.js 文件中,这使得它变得困惑而且有点难看。
有一个想法:函数(在 FP 中)可以以与 OOP 中的组件类似的方式组成。对于 OOP 中的组件,我们使用接口(interface)。对于函数,我们可以使用委托(delegate)。目标是实现分解、模
有没有办法将 SQL 代码模块化,使其更具可读性和可测试性? 我的 SQL 代码经常变成一长串复杂的嵌套连接、内连接等,难以编写和调试。相比之下,在像 Javascript 或 Java 这样的过程语
我想知道大公司如何倾向于在他们的页面上模块化组件。 Facebook 就是一个很好的例子: There's a team working on Search that has its own CSS,
我正在寻找在 WPF 中构建模块化应用程序模型的解决方案。目前,我使用 Devexpress POCO MVVM 来构建我的 WPF 应用程序,但缺乏模块化的可扩展性,我正在寻找适合我当前设计并允许构
我制作了一个 Gradle 项目,它使用类加载器从子目录资源/文本中加载文本文件。此时它可以工作,但是当我将项目转换为模块化 JavaFX 程序时,相同的类加载器函数会给出 NullPointerEx
假设我有一个通用类模块: export class MyCalc { data = {} ... } 并说我想扩展更多功能: export class MyCalcLoader {
我的模板文件变得越来越大并且过于复杂(大约 200 行(长)代码,9 级缩进),因此它也变得容易出错。我正在寻找一个简单的解决方案,它可以让我轻松访问 $scope 变量和函数。 我的第一个想法是使用
许多人说要将外部 CSS 和 JavaScript 文件的数量保持在最低限度以减少往返时间。例如,Google 建议每个网站最多分别使用两个 CSS 和 JavaScript 文件。 问题是,作为“模
我试图找出为什么我的 Promise 链执行无序,尽管编写了一个非嵌套的 then 链。我的函数已经模块化,以减少链中发生的代码膨胀(我期望有五个 then 方法),并且我不确定这些模块中的某些内容是
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 8 年前。 Improv
我使用 create-react-app 创建了一个样板 React 应用程序。 现在,在我的 App.js 文件中 import classes from './App.css'; 我做到了
Java 模块系统是否应该阻止模块通过反射访问其他模块,而不声明正确的模块依赖关系? 例如,在编译这个 hello world Java 11 类时,它从另一个模块调用类,正如预期的那样,它不会编译,
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 9 年前。 Improve this qu
我的应用程序上有许多不同的“控制元素”:下拉菜单、选项卡、菜单等。在同一页面上,有许多相同的控件。当编写 JavaScript 来处理与每个控件关联的不同事件时,我试图使我的代码尽可能干燥。挑战之一是
处理以下场景的模块化方式是什么:应用程序具有所有标题标签(h1、h2、h3 等)的通用样式。特定组件 Widget.jsx 可以使用这些标题中的任何一个,但 h1 标签具有特殊样式。在 CSS 的“旧
我是一名优秀的程序员,十分优秀!