Wednesday, October 6, 2010

Я пишу extract method

Вы когда-нибудь писали extract method? Я мечтал написать его с первого дня моей работы в жетбрэйнс. И до этого тоже мечтал, так что теперь чувствую как моя мечта постепенно начинает сбываться.

Переписываю с нуля, старый код почти не использую. Мне всегда проще написать все с самого начала, это позволяет увидеть картину в целом и лишь когда при реализации становится понятно что какой-то нетривиальный фрагмент был уже написан с удовольствием копирую его к себе.

В первый же день написал решение глобальной задачи анализа потока данных дня определения того, что надо передать в метод и что оттуда возвратить. Думаю, каждый когда-нибудь слышал про чудесный алгоритм dfa. Я счастлив, мне удалось его использовать! Немного повозиться с лямбдами, не забыть про ref out параметры объемлющего метода, еще не забыть тысячу мелочей и уже проходят полторы сотни тестов! На третий день, как раз сегодня, рисовал формочку с кнопочками и галочками. Нарисовалось с десяток различных настроек. Может быть диалог не нужен вовсе? Нет... Мир к этому еще не готов. Со скрипом удается разместить все на том же пространстве на котором были и старые опции, но с одной оговоркой. Не удивляйтесь теперь если до странички с выбором параметров у вас спросят, а что, собственно, вы хотите получить? Метод, свойство или может быть конструктор?

Еще немного из задуманного... Возможность создать сразу статический метод. Да, да! а не зафигачить ли туда третью страничку ака make static, где и позволить почтенному пользователю насладиться всем разнообразием способов избавится от использований 'себя'? А как вам методы с yield return? Наверное только ленивый не пытался выделить подпоследовательность, разочароваться, написать баг... А любую ли подпоследовательность можно вынести в новый метод? А если там yield break? А если yield return есть, то иногда можно обойтись без ienumerable. Кстати, определить это в общем случае довольно интересная задача. И к тому же довольно простая. Добавим анализ yield return в чудесный dfa, и будем проверять, что каждый yield return выполняется ровно один раз. Люблю язык c# - с ним такая проверка делается за 2 строчки кода! В первой проверяем что на любом выходе мы прошли через какой-нибудь yield, во второй для никакой yield не предшествует никакому и даже самому себе!

Думаю, extract method может дать фору любому рефакторингу по количеству частных случаев, а сколько мы их нашли можно будет увидеть совсем скоро! Я говорю мы, так как большинство из них имеют свои корни в нашем багтрекере, где, между прочим, можно посмотреть и состояние дел в других рефакторингах. Extract method сейчас чемпион. 45 реквестов! А кто следующий?

No comments:

Post a Comment