避免在具有多个条件的 If 语句中进行硬编码

Avoid hardcoding in If statement with multiple conditions

我有一段 PL/SQL 代码,看起来与此类似:

IF l_order = 'Cancelled At Order Stage' OR l_order = 'Stopped at Billing Stage' THEN
    Do something
END IF;

IF l_type = 'Internal' OR l_type = 'Contracted' THEN
    Do something else
END IF;

我想避免使用硬编码字符串,所以我考虑了一个简单的数组。但是,似乎有很多额外的代码行(创建一个类型,创建一个类型的数组,遍历该数组)只是为了完成我在这里得到的。

关于这里做什么的建议是什么?我知道这是一个非常小的问题,我可能会进行微观优化,但我想知道什么是好的做法。

$A := Hard-coding
$B := bad
$C := weigh
$D := advantage
$E := configurability
$F := cost
$G := reduced readability

$A 并不总是 $B。您必须将 $E 的 $D 与 $G 的 $F 相对应。

People can only keep a small number of new variables in their head at once. 由您决定在您的系统中什么是有意义的。例如,如果开发人员每天看到短语 "Cancelled At Order Stage" 十几次,阅读它就不需要思考。如果您将该短语替换为 C_CANCEL_STATUS,您的代码将变得不那么可读。


或者您可能只需要一点 PL/SQL 语法糖。例如,使用预定义的集合和 member of 运算符可能有助于简化事情:

declare
    c_cancelled_statuses constant sys.dbms_debug_vc2coll := 
        sys.dbms_debug_vc2coll('Cancelled At Order Stage', 'Stopped at Billing Stage');
begin
    if 'Cancelled At Order Stage' member of c_cancelled_statuses then
        dbms_output.put_line('Cancelled!');
    end if;
end;
/

所有程序员都明白硬编码可能很糟糕(对吧?)。硬编码可能会损害您的代码,但可能不会杀死它。

但我已经看到几个系统被 softcoding 完全摧毁了。我知道有太多经理认为任何一行代码都是 "hard-coded",并且所有逻辑都应该存储在配置 table 中。由于害怕硬编码,许多可怕的、专有的编程语言已经被构建出来。不要因为偶尔的硬编码而感到难过。