如何解决使用字符串与枚举作为工厂方法的参数?
我最近正在阅读这篇博客 https://blog.cleancoder.com/uncle-bob/2021/03/06/ifElseSwitch.html,这段话让我很困惑:
小心那个令牌 x。不要试图使它成为枚举或任何东西 这需要在红线上方进行声明。一个整数,或 字符串是更好的选择。它可能不是类型安全的。确实,不能 类型安全。但它将允许您保留组件 您的架构的结构。
如果我们在高层模块中声明一个枚举,那么低层模块不还是依赖于高层模块吗?如果是这样,那么在这种情况下使用枚举有什么问题?
解决方法
唯一可以肯定地回答这个问题的人是罗伯特·C·马丁本人,但我会努力尝试。
据我所知,隐含的场景是 $input
参数代表运行时输入,这本质上不是类型安全的。
在许多应用程序架构中,存在软件“满足现实世界”的边界。在原始应用程序中,您可以要求用户输入 0 代表 male 和 1 代表 female。在控制台应用程序中,您甚至不会收到 int
- 您会收到 string
。
在 Web 应用程序中,您很容易遇到类似的问题。即使你用单选按钮制作了一个漂亮的 GUI,你也不能完全相信某些恶意用户不会试图绕过 GUI 而是给你一个原始的 string
- 或者,某个地方的错误代码中的 else 将执行类似的操作。
引入枚举不会改变这一点。您仍然需要将原始 string
解析为枚举值。如果您接下来要做的是在枚举上 switch
以生成多态对象,那么您最好省去中间步骤,因此也省去枚举。
这个讨论让人想起亚历克西斯·金 (Alexis King) 的精彩博文 Parse,don't validate,其中提出了类似的观点:将结构较少的事物转变为结构更好的事物。
,依赖方向没问题。不过,还有另一个问题。当因需求变化而增加新的枚举器时,边界的两侧都必须发生变化。这违反了开闭原则。我们希望能够做出不影响边界较高层一侧的更改。
如果您使用字符串,则在该行下方添加新条件不会强制该行上方进行任何更改。
您可能会问高层如何了解字符串。事实证明,高层可以向低层询问所有相关字符串。
因此,通过使用字符串而不是枚举,您可以保护高级代码免受对低级需求的更改。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。