当前位置: 首页 > 知识库问答 >
问题:

一堆条件if-else所需的设计思想

公西兴业
2023-03-14

我有一个简单的逻辑要实现。但不确定是否有更好的方法来设计它,除了简单的 if-else 或 switch 语句。

有 4 个权限(将它们视为布尔变量),可以是真或假。根据各种条件(这些权限的排列),我需要返回需要在 UI 上显示的下拉字段的字符串值列表。

所以现在就像这样-

if(!permission1 && !permission2){return list_of_strings_1;}
else if (permission1 && permission2 && !permission3){return list_of_strings_2;}

等等。其中一些只是if语句。所以多个条件可能是真的,我们必须收集所有字符串列表并显示它们。

那些如果其他的持续了相当长的一段时间(大约100行)。每个都将返回不同的字符串列表。其中大部分在未来不太可能改变。所以可能设计得太深了,可能有点过头了。

但只是想知道专家将如何重构这段代码(或者他们是否会重构它)。也许坚持开关/如果-否则可以?

共有1个答案

龙新荣
2023-03-14

我不明白四个标志是如何给你100行代码的。这可以通过16个条目的映射来完成(或者更少,如果某些组合无效并且可以映射到默认值)。如果字符串表示确实是字符串列表,每个可能的权限对应一个字符串,则解决方案更加紧凑。

键是表示权限组合的对象,值是该组合的字符串表示。您可以为密钥创建一个自定义类型,但在本例中,我只使用四位整数,其中每一位表示是否授予权限:

private static final int P1 = 1 << 0, P2 = 1 << 1, P3 = 1 << 2, P4 = 1 << 3;

private static final Map<Integer, String> permissionsToString = Map.ofEntries(
  Map.entry( 0, "No permissions granted."),
  Map.entry( 1, "Permissions 2-3 revoked."),
  Map.entry( 2, "Permission 2 granted."),
  ...
  Map.entry(14, "Permission 1 revoked"),
  Map.entry(15, "Superuser"));

public static String toString(boolean p1, boolean p2, boolean p3, boolean p4) {
  int key =   (p1 ? 0 : 1) << 0
            | (p2 ? 0 : 1) << 1
            | (p3 ? 0 : 1) << 2
            | (p4 ? 0 : 1) << 3;
  return permissionsToString.get(key);
}

如果您不理解位,您可以使用ENumSet或定义您自己的值对象来表示更高级别的键。想法是一样的:将所有可能的组合(24=16)映射到它们对应的标签。

 类似资料:
  • Go语言的条件判断结构也很简单。 package main import "fmt" func main() { // 基本的例子 if 7%2 == 0 { fmt.Println("7 is even") } else { fmt.Println("7 is odd") } // 只有if条件的情况 if 8%4

  • 我目前正在了解React Native中的if-else if-else语句的语法。下面是我理解的一个简单的if-else条件: 但是,当添加另一个条件来生成if-else if-else语句时,我遇到了问题。 如果有人能指出我的缺点,我将不胜感激!

  • 主要内容:if else 如何判断表达式是否成立前面我们看到的代码都是顺序执行的,也就是先执行第1条语句,然后是第2条、第3条……一直到最后一条语句,这称为 顺序结构。 但是对于很多情况,顺序结构的代码是远远不够的,比如一个程序限制了只能成年人使用,儿童因为年龄不够,没有权限使用。这时候程序就需要做出判断,看用户是否是成年人,并给出提示。 在 Python 中,可以使用 if else 语句对条件进行判断,然后根据不同的结果执行不同的代码,这称

  • 我有一个简单的角度/html代码,其中有一个表,每个

  • Perl条件语句有助于决策,这需要程序员指定一个或多个要由程序评估或测试的条件,以及在条件被确定为真时要执行的一个或多个语句,以及可选的其他条件如果确定条件为假,则执行语句。 以下是大多数编程语言中的典型决策结构的一般性 - 数字0,字符串'0'和“”,空列表()和undef在布尔上下文中都是false ,所有其他值都为true 。 否定真正的价值! 或not返回特殊的假值。 Perl编程语言提供

  • 本文向大家介绍C# if, if...else, if... else if ,包括了C# if, if...else, if... else if 的使用技巧和注意事项,需要的朋友参考一下 示例 该if语句用于控制程序的流程。一条if语句根据Boolean表达式的值标识要运行的语句。 对于单个语句,braces{}是可选的,但建议使用。 该if还可以有一个else条款,将在案件条件的计算结果来执