Социальные сети

У нас нашли

Спонсоры проекта

    Авто из США
    Цены на доставку. Аналитика, тест-драйвы, история автомарок.
    auto-mos.ru

Когда N лет назад я искал и не нашёл рефакторинг C++ в Visual Studio, то был поражён в самое сердце.

Как же так, "Микрософт нас бросил!", "Как они могли?!", "Разве так поступают нормальные люди?!". При спокойном размышлении через пять минут я стал перебирать детали кошмарного синтаксиса этого языка и даже стал сочувствовать разработчикам VS. Нет, они не от хорошей жизни отказались от встроенного рефакторинга плюсового кода и отдали это поле разработчикам сторонних плагинов.

Приведу сегодняшний пример ручного рефакторинга, невозможного с точки зрения автоматических средств. Начать надо с того, что компилятор VS 2008 очень придирчив к исплользованию неконстантных методов на константных объектах и трактует такое как ошибку:


class foo{
public:
int bar();
...
};

const foo * f = ...;
f->bar(); //< Error C2662: cannot convert 'this' pointer from 'const foo' to 'foo &'

В проекте есть ветвистая иерархия классов с единым корнем, сложившаяся ещё во времена 386-х компьютеров и написанная скорее в процедурном стиле, чем в парадигме ООП. Естественно, речь о лучших практиках и паттернах проектирования не шла, модификатор const к соответствующим методам не применялся, но самое неприятное в другом: этот код критически важен и одновременно слишком наукоемок, чтобы его переписать с нуля в обозримое время. Как только в проекте появляется код, желающий принимать (указатели на) константные объекты, возникает ошибка C2662.

К.О.^WМартин Фаулер со товарищи спешит на помощь: здесь определенно нужен рефакторинг. Выход видится простой: прописать в корне иерархии нужные консты, а потом аналогично поправить всех потомков. Но оказывается, что потомков под сто штук, что методов надо поправить штук двадцать, методы в потомках объявлены по-разному (по 4 комбинации на каждый), и бездумно натравливать автозамену на исходники нельзя. Итого, 100*20*4 действий. Много! Ну ладно, можно просто 20*4, но это тоже немало. И усугубляет ситуацию то, что невозможно автоматически проверить, правильно ли всё сделано. В языке C++ нет возможности различить перегруженный метод с другой сигнатурой и унаследованный метод с ошибочно указанной сигнатурой. Так как у нас большинство вызовов делаются по указателю на базовый класс, то компилятор не может сделать предупреждения о неверном использовании метода или об отсутствующем методе. Достаточно пропустить одну замену — и в коде появится бомба замедленного действия.

Какие мне видятся решения. Одно неправильное, но быстрое: везде в новом коде не использовать константные объекты, дескать, доверять всем и везде. Другое правильное, но не избавленное от необходимости проверять результаты вручную: написать скрипт на перле для замены всех неправильных паттернов на правильные и натравить его на плюсовые файлы.

Правильного и автоматического решения я пока не знаю. Есть предложения?









Читайте также

  • Боль
  • говорят,боль надо выкрикивать
  • PHP5 + Oracle (OCI8)
  • Работа с Cisco IOS H.323 Gatekeeper
  • Язык C++ не предназначен для научных вычислений



  • Последние новости


    План занятий

    Обучение детей от года до 3 лет плаванию, как правило, проходит в три этапа. На первом этапе ребенок должен адаптироваться к воде, избавиться от страха перед глубиной, неизвестной средой. Намного проще дети привыкают к бассейну, где есть бортики, вода теплая и прозрачная. Чуть сложнее дети адаптируются к открытым водоемам с темной и прохладной ...
    Читать далее »

    Гимнастика от 2 лет до 2 лет 6 месяцев

    1. Самостоятельная ходьба. 2. Бег вдогонку за взрослым или к взрослому в разном темпе. 3. Руки вверх, потянуться – «деревья большие большие», развести руки в стороны. 4. Ходьба по доске, приподнятой над полом на 15–20 см. 5. Приседания. 6. Подъем туловища с опорой на ладони в положении лежа на животе. 7. Хлопк...
    Читать далее »

    Проблема: ожоги, ушибы, травмы

    Немного повзрослев, ребенок начинает интересоваться источниками огня, что чревато ожогом. При незначительном ожоге необходимо поврежденный участок тела поместить под холодную проточную воду, а затем обработать антиожоговым аэрозолем. В период выздоровления применяют массаж, который способствует улучшению лимфо– и кровотока. В резуль...
    Читать далее »

    Проблема: плоскостопие

    Когда ребенок начинает ходить, его первые шаги могут быть омрачены плоскостопием. К сожалению, если эта болезнь наследственная, то волнения вполне обоснованны. И здесь без посещения детского врача ортопеда не обойтись. Его рекомендации относятся к укреплению подошвенного свода стопы вашего ребенка. Костная структура стопы ребенка ...
    Читать далее »

    Рефлекторные движения

    Рефлекторные гимнастические упражнения, В основе которых лежат врожденные двигательные рефлекторные реакции, проводятся первые три пять месяцев жизни ребенка, когда еще не утрачены безусловные двигательные рефлексы – «автоматическая походка», ладонно ротовой рефлекс, хоботковый рефлекс, сохранение равновесия, защитно оборонительные рефлексы. Рефлекторные гимнасти...
    Читать далее »

    Техника выполнения: растирание

    Прямолинейное растирание Выполняется концевыми фалангами одного или нескольких пальцев. Движение проводится прямолинейно одной рукой или обеими, иногда с отягощением. Круговое растирание Проводится с помощью круговых движений концевыми фалангами одного или нескольких пальцев. Кисть располагается с опорой на основании ладони, а манипуляции выполняют в сторону мизинца одной рук...
    Читать далее »

    Проблема: пупочная грыжа

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