【问题标题】:What are some good practices of modular code?模块化代码有哪些好的做法?
【发布时间】:2016-06-22 09:18:34
【问题描述】:

在 PL-SQL 中,有一些新奇的概念,比如表函数、对象,以及可能我还没有发现的其他概念。

但话又说回来,还有简单的代码生成(动态 pl-sql),您可以“立即执行”。

这些有助于代码重用。

据我所知,表函数和对象可以帮助创建模块化代码,但仍然不足以删除整个代码(也许我没有使用其中最好的;我不得不承认我的对象只包含数据暂时没有逻辑)。

另一方面,代码生成要简单得多,并且可以更多地减少重复代码。但是很难理解代码生成逻辑背后的实际业务是什么。

我想要模块化且不重复的代码。我应该坚持使用纯代码生成吗?各有什么优缺点?

【问题讨论】:

  • “代码生成”是指动态 PL/SQL 吗? (您提到“立即执行[ly]”,这表明您应该这样做。)动态 PL/SQL 有它的位置,但不应该是您理所当然地使用的东西,只有当静态 PL/SQL 代码由于某种原因无法使用时,
  • 是的,动态plsql。我想要的内容不符合任何建议的限制(“在编译时文本未知的 SQL”或“不支持作为静态 SQL 的 SQL”);我想要的似乎更容易。但是,这是一个陷阱吗?我如何不复制粘贴带有大量连接的巨大选择和一些仅在此处和那里更改表名和列名的内部选择?
  • Dynamic SQL 有它的位置,但我倾向于回避它,因为 a)它更难调试,b)它更难维护和 c)SQL 语法的错误只在运行时发现-时间。就像任何东西一样,它是一个工具,它有它的位置,但就像托尼上面所说的那样,你应该仔细考虑是否真的需要使用它。也许您可以使用一组封装了您所追求的逻辑的视图,或者您确实需要动态 sql;您的问题中没有足够的信息让我们说。

标签: plsql


【解决方案1】:

动态 SQL 通常优于高级 PL/SQL 功能,如表函数、对象关系类型、数据盒、ANY* 类型等。通过一些简单的技巧,您可以避免动态 SQL 的缺陷,并使用它来创建模块化系统。

高级 PL/SQL 功能很酷,在某些时候您至少必须使用它们一点点。它们非常适合解决奇怪的特定问题。但是您几乎肯定会后悔创建一个以其中一个特性为中心的 Oracle 系统。我已经在上述每个 PL/SQL 功能上浪费了数周或数月的时间。

动态 SQL

专业版 - 它总是有效的。这可能会很痛苦,但总是有一种方法可以让它在 SQL 中工作并使其快速运行。

Con - 有点难读和写。

高级 PL/SQL

Pro - 很酷的功能,优雅的代码,可以完美解决某些问题。

骗局 - 在关键时刻会让你失望。

如果不写小说,很难给出高级 PL/SQL 失败的例子。这些故事通常是这样的:“我们将功能 A、B、C 结合起来……我们遇到了错误 X、Y、Z……每个人都很生气……我们花了一个月的时间重新编写它。”


动态 SQL 不必那么糟糕。只是需要一些纪律。

  1. 良好的格式化和检测。确保动态 SQL 看起来很漂亮,并且可以轻松打印出来以进行调试。遵循良好的编程习惯 - 缩进、添加 cmets、使用有意义的名称等。当 IDE 上的“美化器”按钮没有帮助时,点击式程序员会感到震惊。不要让任何人使用草率的代码 - 仅仅因为它在技术上是一个字符串不应该让任何人避免常见的样式规则。

  2. 替代引用机制。使用q 语法来避免不断转义。例如,q'[I'll use single quotes if I want to!]' 而不是 'I''ll use single quotes if I want to!'

  3. 模板而不是串联。在不间断的块中编写代码,然后稍后替换动态部分。将其与q 字符串结合使用,以避免代码中出现一百万个引号和管道。例如:

    v_dynamic_sql_template constant varchar2(32767) :=
    q'[
        select a, b, $DYNAMIC_SELECT_LIST$
        from table1
        $DYNAMIC_JOIN_1$
        where table1.a > 1
            $DYNAMIC_WHERE_1$
    ]';
    
    ...
    
    v_dyanmic_sql := replace(v_dynamic_sql_template, '$DYNAMIC_SELECT_LIST$', v_variable);
    
    ...
    

(在这个问题中,我假设您是中级或高级 Oracle 开发人员。如果您是初学者,答案可能是静态 SQL 语句,但您还没有 已经看到了足够多的 SQL 特性来实现这一点。)

【讨论】:

  • 我是中级,是的。我已经开始使用表函数和对象(到目前为止只是数据,没有太多组合或继承),但我想知道我是否应该去增强我的对象(这需要时间,而且我觉得它会使事情复杂化)或删除我的对象和表函数并使用动态 sql。老实说,这种模板化的想法对于动态 sql 来说非常酷,因为我不想失去可读性
猜你喜欢
  • 2011-03-31
  • 2012-02-13
  • 2016-06-27
  • 2011-06-13
  • 2015-04-03
  • 2010-11-06
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
相关资源
最近更新 更多