避免在switch语句中进行硬编码
本文关键字:编码 语句 switch | 更新日期: 2023-09-27 18:09:44
我有一个对象,它有两个属性:Text
和Type
。
为了避免硬编码类型,我将它们放在数据库中,以便将来可以添加它们。目前类型为URL, Username and ID
。
然而,我现在想运行一个实用程序方法来清理对象的Text
字段基于哪个Type
对象(例如添加'http://'如果它是一个URL)。
有没有办法在Utilities类中做到这一点,而不需要在switch语句/if else块中硬编码类型?
switch (type)
{
case 1:
TidyUrl();
case 2:
TidyUsername();
case 3:
TidyID();
default:
break;
}
在这个例子中,我从数据库('Type'表)硬编码id,这永远不是一件好事!
有更好的方法吗?
可以使用enum来帮助提高可读性。
enum MyTypes
{
URL = 1,
UserName = 2,
Id = 3,
}
switch (myType)
{
case MyTypes.URL:
TidyUrl();
case MyTypes.UserName:
TidyUsername();
case MyTypes.Id:
TidyID();
default:
break;
}
此enum将需要与数据库保持协调。
一种方法是使用多态性。您将为每个"类型"拥有单独的类,并且它们将使用Tidy
这样的方法实现公共接口(或具有公共基类),其中每个都将执行自己的逻辑。
传统上,这是使用一个公共接口来处理的,并动态地构造一个具体的实现来完成实际的工作。
例如:public interface ITidy
{
string Tidy(string input);
}
则实现
public class UrlTidy : ITidy
{
public string Tidy(string input)
{
// do whatever you need to the url
}
}
等等其他类型的整理。现在,您需要一种方法来从您正在查看的类型实例化正确的具体类(UrlTidy
, IdTidy
等)。一种方法可能是将类名与类型一起放在数据库中,并使用反射来实例化ITidy
的正确实现。另一种情况是有一个Factory
类,它使用一些其他方法来实例化基于类型的正确的ITidy
。
您可以使用enum Type
,但是它们的常量值必须在编译时确定。您可以在enum
中放置一个类不变性检查,以确保它们与数据库一致。
但是把它们放在数据库中如何使它可扩展呢?
正如Oded所说,使用enum:
public enum Types
{
Type1 = 1,
Type2 = 2,
Type3 = 3
}
然后可以将类型变量强制转换为枚举,将整数映射到数据库id:
switch ((Types)type)
{
case Types.Type1:
break;
case Types.Type2:
break;
...
}
希望有帮助