Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将elseif块重构为哈希和类_C#_Design Patterns_Refactoring - Fatal编程技术网

C# 将elseif块重构为哈希和类

C# 将elseif块重构为哈希和类,c#,design-patterns,refactoring,C#,Design Patterns,Refactoring,我正在处理旧的asp.net代码(但是它被转换为最新的.net版本),我遇到了一个包含15500长if elseif块的文件(有700个条件)。每个条件都具有相同的结构: if(a == "aaa") { ..... } else if(a == "bbb") { .... } ..... 我认为它需要重构。我想将每个块中的代码拆分为separe类,将它们命名为“aaa”、“bbb”。。。并使用字典或哈希表存储对它们的引用。它可能有一个带有特定返回类型的execute()方法的接口。问题

我正在处理旧的asp.net代码(但是它被转换为最新的.net版本),我遇到了一个包含15500长if elseif块的文件(有700个条件)。每个条件都具有相同的结构:

if(a == "aaa")
{
  .....
}
else if(a == "bbb")
{
 ....
}
.....
我认为它需要重构。我想将每个块中的代码拆分为separe类,将它们命名为“aaa”、“bbb”。。。并使用字典或哈希表存储对它们的引用。它可能有一个带有特定返回类型的execute()方法的接口。问题是,我认为实例化每个类并将对象存储到哈希表需要一些时间,而且我认为性能越差(对于构造哈希表的每个请求)。它必须总共存储700个对象,然后只检索一个对象。我的问题是:

  • 有没有更好的办法解决这样的问题?例如,也许我应该存储类而不是对象,然后使用反射实例化类并调用其方法

  • 应用这样的设计(将if/else if块划分为类->将对象(实现特定接口)添加到字典-->从字典中获取一个对象)在性能方面会有多痛苦

  • 假设我把所有的类放在文件夹F中,我如何检索所有的类并将它们添加到字典中

  • 有什么建议和其他解决问题的方法吗


  • 好吧,如果你不需要实例变量,我建议你使用一个静态类,将它们作为一个单独的函数。然后你可以定义一个兼容的委托方法,并存储对函数本身而不是类的引用。因为它们是在静态上下文中执行的,所以不需要类实例化


    加载哈希映射需要一点内存,但在此之后,占用的内存可以忽略不计。

    我认为性能越差(对于构造哈希表的每个请求)-我真的不认为创建哈希表需要花费任何明显的时间,但请注意,如果哈希表保存在一个静态变量中,它只实例化一次。您可以通过创建一个您打算尝试的模式的小示例,并运行代码来查看它的速度。我们无法预测w您尚未编写的代码将在将来执行!如果您想知道一件事情有多快,请构建它,然后测量它的速度。如果您使用
    哈希集
    ,并使用lambdas对每个可能的键进行初始化,会怎么样?还要注意,如果您使用
    开关
    ,则会使用和,尽管这仍然涉及(整数)要验证的哈希比较和字符串比较。请注意,这取决于排列(和编号)对于
    case
    值,编译器可能会执行二进制搜索而不是哈希表查找。@stuard搜索实现特定接口的类,然后自动实例化这些类的对象,将它们添加到哈希表中,这是一个更好的主意吗?或者最好为每个类编写700个case?我假设on不是一个好的实践,但是我会节省很多行。因此我建议使用lambdas-编译器将为您创建类并处理引用。