matches();
не буферизует, а find()
- буферы. find()
сначала выполняет поиск в конце строки, индексирует результат и возвращает логическое значение и соответствующий индекс.
Вот почему, когда у вас есть такой код, как
1:Pattern.compile("[a-z]");
2:Pattern.matcher("0a1b1c3d4");
3:int count = 0;
4:while(matcher.find()){
5:count++: }
В 4: механизм регулярных выражений с использованием структуры шаблонов будет читать весь ваш код (индекс для индексации, как указано regex[single character]
, чтобы найти хотя бы одно совпадение. Если такое совпадение найдено, оно будет проиндексировано, тогда цикл будет выполняться на основе индексированного результата else, если он не выполнил вычисления, как matches()
; Оператор while никогда не будет выполняться, так как первый символ совпадающей строки не является алфавитом.
Это действительно зависит от того, как плохо это.
Если это - маленькая система, и Вы полностью понимаете это, то переписывание не является сумасшедшим.
С другой стороны, если это - гигантский монстр прежней версии с десятью миллионами строк недокументированного таинственного кода, затем Вы действительно собираетесь прийтись нелегко с полным, переписывают.
Вопросы для рассмотрения:
Я действительно смущался бы брать гиганта, переписывают проект для большой системы не имея возможности для выпуска нового выпуска одна часть за один раз.
Просто очистите код немного каждого раза, когда Вы работаете с ним. Если уже нет того, установите платформу поблочного тестирования. Весь новый код должен получить записанные тесты. Любой старый код Вы фиксируете в результате ошибок, попытка скользить в тестах также.
В то время как очистки прогрессируют, Вы сможете развернуть все больше противного кода в инкапсулированные мусорные ведра. Затем можно собрать тех, которые один за другим в будущем.
Инструмент как javadoc или doxygen, если не уже используемый, может также помочь улучшить документацию кода и понятность.
Аргументы против полного переписывают довольно сильное. Те тонны "небольших ошибок" и поведений, которые были кодированы в за период времени исходного проекта, будут красться назад в снова.
Редко для переписывания чего-либо сложного успешно выполниться. Это заманчиво, но низкая стратегия процента.
Получите унаследованный код под модульными тестами и осуществите рефакторинг его и/или полностью замените небольшие части его инкрементно, когда подходящий.
Посмотрите Вещи эссе Joel Spolsky, которые Вы Никогда не должны Делать. Таким образом, когда Вы переписываете Вас, проигрывают все уроки, Вы учились заставлять свой текущий код работать способ, которым он должен работать.
См. также: Большой комок грязи
Осуществите рефакторинг, если это не очень плохо действительно.
У Joel есть много для высказывания относительно этого...
По крайней мере перепишите код со старым кодом перед Вами и только запуститесь с нуля. Старый код может быть ужасным, но это - способ, которым это по причине и если Вы проигнорируете его, то Вы закончите тем, что видели те же ошибки, которые были, вероятно, несколько зафиксированных годы назад в старом коде.
Одной причиной перезаписи в одном из моих предыдущих заданий была неспособность найти разработчиков с достаточным опытом работать над исходной кодовой базой.
Решение было принято, чтобы сначала очистить базовую структуру базы данных, затем переписать в чем-то, что помогло бы найти штатных сотрудников и/или подрядчиков.
Я еще не услышал, как это удалось :)
Я думаю, что у людей есть тенденция пойти для, переписывает, потому что это кажется большим количеством забавы на поверхности.
Мы добираемся для восстановления с нуля!
Мы сделаем его правильно на этот раз!
и т.д.
Существует новый книжный выход, Разработка приложений Существующих производств в.NET Baley и Belcham. Первая глава является бесплатной, и говорит об этих проблемах от главным образом перспектива агностика платформы.
Восстановление, или что еще более важно, осуществляет рефакторинг. И потому что Joel сказал так и также потому что, если это - Ваш код, Вы, вероятно, изучили тонну больше материала, так как Вы коснулись этого кода в последний раз. Если Вы записали это в.NET 1.1, можно обновить его до 3,5 SP1. Вы добираетесь, чтобы войти и произвести чистку всего старого закомментированного кода. Вы 100x лучше как разработчик теперь чем тогда, когда Вы сначала написали этот код.
Одно исключение я думаю, - когда код использует действительно устаревшие технологии - в этом случае Вы могли бы быть лучше обслужены путем записи новой версии. При рассмотрении некоторого приложения VB6 с 10 000 строк кода с бэкендом базы данных Access, очевидно, настроенным кем-то, кто не знал много о том, как базы данных работают (который мог очень хорошо быть Вами восемь лет назад), затем, можно, вероятно, осуществить более быстрое, решение C#/SQL-based в части времени и кода.
Это не таким образом черно и бело... это действительно зависит от большого количества факторов (более важное существо, "что делает человека, платящего Вам, хотят, чтобы Вы сделали"),
Где я работаю, мы переписали платформу разработки, и с другой стороны, мы продолжаем изменять некоторые старые системы, которые не могут быть перемещены (из-за технологии клиента и ограничений по времени). В этом случае мы пытаемся поддержать стиль кодирования, и иногда необходимо реализовать много обходных решений из-за способа, которым он был создан
В зависимости от Вашей ситуации у Вас могла бы быть другая опция: сторонний код в лицензии.
Я консультировался в нескольких компаниях, где это было бы разумным выбором, хотя по-видимому "выбрасывание IP" может быть большим барьером для управления. В моей текущей компании мы серьезно рассмотрели жизнеспособную возможность использования стороннего кода для замены нашей базовой платформы, но та идея была в конечном счете отвергнута больше по бизнес-причинам, чем технические причины.
Для прямого ответа на вопрос мы наконец приняли решение переписать платформу прежней версии - решение, которое мы не принимали слегка! 14 месяцев на, мы не сожалеем об этом выборе вообще. Просто считая время проведенным, исправляя ошибки, наша новая платформа почти заплатила за себя. На отрицательной стороне это не совсем полно функцией все же, таким образом, мы находимся в незавидном положении поддержания двух отдельных платформ параллельно, пока мы не можем портировать последнее из наших приложений "фронтенда".
Я настоятельно рекомендую чтение, "Работающее Эффективно с Унаследованным кодом" Michael Feathers. Это тренирует совет относительно того, как осуществить рефакторинг Ваш код так, чтобы это была тестируемая единица.