【问题标题】:Use of strings vs enums as parameter of factory method?使用字符串与枚举作为工厂方法的参数?
【发布时间】:2021-04-18 15:44:25
【问题描述】:

我最近在阅读这个博客https://blog.cleancoder.com/uncle-bob/2021/03/06/ifElseSwitch.html,这段话让我很困惑:

小心那个记号 x。不要试图使它成为枚举或任何东西 这需要在红线上方声明。一个整数,或一个 字符串是更好的选择。它可能不是类型安全的。确实不能 类型安全。但这将允许您保留组件 架构的结构。

如果我们在高层模块中声明一个枚举,那不还是低层模块依赖于高层模块吗?如果是这样,那么在这种情况下使用枚举有什么问题?

【问题讨论】:

标签: design-patterns enums factory solid-principles


【解决方案1】:

唯一能肯定回答这个问题的人是 Robert C. Martin 本人,但我会尝试尝试一下。

据我了解,隐含的场景是$input 参数代表运行时输入,它本质上是非类型安全的。 p>

在许多应用程序架构中,软件“与现实世界相遇”都有一个界限。在原始应用程序中,您可以要求用户为 male 输入 0,为 female 输入 1。在控制台应用程序中,您甚至不会收到 int - 您会收到 string。

在 Web 应用程序中,您很容易遇到类似的问题。即使你用单选按钮制作了一个不错的 GUI,你也不能完全相信某些恶意用户不会试图绕过 GUI 而是给你一个原始的string - 或者,在其他地方的一个错误该代码将执行类似的效果。

引入枚举不会改变这一点。您仍然必须将原始 string 解析为枚举值。如果您接下来要做的是在枚举上使用switch 来生成多态对象,那么您还不如省去中间步骤,从而省去枚举。

这个讨论让人想起 Alexis King 的精彩博文 Parse, don't validate,其中提出了类似的观点:将结构较少的东西变成结构更好的东西。

【讨论】:

    【解决方案2】:

    依赖的方向很好。不过,还有另一个问题。当由于需求变化而添加新的枚举器时,边界的两侧都必须更改。这违反了开闭原则。我们希望能够做出不影响边界更高级别一侧的更改。

    如果您使用字符串,则在该行下方添加新条件不会强制对该行上方进行任何更改。

    你可能会问高层是如何了解字符串的。原来高层可以向低层询问所有相关的字符串。

    因此,通过使用字符串而不是枚举,您可以保护高级代码免受对低级需求的更改。

    【讨论】:

    • "当由于需求变化而增加一个新的枚举器时,边界的两边都必须改变" 是的,另一方面,与提议的设计,虽然你可以添加新的值来开启,但如果你需要添加新的能力(一种新的方法),双方都必须改变。这被称为Expression Problem。你可能已经知道了,但我会把它留给其他感兴趣的读者。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多