предисловие
У многих возникает вопрос,почему так любят спрашивать принцип и исходники в интервью.Но реальная работа вообще не используется,то есть как все часто говорят,на собеседовании строишь ракету,заходишь и Закрутите винт. Многие друзья вокруг меня спрашивали меня, Мой ответ им. Если вы не читаете исходный код и не понимаете принцип, как вы можете решить проблему? Ответ, который они мне дали, был в основном два слова,"поиск"
Это правда, что большинство проблем на работе можно решить, скопировав информацию об ошибке и выполнив поиск.Кроме того, сейчас появляется все больше и больше фреймворков, а метод программирования в стиле строительных блоков и поисковая система упростили более и больше людей для разработки.Я всегда хотел привести пример, который вряд ли можно найти поиском, а причину можно понять только взглянув на исходный код.
Так уж получилось, что это произошло в августе прошлого года, мой очень хороший друг задал мне этот вопрос, он сказал
Почему я передаю пустую строку, но использую тег if Mybatis для оценки
空字符串 == 0
Было установлено
С нашей точки зрения, а空字符串
и一个数字0
Невозможно быть равным. Итак, моя первая реакция: он использует это неправильно? Или его бизнес-код мешает где-то еще? Поэтому я решил написать простейшую демонстрацию для тестирования.
Тогда вывод следующий:
Удивительно, но этоif标签
конечно же空字符串
и数字0
признаны равными.
Не хочу вам тут врать.При столкновении с такого рода проблемой,честно говоря,первая реакция-это конечно не смотреть исходный код,а открыть браузер и поискать.Есть два основных направления для нашего поиска один - принцип суждения тега mybatis if, Один - почему пустая строка тега mybatis if равна 0. Оказалось, что мы не нашли ответ, который искали (вы можете искать это сами).
Конечно, хотя удовлетворительного ответа найдено не было, мы нашли другой пример.
Я считаю, что в вашем проекте должно быть много кода, подобного этому суждению.
<if test="uid != null and uid != '' ">
</if>
В нашей обычной разработке многим коллегам нравитсяскопировать и вставить!
Так что же плохого в копировании и вставке без раздумий? Давайте рассмотрим следующий пример.
Хотя это суждение делается путем копирования и вставки челнока, но из нашего познания этот объект действительно неnull
, не равно空字符串
, поэтому суждение должно бытьtrue
, но результат следующий:
Конечно, это подрывает наше познание, но если вы столкнулись со случаем 2, лучше поискать, и вы все равно сможете найти решение, как показано ниже.
На самом деле проблема заключается в обоих случаях, то есть в теге if, который оценивает 0 и пустую строку как равные.
на этот разСтук по доскеТеперь, как говорится, если тебя десять лет кусает змея, ты боишься веревки.Хотя у нас есть решение для второго примера,Но эти решения все временные решения.Если мы не понимаем принцип,то у вас всегда будет ком в душе.Вы боитесь следующего раза,и будут происходить странные вещи.Только поняв принцип можно Решить проблемы от первопричины, то есть решить тип проблемы, а не конкретную проблему.
В то же время я также понял, что появилась возможность, и, наконец, нашел为什么要看源码
более подходящий пример
Анализировать исходный код
Поскольку ссылка относительно длинная, процесс отладки здесь не показан (если вы не знакомы с процессом выполнения Mybatis, вы можете посмотреть мой предыдущийНе бойтесь смотреть на исходный код, изображение, чтобы понять принцип Mapper Mybatis., а затем выполнять отладку по ходу выполнения
Для анализа возьмем первый пример, потому что проблема, возникающая в обоих случаях, на самом деле одна и та же.
Если вы не понимаете вышесказанное, я могу кратко описать это здесь:
Прежде всего, он получит типы двух объектов суждения.Когда он оценивает строку и число, поскольку типы разные, когда mybatis обнаруживает, что строку можно преобразовать в число, он преобразует строку в число. Преобразуйте его в число, а затем судите по этому числу.
Итак, вопрос в том, в какое число будет преобразована эта пустая строка?
это из источника
return s.length() == 0 ? 0.0D : Double.parseDouble(s);
Видно, что эта пустая строка будет преобразована в 0. Итак, теперь все понятно.
Но исходники прочитаны, а проблема так и не решена.В нем так много исходников для других типов суждений, прочитать их все невозможно, да и время не позволяет.А вдруг есть другие ямы? Этого недостаточно, и для решения проблемы нужны аналитические идеи, поэтому в Интернете так много статей по анализу исходного кода, а также стоит обратить внимание на официальный аккаунт Feichao (id: feichao_java)
идеи решения проблем
Хотя мы читали исходный код, мы также знаем, что правила этого суждения отличаются от того, что мы хотим. Но ключ в том, как решить проблему. Первая реакция многих людей - изменить исходный код. Но, честно говоря, , вы просто прочитали такой маленький кусок исходника и опрометчиво его модифицировали, вы уверены, что сможете им управлять, и уверены, что это не вызовет других проблем?Так вот это направление мышления для решения проблемы, обратите внимание, я речь о направлении, что очень важно.
Если говорить о трех основных характеристиках объектно-ориентированного подхода, то с ним должен быть знаком каждый.封装
,继承
,多态
.А вот пять принципов объектно-ориентированного.Тогда всем может быть немного не знакомо.То есть
单一职责
开闭原则
依赖导致原则
接口隔离原则
Liskov替换原则
Тогда я скажу开闭原则
, Цитируя Baidu, чтобы знать, что относительно краткое описание в нем выглядит так
Основная идея принципа открытого-закрытого заключается в том, что программные объекты должны быть расширяемыми, но не модифицируемыми. То есть открытые для расширения и закрытые для модификации.
Если вы что-то знаете о шаблонах проектирования, вы можете понять смысл этого предложения. Если вы этого не понимаете, вы можете взглянуть大话设计模式
Как эта книга знакомит策略
Шаблон проектирования. Проще говоря, если вы используетеif
Суждение, если вы добавите еще одно требование, вы должны добавить еще одноelse if
, то есть изменить код.Но хороший дизайн должен быть, чтобы добавить еще одно требование, мне нужно только добавить еще один класс реализации, который является своего рода策略
.(Если вам не понятно, то рекомендуется посмотреть шаблон проектирования), на самом деле в SPI тоже заложена идея этого принципа открыто-закрыто.
Mybatis такой отличный фреймворк.Люди естественно понимают пять принципов объектно-ориентированного, поэтому они должны следовать этому принципу.То есть он обязательно даст вам возможность добавить еще один класс,а потом в этот класс, для настройки правил решения if.
решение
Настраиваем класс, например, я назвал егоFeiChaoOgnl
Тогда мы пишем это так
Тогда давайте бежать
просто поставьFeiChaoOgnl
Метод оценки завершен.Согласно этому методу письма, даже если вы скопируете и вставите шаттл, риск возникновения проблем значительно снижается.
напиши в конце
Эта статья — только вершина айсберга,Сотни оригинальных галантерейных товаров все еще в пути,Отсканируйте QR-код нижеСледуйте за Фей Чао,Пусть вас, рожденных строить ракеты, перестанут обижать и облажаться!