Меня попросили поддерживать некоторый код, который не является устаревшим, как я бы хотел, и он пронизан директивами компилятора, что делает его в значительной степени нечитаемым и почти нечитаемым. как ремонтопригодный. Показательный пример:
#if CONDITION_1
protected override void BeforeAdd(LogEntity entity)
#else
protected override void BeforeAdd(AbstractBusinessEntity entity)
#endif
{
#if CONDITON_1
entity.DateTimeInsert = DateTime.Now;
#else
((LogEntity) entity).DateTimeInsert = DateTime.Now;
#endif
base.BeforeAdd(entity);
}
директивы using
еще красивее:
#if CONDITION_1
using CompanyName.Configuration;
#endif
#if CONDITION_2||CONDITION_1
using CompanyName.Data;
using CompanyName.Data.SqlBuilders;
#else
using CompanyName.Legacy.Database;
using CompanyName.Legacy.Database.SQLBuilders;
using CompanyName.Legacy.Database.SQLBuilders.parameterTypes;
#endif
Я думал, что попробую использовать ConditionalAttribute
, но в данной ситуации это не сработает
Есть ли каким-либо образом я могу выбраться из этого кошмара директив компилятора?
Код скомпилирован для .NET 3.5
.
ОБНОВЛЕНИЕ:
Одед ответил, предлагая удалить директивы компилятора вокруг Метод BeforeAdd
, таким образом, перегружает его. К сожалению, это не сработает, поскольку предполагается, что оба метода переопределяют класс AbstractBusiness
, который предоставляет две разные реализации в зависимости от того, какие сборки в конечном итоге будут включены:
protected virtual void BeforeAdd(TEntity entity) {}
или
protected virtual void BeforeAdd(AbstractBusinessEntity entity) {}
. Этот код получает свои зависимости от набор библиотек, созданных компанией когда-то в прошлом и с тех пор «обновляющихся». Теперь у них есть 4 разные версии этого набора библиотек с конфликтующими пространствами имен и разными реализациями. И все во имя «обратной совместимости» с приложениями, которые используют (очень) старые версии.
В итоге я выбрал ответ @ Oded, потому что он имеет наибольший смысл в качестве общего подхода ( KISS и все такое). Однако я не мог использовать его в этом случае; то, что вы видите здесь, - это лишь верхушка айсберга. Я бы не хотел ЦЕЛОВАТЬ этот код, если бы он мне платил.