0

通过矩阵样式,我的意思是有 n 个变量,每个变量都有一定数量的输入,并且必须处理所有可能的值。最简单的情况是多个布尔值并且必须处理真/假的每种组合。如果返回的值遵循某些模式,这很容易,但否则似乎很难。

(如果有比“矩阵样式”更好的名称,请评论并告诉我,以便我更新标题。)

处理此问题的丑陋方法是 if else 链。

IF self.A = 'N' THEN
    IF self.B = 'N' THEN
        ...
    ELSE
        ...
    END IF;
ELSE
    IF self.B = 'N' THEN
        ...
    ELSE
        ...
    END IF;
END IF;

祝你好运跟踪混乱,尤其是超过 4 个变量。

一种更易读的方法是一起进行所有检查。

IF self.A = 'N' AND ... self.Y = 'N' AND self.Z = 'N' THEN
    returnValue := 'Bob';
END IF;
If self.A = 'N' AND ... self.Y = 'N' AND self.Z = 'Y' THEN
    returnValue := 'Birthday Party';
END IF;
...
If self.A = 'Y' AND ... self.Y = 'N' AND self.Z = 'N' THEN
    returnValue := 'What did I ever do to deserve this?';
END IF;
...
If self.A = 'Y' AND ... self.Y = 'Y' AND self.Z = 'Y' THEN
    returnValue := 'Thank God I am done!';
END IF;

如果你做一个 CASE 语句而不是一堆 if/else,你可以做得更好,但这仍然很难维护。想象一下,不小心在某个地方放了 Y 而不是 N,然后不得不去找它。考虑到错误的机会随着每个新变量的添加而呈指数增长(因为您至少需要编写的代码量增加一倍),在任何像这样的重大问题中都有很大的错误机会。

您可能会做一些有趣的文本替换来尝试减少错误。我最近用 5 个变量做了这个。我开始...

NNNNN
NNNNY
...
YYYYN
YYYYY

然后我使用 Notepad++ 对它们进行了一些查找和替换,以尝试减少错误输入 N 或 Y 的机会。但最终产品看起来仍然很难维护。所以我想知道是否有更好的方法来处理这个问题(主要是在可维护性方面,尽管在不失去可维护性的情况下提高效率也是受欢迎的建议)。虽然我正在专门寻找 PL/SQL 解决方案,但仍然欢迎使用其他语言的任何解决方案,因为它们可能能够被翻译成 PL/SQL。

编辑:如果有人试图解决这个问题并想使用我当前的解决方案,这里是查找和替换。

查找:([Y,N])根据变量重复多次。替换:\t\t\tWHEN self.valueName = '\1' THEN\r\n\t\t\t\treturnValue := ''对于self.valueName = '\1'您拥有的每个变量,重复一次,每次递增 1。您还需要设置正确的 \t 数量,以便它匹配它应该有多少缩进。这适用于记事本++,正则表达式模式。

4

2 回答 2

1

为什么你有这个问题?我假设这是一个由来自 AZ 的变量组成的类型的变量。那么你如何首先填充这个?你不能在那里简化吗?

但是,如果没有其他选择,您可以先检查单个字段中是否只有“Y”和“N”,然后转换为 1 和 0,然后从中生成数字并检查数字。例如,NNNNY 变为 1,NNNYN 变为 2,依此类推。然后是 IF r=1 then .. elsif r=2 ..

一个可能更好的选择是生成代码。您可以形成一个具有“创建或替换 functionX 为 ...”的字符串并立即对其执行。

于 2013-05-21T19:11:07.153 回答
1

尝试连接到一个值(self.A || self.B || .. || self.Z),然后在值上使用 case,如 'NNNNN'、'NNNNY'、'NNNYN 等。

编辑:我做了以下假设:

  • 你有大量的单字符变量......
  • ...您想转换为单个返回值...
  • ...涵盖所有或许多可能的集合。

您获得的是所有组合的视图,每行一个,一个键在另一个下,在每个具有相同 self.variable 的单字符列中。如果变量的数量真的很大,为了避免像YNNYYYNYNNYNYYYNNY你这样的选项可以提高可读性,每 3-rd 或 5-th 或 n-th char 放置空间:

when 'NNN NNN NNN' then '1st choice'
when 'NNN NNN NNY' then '2nd choice'
when 'NNN NNN NYN' then '3rd choice'
... ... ...

正如@hol 在下面的回答中建议的那样,在这种情况下生成代码是一个非常好的选择。

但是,作为开发人员,您应该知道 if m-th choiceis YYY YNY YYor YYY NYY YY,除了检查/测试代码之外,没有其他方法可以确定您是否得到正确的结果。

于 2013-05-21T17:36:33.623 回答