Я разрабатываю и поддерживаю большое (500k + LOC) приложение WinForms, написанное на C # 2.0.Он многопользовательский и в настоящее время развернут на 15 машинах.Разработка системы продолжается (может рассматриваться как вечная бета-версия), и очень мало сделано для защиты пользователей от потенциальных новых ошибок, которые могут появиться в еженедельной сборке.
По этой причине средидругие, я обнаружил, что становлюсь очень зависимым от редактирования и продолжения в отладчике.Он помогает не только в поиске и исправлении ошибок, но и в некоторых случаях в процессе разработки.Я считаю чрезвычайно ценным иметь возможность выполнять вновь написанный код из контекста запущенного приложения - нет необходимости перекомпилировать и добавлять определенную точку входа в новый код (необходимость добавлять фиктивные пункты меню, кнопки и т. Д. Дляприложение и не забудьте удалить их до следующей производственной сборки) - все можно попробовать и протестировать в режиме реального времени, не останавливая процесс.
Я держу редактировать и продолжать так высоко, что я активно пишукод, чтобы быть полностью совместимым с ним.Например, я избегаю:
- Анонимные методы и встроенные делегаты (если полностью невозможно переписать)
- Универсальные методы (кроме стабильного, неизменного кода утилиты)
- Ориентация проектов на «Любой ЦП» (т.е. никогда не выполняется в 64-битном режиме)
- Инициализация полей в точке объявления (инициализация перемещается в конструктор)
- Запись блоков перечислителя, использующих
yield
(кроме кода служебной программы)
Теперь я полностью осознаю, что новые языковые функции в C # 3 и 4 в значительной степени несовместимы с функциями редактирования и продолжения (лямбда-выражения, LINQ и т. д.),Это одна из причин, по которой я сопротивлялся переходу проекта на более новую версию Framework.
Мой вопрос заключается в том, является ли хорошей практикой избегать использования этих более сложных конструкций в пользу кода, которыйочень легко отлаживать?Есть ли законность в таком развитии или это расточительно?Кроме того, важно, что любая из этих конструкций (лямбда-выражения, анонимные методы и т. Д.) Влечет за собой накладные расходы производительности / памяти, которых может избежать хорошо написанный, совместимый с редактированием и продолжением код?... или внутренняя работа компилятора C # заставляет такие сложные конструкции работать быстрее, чем написанный вручную "расширенный" код?