Когда встроенного рефакторинга нема...
...приходится вот так развлекаться
Зачем? А затем что было много DAO/Repository с примерно вот таким кодом:
т.е. для случаев когда в domain model есть интерфейс и его реализация, хотя были и такие случаи при которых только один класс без интерфейса:
а после некоторого рефакторинга хотелось бы получить код поаккуратней, вот такой для первого случая:
А для второго соответственно просто избавится от ненужного конструктора, что данными регулярными выражениями и решается.
На то чтобы написать эти пару шаблонов у меня ушло наверное столько же времени сколько бы ушло на то чтобы эти 30 с лишним файлов исправить вручную - но разница в том что так прикольно, а вручную меня бы уже на половине начало подташнивать и я бы делал это на морально-волевых.
А в свежевыдшедшей версии Intellij IDEA она тебе не только подсветит подпадающий под regex текст, но и покажет на что его заменит
Надо заметить что для таких примитивных способов рефакторинга немало помогает использование различных префиксов (в моем случай - стандартный для .net префикс I для интерфейсов), но это ведь не строгое требование хотя и принято по стандартному соглашению, а что если у нас Java, в которой такого соглашения нет - т.е. никакого префикса для интерфейсов нет, а мне нужно чтобы под замену попали только интерфейсы, как это сделать? Т.е. очевидно уже что простым регулярным выражением не спасешься - пришлось бы писать скрипт который бы находил определение типа и смотрел бы интерфейс это или класс.
Но ведь среда разработки уже сделала это (зачем бы она была еще нужна) - т.е. она уже проанализоравала проект и знает чем является тип - и если я выполняю поиск внутри проект как бы мне указать что вот тут вот должен быть именно интерфейс, ide найди только те места в которых в данном месте указан интерфейс.
И вот оказывается в IDEA (платной версии) и ReSharper - есть такая штука как Structural Search / Search With Pattern, которые позволяют использовать PSI-дерево, которое построила среда разработки, вот простенький пример, в данном случае для того чтобы найти все перечисления для которых выполняется некоторая проверка:
Подробнее можно прочитать здесь:
http://www.slideshare.net/intelliyole/implementing-refactorings-in-intellij-idea-presentation http://www.jetbrains.com/idea/documentation/ssr.html http://blogs.jetbrains.com/dotnet/2010/04/introducing-resharper-50-structural-search-and-replace/ http://www.jetbrains.com/resharper/webhelp/Reference__Search_with_Pattern.html
У такого подхода еще немало преимуществ просто в плане удобства - не надо предусматривать все варианты форматирования - посколько для шаблона по которому мы ищем то же строится семантическое дерево дерево (если отметить Match similar constructs) - и ищется именно семантическое соответствие!