Рассмотрим этот класс с бизнес-логикой:
public static class OrderShipper
{
public static void ShipOrder(Order order) {
AuthorizationHelper.AuthorizedUser();
using (new PerformanceProfiler()) {
OperationRetryHelper.HandleWithRetries(() => ShipOrderInTransaction(order));
}
}
private static void ShipOrderInTransaction(Order order) {
using (var transaction = new TransactionHelper()) {
ShipOrderInternal(order);
transaction.Commit();
}
}
private static void ShipOrderInternal(order) {
// lots of business logic
}
}
Класс содержит некоторую бизнес-логику, а также выполняет некоторые общие задачи. Хотя нет никаких сомнений в том, что этот класс нарушает принцип открытости / закрытости, нарушает ли этот класс принцип единой ответственности?
Я сомневаюсь, поскольку сам класс не отвечает за авторизацию пользователя, профилирование производительности и обработку транзакции.
Нет никаких сомнений в том, что это плохой дизайн, поскольку класс все еще (статически) зависит от этих пересекающихся проблем, но все же: нарушает ли он SRP. Если да, то почему?
Profiler
иTransaction
- тогда вы привязаны только к интерфейсу для своих внешних зависимостей, и это нормально (предполагается, что интерфейсы не изменятся) 10.04.2013