Меня попросили сделать обзор кода и сообщить о возможности добавления новой функции в один из наших новых продуктов, который я лично не работал до сих пор. Я знаю, что легко подделать чей-то код, но я бы сказал, что он в плохом состоянии (пытаясь быть как можно более объективным). Некоторые моменты из моего обзора кода:
-
Злоупотребление потоками:
QueueUserWorkItem
и потоки в целом используются много, а делегаты пула потоков имеют неинформативные имена, такие какPoolStart
иPoolStart2
. Существует также отсутствие надлежащей синхронизации между потоками, в частности доступ к объектам пользовательского интерфейса для потоков, отличных от потока пользовательского интерфейса. -
Магические числа и магические строки. В коде определены некоторые
Const
иEnum
, но большая часть кода использует литеральные значения. -
Глобальные переменные. Многие переменные объявляются глобальными и могут быть инициализированы или не могут быть инициализированы в зависимости от того, какие пути кода следуют и какие вещи порядка происходят. Это очень запутывает, когда код также перескакивая между потоками.
-
Предупреждения компилятора. Основной файл решения содержит более 500 предупреждений, а общее число неизвестно мне. Я получил предупреждение от Visual Studio, что он не может отображать больше предупреждений.
-
Полуфабрикаты: код был обработан и добавлен туда и там, и я думаю, что это привело к тому, что люди забыли, что они делали раньше, поэтому есть несколько, казалось бы, полуфабрикаты и пустые заглушки.
-
Not Invented Here. Продукт дублирует функциональные возможности, которые уже существуют в общих библиотеках, используемых другими продуктами, например, помощники доступа к данным, помощники по протоколированию ошибок и помощники пользовательского интерфейса.
-
Разделение проблем. Я думаю, что кто-то держал книгу с ног на голову, когда они читали о типичной трехуровневой архитектуре уровня доступа к пользовательскому интерфейсу - бизнес-уровень → уровень доступа к данным. В этой кодовой базе пользовательский интерфейс напрямую обращается к базе данных, потому что бизнес-уровень частично реализован, но в основном игнорируется из-за того, что он недостаточно близок, и уровень доступа к данным управляет уровнем пользовательского интерфейса. Большинство низкоуровневых баз данных и сетевых методов работают с глобальной ссылкой на основную форму и непосредственно показывают, скрывают и изменяют форму. Там, где фактически используется довольно тонкий бизнес-уровень, он также имеет тенденцию напрямую контролировать интерфейс. Большая часть этого кода нижнего уровня также использует
MessageBox.Show
для отображения сообщений об ошибках при возникновении исключения и большинство проглатывает исходное исключение. Это, конечно, немного сложнее начать писать тесты единиц, чтобы проверить функциональность программы, прежде чем пытаться ее реорганизовать.
Я просто царапаю поверхность здесь, но мой вопрос достаточно прост: было бы разумнее потратить время на реорганизацию существующей кодовой базы, сосредоточив внимание на одной проблеме за раз, или вы бы подумали о том, чтобы переписать всю вещь с нуля?
EDIT. Чтобы немного уточнить, у нас есть оригинальные требования к проекту, поэтому запуск может быть вариантом. Еще один способ рассказать о моем вопросе: может ли код когда-либо достигать точки, где стоимость его поддержания станет больше, чем затраты на ее сброс и начало?