c# - 调用其他代码是否违反(SOLID)单一责任原则(SRP)?

标签 c# oop design-patterns design-principles

用业务逻辑考虑这个类:

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
    }
}

该类包含一些业务逻辑,并执行一些横切关注点。虽然毫无疑问这个类违反了Open/Closed Principle , 这个类是否违反了 Single Responsibility Principle ?

我有疑问,因为类本身不负责授权用户、分析性能和处理事务。

毫无疑问,这是一个糟糕的设计,因为该类仍然(静态地)依赖于那些横切关注点,但仍然:它是否违反了 SRP。如果是,这是为什么?

最佳答案

这是一个很好的问题,标题有点误导(您不太可能在不“调用其他代码”的情况下构建应用程序)。请记住,SOLID 原则与其说是必须遵守的绝对规则,不如说是指导方针;如果您将 SRP 得出其合乎逻辑的结论,您最终会得到每个类一个方法。最小化横切关注点影响的方法是创建一个尽可能易于使用的外观。在您的示例中,您做得很好——每个横切关注点只使用一行。

实现此目的的另一种方法是通过 AOP ,这在 C# 中可以通过使用 PostSharp 实现或通过 IoC interception

关于c# - 调用其他代码是否违反(SOLID)单一责任原则(SRP)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15925786/

相关文章:

C# 如何访问 ListView 中的下拉框?

c# - 一个静态类常量在被调用时充当字符串枚举问题

python - 如何从正则表达式模式返回随机字符? python 3

c# - 在 C# 中使用工厂设计模式的示例

c++ - "clean object model"是什么意思?

c# - Lucene.Net IndexWriter 无法加载文件错误?

c# - 找不到引用 Entity Framework 实体的对象

database - 如何为在数据库中更改角色的对象设计表

Java OO Design 帮助 - 如何抽象出一个保存方法?

javascript - OOP Jquery 由于闭包而丢失值