Я обнаружил, что в моем коде много разных методов:
try
{
runABunchOfMethods();
}
catch (Exception ex)
{
logger.Log(ex);
}
Как насчет создания этого:
public static class Executor
{
private static ILogger logger;
public delegate void ExecuteThis();
static Executor()
{
// logger = ...GetLoggerFromIoC();
}
public static void Execute<T>(ExecuteThis executeThis)
where T : Exception
{
try
{
executeThis();
}
catch (T ex)
{
// Some kind of Exception Handling Strategy...
logger.Log(ex);
// throw;
}
}
}
И просто так:
private void RunSomething()
{
Method1(someClassVar);
Method2(someOtherClassVar);
}
...
Executor.Execute<ApplicationException>(RunSomething);
Есть ли недостатки этого подхода? (Вы можете добавить Executor-методы и делегаты, когда вы хотите, наконец, и использовать обобщенные типы для типа Exeception, который вы хотите перехватить ...)
Редактировать: Извините за непонятность - я действительно хотел получить некоторую информацию об общей идее попытки переместить выполнение кода из рассматриваемого класса в более обобщенный класс, который делает это. Я только что сделал быстрый макет решения, но в реальной жизни вы, естественно, использовали бы такие вещи, как стратегии обработки исключений, абстрактные базовые классы выполнения с более специализированными классами выполнения для определенного слоя / части системы. Обычно я создаю один метод с помощью try ... / runABunchOfMethods-part (это выполняет обработку исключений со специализированными исключениями), который вызывает runABunchOfMethods, которые, в свою очередь, выполняют ограниченный набор других методов в стиле «чистого кода».
Я куплю аргумент обфускации на некоторых уровнях, но если все решение / архитектура примет этот предложенный подход, новый программист сможет понять шаблон.
Я отредактировал Executor для включения общего T, чтобы позволить вызывающему коду указывать исключение только для того, чтобы показать, как обрабатывать специализированное исключение. В других случаях у вас может быть несколько уловок: в зависимости от того, что вы хотите сделать, но это особые случаи в конкретных подклассах, о которых я говорил.