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

时间:2015-02-13 17:49:37

标签: sql arrays oracle plsql

我有一段与此类似的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;

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

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

1 个答案:

答案 0 :(得分:5)

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

$ A并不总是$ B.对于$ G的$ F,你需要$ C $ $ E。

People can only keep a small number of new variables in their head at once.由您来决定系统中的含义。例如,如果开发人员看到短语"在订单阶段取消"每天十几次,阅读它不需要考虑。如果用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完全摧毁了几个系统。我知道太多经理认为任何代码行都是"硬编码",并且所有逻辑都应存储在配置表中。由于害怕硬编码,已经构建了许多可怕的专有编程语言。不要偶尔硬编码感觉太糟糕了。