Существуют ли решения для оптимизации обновления устаревшего кода в нескольких местах?

Я работаю над старым кодом, который изначально был разработан для обработки файлов двух разных типов. Недавно мне было поручено добавить новый тип файла в этот код. Большинство моих проблем было решено путем заполнения обширного XML-файла новой записью, в которой обрабатывалось все, начиная от названий списков и заканчивая тем, как файл записан во множественном нижнем регистре. Но этого оказалось недостаточно, поскольку в 24 различных файлах кода было, возможно, 50 разных мест, где мне приходилось обновлять жестко закодированные операторы-переключатели, которые разветвлялись только для исходных двух типов файлов.

К сожалению, в этом нет последовательности; Есть методы, которые работают наполовину из XML-файла, а наполовину - из жесткого кода. Некоторые из файлов, которые выглядят так, как будто они работают вне XML-файла, не работают, а некоторые, которые я ожидаю, что мне нужно обновить жесткий код, не нуждаются в этом. Таким образом, единственный способ найти большинство из них - это пройти тестирование всей системы, когда только ее часть работает, и найти один шаг для исправления (когда мне повезло, что регистрация ошибок фактически говорит мне, что происходит), а затем снова запустил все это. Это напрасная трата времени на тестирование частей кода, которые уже подтверждены для работы, лучше потратить время на тестирование новых частей, которые я должен добавить поверх всего этого.

Это полторы хлопоты, и, к счастью, я могу ожидать, что мне придется добавить еще один новый тип файлов в ближайшем будущем.

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

Сомневаюсь, что это имеет особое значение, но код состоит из страниц ASP.NET, некоторых элементов управления ASP.NET, сотен файлов кода C# и нескольких дополнительных файлов XML. Это все в настоящее время в паре больших проектов Visual Studio 2008.

2 ответа

Я полностью согласен с комментарием об использовании книги Майкла Фезерса, чтобы научиться встраивать новые тесты в унаследованный код. Я также настоятельно рекомендую рефакторинг Мартина Фаулера. То, что вы должны сделать для своего кода, это реализовать рефакторинг "Заменить условные выражения полиморфизмом".

Я полагаю, ваш код сегодня выглядит примерно так:

if (filetype == 23)
{
  type23parser.parse(file);
}
else if (filetype == 69)
{
  filestore = type69reader.read(file);
  File newfile = convertFSto23(filestore);
  type23parser.parse(newfile);
}

То, что вы хотите сделать, это абстрагировать все виды логики if (type == foo) в шаблоны стратегий, которые создаются на фабрике.

class FileRules : pReader(NULL), pParser(NULL)
{
private:
  FileReaderRules *pReader;
  FileParserRules *pParser;
public:
  void read(File* inFile) {pReader->read(inFile);};
  void parse(File* inFile) {pParser->parse(inFile);};
};

class FileRulesFactory
{
  FileRules* GetRules(int inputFiletype, int parserType)
  {
    switch (inputFiletype)
    {
    case 23: 
      pReader = new ASCIIReader;
      break;
    case 69:
      pReader = new EBCDICReader;
      break;
    }
    switch (parserType)
    ... etc...

тогда ваша основная строка кода выглядит так:

  FileRules* rules = FileRulesFactory.GetRules(filetype, parsertype);
  rules.read(file);
  rules.parse(file);

Выполните этот рефакторинг, и добавление нового набора типов файлов, анализаторов, читателей и т. Д. Становится так же просто, как написание одного эксклюзивного для вашего нового типа.

Конечно, иди почитай книгу. Я здесь сильно упрощен, и, возможно, все неправильно, но вы должны получить общее представление о том, как к этому подойти. Я также могу порекомендовать другую книгу "Образцы дизайна Head First", в которой есть отличный раздел о шаблонах Factory (если вам нравятся эти книги типа "Head First").

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

Другие вопросы по тегам