gpt4 book ai didi

c# - 如何最好地重构嵌套的 switch 语句?

转载 作者:行者123 更新时间:2023-11-30 22:08:27 25 4
gpt4 key购买 nike

好的,这是我的问题。

基本上有这样的结构(常规表):

   | a1 | a2 | a3 | a4 
----------------------
b1 | v1 | v2 | v3 | v4
----------------------
b2 | v5 | v6 | v7 | v8
----------------------
b3 | v9 | vA | vB | vC

自动取款机。 a 值在枚举 (enumA) 内,b 值也在 (enumB)a1 - a4 可以通过绑定(bind)到枚举的组合框来选择,b1 - b3 也是如此。

基于两者的选择,我将特定值分配给 aXbY 组合并返回以供进一步计算。这些值是通过嵌套的 switch 语句选择的,如下所示:

switch (enumA) {
case a1:
switch (enumB) {
case b1: return v1;
case b2: return v2;

等等。

我想知道的是如何最好地重构我的代码以提高代码质量。编辑:我正在寻找面向对象的解决方案!

注意:我根本不希望 a 或 b 增长。然而,让我们假设我处在这样的情况下。我们还假设我预计 enumA 比 enumB 更有可能增长。

到目前为止我的想法:

一路硬核的Strategy Pattern

我可以将每个“ab”组合重构为它自己的类型,它实现了一个公共(public)接口(interface)并且每个类型都返回正确的值。

优点:

  • 没有嵌套的 switch 语句。
  • 开闭原则是的。

缺点:

  • 为每个组合都指定一个类型似乎有点矫枉过正。
  • 我会失去结构,因为理论上我可以有一个 a1b4 组合而没有等效的 a2b4 等等。

enumA 的策略模式,enumB 的精确方法

我可以将 a1-aN 重构为类型,它们都实现相同的接口(interface),具有返回适当值的三种方法 getB1、getB2、getB3。

优点:

  • 我可以扔掉外面的开关。
  • 我可以使用通用接口(interface)强制表结构。

缺点:

  • 违反了开闭原则,因为一旦出现新的 b 值,我就必须更改接口(interface),并使用该接口(interface)调整每种类型。
  • 我还有内部 switch 语句,以便评估选择哪种方法。

是否有适合我的情况的更好模式?有没有办法在仍然执行表结构的同时保持灵 active ?如果我使用类型而不是枚举,如何过渡到 UI?使用反射获取实现特定接口(interface)的每个类并在组合框中显示名称(或任何属性)?

最佳答案

因为你有一个表结构,我会把所有的 v 值放在一个多维数组中:
vType[,] multiArray = new vType[aLength, bLength];

因为所有枚举都有一个整数作为它们的基值(默认为 int),您可以将选定的枚举转换为一个整数。 enumA 会给你列索引和 enumB 行索引。现在您可以在一行代码中返回 v:

return multiArray[(int)enumA, (int)enumB];

没有开关盒,没有接口(interface),没有单独的类型。如果 a 或 b 增长,那么您根本不必更改代码(几乎)...

关于c# - 如何最好地重构嵌套的 switch 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22272994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com