0

请考虑底部的 Javascript 代码摘录。它大致由两个模块组成,一个用于处理消息。消息模块中的 filtersUpdateSuccess 方法有什么好处?

目前它只是委托给 tplPanels 模块的 overwriteAll 方法。一个让我印象深刻的想法是,在 filtersUpdateSuccess 方法中,对 tplPanels.overwriteAll 的调用可以包装在 try/catch 中。这对我有好处吗,额外的间接级别还有其他好处吗?

PS ....我熟悉以下问题,并已对其进行了咨询并按照其中的链接进行操作,但是现在我想要在特定上下文中得到答案,而不是更笼统的:间接级别解决了每个问题

function msgHandlers() {
    var scope
        ,msgs;

    return {
        SET_CONTEXT: function(context) {
            scope = context.scope;
            msgs = context.messages;
        }

        ,SUBSCRIBE_ALL: function() {
            me.subscribe(scope, msgs.FILTERS_UPDATE_SUCCESS, this.filtersUpdateSuccess);
            //me.subscribe(scope, msgs.FILTERS_UPDATE_SUCCESS, tpl.overwriteAll);
        }

        ,filtersUpdateSuccess: function(filterValues) {
            tplPanels().overwriteAll(filterValues);
        }
    }
}

function tplPanels() {
    var instances = {};

    return {
        locationInstance: function() {
            if (!instances.locationPanel) {
                instances.locationPanel = locationPanel();
            }
            return instances.locationPanel;
        }
        //more instances, etcetera
        ,overwriteAll: function(filterValues) {
            //do something useful
        }
    }
        //etcetera
4

1 回答 1

1

这里的情况似乎是接口的抽象之一,而不是额外的引用间接层。

接口抽象有几个目的:

  1. 使一段代码适合一个通用客户端或一个形状不受您控制的客户端所需的接口。
  2. 使一段代码适合多个客户端共享的接口。
  3. 通过抽象出实现细节来使一段代码适合维护者的心理模型。
  4. 使一段代码适合计划的(不仅仅是可能的)未来用例所需的接口。

如果您系统中的另一个模块已经使用上下文设置订阅过滤接口接受不同的输入,那么它可能很有价值,因为它允许您的代码插入那里:上面的(1)或(2)。

如果你有计划让这个接口有多个提供者或消费者,那么现在让它符合接口是很有价值的,因为你已经完成了将代码分页到内存中的工作:上面的 (4)。

如果其他模块已经以这种方式构建,或者如果过滤是其他模块使用的常见操作,那么代码维护人员可以利用它来快速学习您的代码:(3)上面。

如果这些都不适用,那么,因为filtersUpdateSuccess不会关闭任何tplPanels不适用的东西,所以接口抽象没有任何价值。

于 2011-11-23T15:40:47.140 回答