如何使此pub/sub代码可读性更强
How can I make this pub/sub code more readable?
我正在研究pub/sub模式,因为我正在读一本书,该书高度提倡事件驱动架构,以实现松散耦合。但我觉得只有牺牲可读性/透明度才能实现松耦合。
我很难理解如何编写易于理解的pub/sub代码。我目前编写代码的方式导致了很多一对一的通道,我觉得这样做是一种糟糕的做法。
我使用require.js AMD模块,这意味着我有许多较小大小的文件,所以我觉得有人很难遵循我的发布流程。
在下面的示例代码中,有三个不同的模块:
- UI/控制器模块,处理用户点击
- 翻译模块
- 数据存储模块
要点是用户提交文本,将其翻译成英文,然后存储到数据库中此流在各自的文件中分为三个模块。
// Main Controller Module
define(['pubSub'] function(pubSub) {
submitButton.onclick(function() {
var userText = textArea.val();
pubSub.publish("userSubmittedText", userText);
});
});
// Translator module
define(['pubSub'] function(pubSub) {
function toEnglish(text) {
// Do translation
pubSub.publish("translatedText", translatedText);
};
pubSub.subscribe("userSubmittedText", toEnglish);
});
// Database module
define(['pubSub'] function(pubSub) {
function store(text) {
// Store to database
};
pubSub.subscribe("translatedText", store);
});
为了让读者看到完整的流程,他必须在三个模块之间切换。但是,在看到第一个pubSub.publish("userSubmittedText", userText);
之后,你将如何明确读者应该看哪里?
我觉得发布就像一个悬崖挂钩,读者想知道接下来会触发什么,但他必须去寻找具有订阅功能的模块。
我可以评论每一次发布,解释哪些模块包含正在侦听的函数,但这似乎不切实际。我不认为其他人在这么做。
此外,上面的代码使用一对一通道,我认为这是一种糟糕的风格,但我不确定。只有Translator模块的toEnglish()
函数会订阅pubSub通道"userSubmittedText"
,但我必须为基本上是单个函数调用创建新通道。虽然通过这种方式,我的控制器模块不必将转换器作为依赖项,但它感觉不像是真正的解耦。
函数流透明度的缺乏令我担忧,因为我不知道阅读此类源代码的人如何知道如何遵循。很明显,我一定错过了一些重要的事情。也许我没有使用有用的约定,或者我的发布事件名称不够描述性?
pub/sub的松散耦合是否只是通过牺牲流量透明度来实现的?
发布-订阅模式的理念是,您不需要对谁订阅了主题或谁正在发布做出任何假设。来自维基百科(http://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern):
[…]相反,已发布的消息被表征为类,而不知道可能有什么订户(如果有的话)。类似地,订阅者表示对一个或多个类感兴趣,并且只接收感兴趣的消息,如果有的话,还有出版商。
如果您正在运行的代码没有做出任何假设,那么您的注释也不应该做出任何假设。如果您想要一种更可读的模块通信方式,可以使用requirejs的依赖项注入,这已经在您的pubsub模块中完成了。通过这种方式,您可以更容易地读取代码(这带来了其他缺点)。这完全取决于你想要实现什么。。。
- 从桌面读取python文件时高亮显示代码
- 如何将函数包装在函数中以避免代码重复
- 通过单击表单中的按钮,在代码生成中使用javascript生成字母数字代码
- 货币代码为欧元-金额的格式不应包含小数
- Regex代码只允许一个空格
- 如何将屏幕分辨率乘以 80%,然后在代码中使用
- 从var向代码隐藏函数传递值
- 如何动态插入jquery代码
- 如何在php变量中嵌入JQuery代码
- 代码不会验证
- 如何从rails中的代码中删除新行( )
- Angularjs代码未在匿名函数中运行
- 如何做到这一点,使代码在不传递条件后执行函数
- 如何在读取XLS/XLSX本地文件时,使用IE的javascript代码启用未标记为安全的ActiveX控件
- 面向对象的Javascript代码在IE7中不起作用
- 将 jQuery 代码添加到 Index.aspx 页面
- 为什么忽略了eval()代码中的语法错误
- 如何使此pub/sub代码可读性更强
- 任何使JavaScript中的嵌套回调代码更具可读性的方法
- 如何使HTML代码更具可读性