Любые конкретные преимущества дополнительного уровня косвенности

Пожалуйста, рассмотрите фрагмент кода Javascript внизу. Грубо говоря, он состоит из двух модулей, один для обработки сообщений. В чем преимущество метода filterUpdateSuccess в модуле сообщений?

В настоящее время он просто делегируется методу overwriteAll модуля tplPanels. Одна идея, которая меня поражает, заключается в том, что в методе filterUpdateSuccess вызов 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

person Dexygen    schedule 23.11.2011    source источник
comment
Пожалуйста, обратите внимание на то, имеет ли tplPanels '()' после него или нет. В моем коде это не так, потому что у меня уже есть ссылка на tplPanels, которая возвращает tplPanels().   -  person Dexygen    schedule 23.11.2011


Ответы (1)


Дело здесь, похоже, в абстракции интерфейса, а не в дополнительных уровнях косвенной ссылки.

Абстракция интерфейса служит нескольким целям:

  1. Чтобы часть кода соответствовала интерфейсу, требуемому одним общим клиентом или одним клиентом, форма которого находится вне вашего контроля.
  2. Чтобы фрагмент кода соответствовал интерфейсу, совместно используемому несколькими клиентами.
  3. Чтобы часть кода соответствовала ментальной модели сопровождающего, абстрагируя детали реализации.
  4. Чтобы часть кода соответствовала интерфейсу, требуемому запланированным (а не только возможным) будущим вариантом использования.

Если другой модуль в вашей системе уже принимает другие входные данные с интерфейсом контекстной настройки-подписки-фильтрации, то он может быть полезен, поскольку позволяет вашему коду подключаться туда: (1) или (2) выше.

Если у вас есть конкретные планы по созданию нескольких поставщиков или потребителей этого интерфейса, то может быть полезно просто привести его в соответствие с интерфейсом сейчас, поскольку вы уже выполнили работу по размещению кода в памяти: (4) выше.

Если другие модули уже структурированы таким образом или если фильтрация является обычной операцией, используемой другими модулями, то сопровождающие кода могут использовать это для быстрого изучения вашего кода: (3) выше.

Если ни один из них не применим, то, поскольку filtersUpdateSuccess не закрывает ничего, чего не закрывает tplPanels, абстракция интерфейса не имеет значения.

person Mike Samuel    schedule 23.11.2011
comment
Исправлена ​​проблема со скобками. Теперь я думаю, что вы должны исправить свой ответ, чтобы случайно не отклонить мой вопрос из-за ошибок. Спасибо. - person Dexygen; 23.11.2011
comment
Кстати, ваш комментарий о том, что для специалистов по сопровождению кода более естественно думать с точки зрения фильтрации, чем с точки зрения перезаписи всего, заставляет меня думать, что вы упустили суть вопроса. Вы, кажется, чрезмерно озабочены простой ошибкой, а затем семантикой более низкого уровня модуля tplPanels, в отличие от того, дает ли дополнительный уровень косвенности из модуля msgHandlers преимущество. Я буду ждать больше ответов, но я очень склонен преуменьшить ваш ответ, несмотря на то, что это, возможно, кажется дурным тоном, поскольку я (OP) оригинальный автор - person Dexygen; 23.11.2011
comment
@GeorgeJempty, я не утверждал, что это более естественно, просто говорил, что если бы это было более естественно, это было бы преимуществом. Я отредактирую, но тем временем вам следует уменьшить его, если вы считаете, что мой ответ отвлекает от разговора. - person Mike Samuel; 23.11.2011
comment
Я ценю ваши правки. Я с нетерпением жду их обзора в ближайшее время. - person Dexygen; 23.11.2011
comment
Спасибо за ваш подробный ответ, который я обновил. В моем случае я являюсь и разработчиком, и (на данный момент) сопровождающим, поэтому применим пункт 3. Однако я не согласен с тем, что если ни один из ваших 4 пунктов не применим, в косвенности нет никакой ценности - повторяя мой первоначальный вопрос, по крайней мере, он дает возможность обернуть делегированный вызов в try/catch - person Dexygen; 25.11.2011
comment
@GeorgeJempty, я рад, что ты нашел ответ на свой вопрос. - person Mike Samuel; 26.11.2011