Вопрос об архитектуре: гибкость или безопасность? - CodeHelper

Вопрос об архитектуре: гибкость или безопасность?

1

Нужно определиться с вопросом ОО дизайна. Концептуально вопрос звучит так: чему отдавать предпочтение при проектировании — безопасности или гибкости (сразу оговорюсь, что под «безопасностью» здесь я подразумеваю проверку типов во время компиляции.). Рассмотрим задачу на примере.

Задача: нужно сделать сервис, осуществляющий рассылку на email при наступлении некоторых событий.

Решение 1 (безопасное): В интерфейс сервиса включаем по одному методу на каждое событие, о котором нужно оповещать:

public interface IEmailSender
{
    void NotifyEvent1(string param1, object param2);
    void NotifyEvent2(int param1, object param2, object param3);
    void NotifyEvent3(object param1);
}

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

Решение 2 (гибкое): В интерфейс сервиса включаем только один метод, обрабатывающий все события:

public interface IEmailSender
{
    void NotifyEvent(string eventType, object[] eventParams);
}

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

Как найти компромисс между двумя этими решениями?

Новые ответы


1

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


v1.7.123.556
© 2009—2010 CodeHelper FAQ | О сайте | Обратная связь | История изменений | Статьи
Creative Commons LicenseМатериалы сайта распространяются под лицензией Creative Commons Attribution-Share Alike 3.0 Unported.