避免在switch语句中进行硬编码

本文关键字:编码 语句 switch | 更新日期: 2023-09-27 18:09:44

我有一个对象,它有两个属性:TextType

为了避免硬编码类型,我将它们放在数据库中,以便将来可以添加它们。目前类型为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,这永远不是一件好事!

有更好的方法吗?

避免在switch语句中进行硬编码

可以使用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;
    ...
}

希望有帮助