Вы, наверное, слышали о синдроме «Не изобретено здесь»: стремление разработчиков создавать что-то свое, а не просто использовать готовую библиотеку или компонент. Это почти повсеместно изображается как плохая вещь, признак незрелости или даже высокомерия.
Но есть и обратная сторона: каждый бит когда-либо написанного кода содержит в себе компромиссы: скорость в сравнении с обслуживаемостью — это обычный компромисс, который видели все. Возможно, код недостаточно гибок перед лицом реальных требований, но действительно хорошо протестирован на предмет того, что он покрывает. Эти выборы отражают принципы разработчика, применяемые к коду. Фактически, это редко для того, чтобы это было легким соглашением между двумя простыми целями; Скорее всего, в коде, в требованиях и в голове разработчика много противоречивых целей. «Не изобретено здесь» также может означать «Не отражая мои принципы».
Гобелен имеет свой собственный набор руководящих принципов: простота, согласованность, эффективность и обратная связь … и в качестве многократно используемой основы обратная связь очень важна. Обратная связь может быть самым важным принципом, когда дела идут плохо. Каркас, который скрывает проблемы из-за плохой обратной связи, это каркас, который не должен использоваться.
Что возвращает нас к «Не изобретено здесь». Только в невероятно совершенном мире может быть какой-то идеальный кусок кода, готовый к повторному использованию, с проблемами несоответствия нулевого сопротивления. Фактически, когда вы вводите чужой код, вы вынуждены сопоставлять свои цели и принципы с их. В моем случае я добавляю поддержку 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.