如何使此pub/sub代码可读性更强

How can I make this pub/sub code more readable?

本文关键字:可读性 代码 sub 何使此 pub      更新时间:2023-10-05

我正在研究pub/sub模式,因为我正在读一本书,该书高度提倡事件驱动架构,以实现松散耦合。但我觉得只有牺牲可读性/透明度才能实现松耦合。

我很难理解如何编写易于理解的pub/sub代码。我目前编写代码的方式导致了很多一对一的通道,我觉得这样做是一种糟糕的做法。

我使用require.js AMD模块,这意味着我有许多较小大小的文件,所以我觉得有人很难遵循我的发布流程。

在下面的示例代码中,有三个不同的模块:

  1. UI/控制器模块,处理用户点击
  2. 翻译模块
  3. 数据存储模块

要点是用户提交文本,将其翻译成英文,然后存储到数据库中此流在各自的文件中分为三个模块。

// 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模块中完成了。通过这种方式,您可以更容易地读取代码(这带来了其他缺点)。这完全取决于你想要实现什么。。。