首页 > 解决方案 > 使用字符串与枚举作为工厂方法的参数?

问题描述

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

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

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

标签: design-patternsenumsfactorysolid-principles

解决方案


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

据我了解,隐含的场景是$input参数表示运行时输入,这本质上不是类型安全的。

在许多应用程序架构中,存在软件“与现实世界相遇”的边界。在原始应用程序中,您可能会要求用户输入0表示男性,输入1表示女性。在控制台应用程序中,您甚至不会收到int- 您会收到string.

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

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

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


推荐阅读