Статьи

Еще раз … Обратная связь Пожалуйста!

Вы, наверное, слышали о синдроме «Не изобретено здесь»: стремление разработчиков создавать что-то свое, а не просто использовать готовую библиотеку или компонент. Это почти повсеместно изображается как плохая вещь, признак незрелости или даже высокомерия.

Но есть и обратная сторона: каждый бит когда-либо написанного кода содержит в себе компромиссы: скорость в сравнении с обслуживаемостью — это обычный компромисс, который видели все. Возможно, код недостаточно гибок перед лицом реальных требований, но действительно хорошо протестирован на предмет того, что он покрывает. Эти выборы отражают принципы разработчика, применяемые к коду. Фактически, это редко для того, чтобы это было легким соглашением между двумя простыми целями; Скорее всего, в коде, в требованиях и в голове разработчика много противоречивых целей. «Не изобретено здесь» также может означать «Не отражая мои принципы».

Гобелен имеет свой собственный набор руководящих принципов: простота, согласованность, эффективность и обратная связь … и в качестве многократно используемой основы  обратная связь  очень важна. Обратная связь может быть  самым  важным принципом, когда дела идут плохо. Каркас, который скрывает проблемы из-за плохой обратной связи, это каркас, который не должен использоваться.

Что возвращает нас к «Не изобретено здесь». Только в невероятно совершенном мире может быть какой-то идеальный кусок кода, готовый к повторному использованию, с проблемами несоответствия нулевого сопротивления. Фактически, когда вы вводите чужой код, вы вынуждены сопоставлять свои цели и принципы с их. В моем случае я добавляю поддержку Tapestry для преобразования   файлов Less в CSS, используя  WRO4J  (оптимизатор веб-ресурсов для Java). Они работают над WRO4J в течение нескольких лет, имеет смысл повторно использовать их код, и было бы высокомерно думать, что я мог бы сделать что-то лучше вместе при любых временных ограничениях.

На самом деле, это было довольно гладко … пока мы не столкнулись с нарушением принципа обратной связи Гобелена. Как только я протестировал случай ошибки, когда исходный файл Less был недействительным, я получил плохую обратную связь. Можете ли вы определить, что не так с этим отчетом об исключениях?

К сожалению! Похоже, кто-то не получил памятку о  важности toString () . Понимаете, принцип обратной связи важен для меня, но для большинства разработчиков полезная обратная связь слишком часто запоздалая мысль. Я не хочу выделять WRO4J здесь … Я довольно презрительно отношусь к отзывам практически всех программ: с открытым исходным кодом  или  проприетарных.

Итак, каковы наши варианты здесь?

  • Напишите наши собственные обертки вокруг Меньшего Процессора и выбросьте WRO4J
  • Прошу ребят из WRO4J реализовать настоящий toString () и дождаться следующего релиза
  • Форк WRO4J в краткосрочной перспективе, и надеюсь, что они возьмут патч в долгосрочной перспективе
  • Патч вокруг этой проблемы с отчетностью

Очевидно, мы должны найти способ исправить проблему с отчетами; мы не хотим выбрасывать ребенка с водой из ванны. К счастью, Tapestry предоставляет необходимые хуки для переопределения представления объектов в отчете об исключениях; Все дело в том, чтобы обеспечить сопоставление типа Java с соответствующей реализацией  ObjectRenderer . Из-за IoC контейнера Tapestry, это на самом деле довольно просто:

@Contribute(ObjectRenderer.class)
    @Primary
    public static void provideLessErrorRenderers(MappedConfiguration<Class, ObjectRenderer> configuration)
    {
        configuration.add(AntlrException.class, new ObjectRenderer<AntlrException>()
        {
            public void render(AntlrException e, MarkupWriter writer)
            {
                List<String> strings = CollectionFactory.newList();
 
                if (InternalUtils.isNonBlank(e.getMessage()))
                {
                    strings.add(e.getMessage());
                }
 
                if (e.getLine() > 0)
                {
                    strings.add("line " + e.getLine());
                }
 
                if (e.getCharacter() > 0)
                {
                    strings.add("position " + e.getCharacter());
                }
 
                writer.write(InternalUtils.join(strings, " - "));
            }
        });
    }

И с этими изменениями исключение представляется совсем по-другому:

Ну, те , на самом деле являются сырой  Antlr  ошибки синтаксического анализа, но , по крайней мере, достаточно , чтобы помочь вам найти место проблемы … в то время как, с плохой обратной связью, вы бы только знать , что существует проблема  где — то  в исходном файле Less.