0

在我的公司,我们最近一直在对现有程序进行修改,该程序使用以下逻辑来执行一些数据库字段分配:

db-buffer1.field1 = if db-buffer1.field1 <> db-buffer2.field2
                        then db-buffer2.field2
                        else db-buffer1.field1

我不是 100% 确定原始程序员的意图。在决定是否分配新字段之前,任何人都可以帮助我理解比较字段值是否不同的价值吗?

如果比较是“假”并且我们最终分配了db-buffer1.field1 = db-buffer1.field1我们是否避免对数据库进行写操作?

另请注意,此示例是ASSIGN包含多个运行类似分配/比较逻辑的字段的较大语句的一部分。这对这个附加代码的价值有什么影响吗?(即语句中的所有比较ASSIGN是否必须成功才能避免数据库写入?)

4

3 回答 3

0

表达式右侧的“IF 函数”很像 C 或 Javascript 中的“三元运算符”(“?:”结构)。

它只影响它所属的 ASSIGN 部分。当我使用它们编写代码时,我总是用括号括起来以使其清楚。像这样:

assign
  a = ( if x = y then b else c )
  z = 2
.

WRITE 是否发生在很大程度上取决于代码的其余部分。

仅从这个片段来看,您将要写一些东西(至少在逻辑上)。db-buffer.field1 无论如何都会获得分配给它的值。右侧的 IF 逻辑只是选择它是 field1 还是 field2。在归结为 field1 = field1 的情况下,您可能希望某些较低层将优化写入不存在。我没有看到您发布的 Progress 版本,但如果它是 v9 或更高版本,那么它很可能会被优化掉。(在 v9 之前不会。)

如果您真的想在应用程序级别“避免写入”,您应该像这样编写代码:

if field1 <> field2 then
  assign
    field1 = field2
  .

这种形式不使用 IF 函数,它只是一个普通的 IF ... THEN 语句。它更清晰,它不依赖于较低级别的优化。当然,所显示的片段据说是更大的 ASSIGN 的一部分——因此将它分解出来并按照我所展示的那样编写它可能是明智的,也可能是不明智的。但这值得考虑。

于 2013-07-25T20:09:24.527 回答
0

看来程序员正在检查 field1 是否不等于 field2 继续更新它。

他们也可以简单地使用以下内容,因为无论以哪种方式分配字段:

   assign db-buffer1.field1 = db-buffer2.field2.

使用 ASSIGN 语句(始终推荐)时,从逻辑角度来看,您必须记住每一行都是单独分配的。

汤姆在这里有一个很好的答案,它提供了有关 ASSIGN 语句的效率/历史的更多信息。

于 2013-07-25T20:18:15.587 回答
0

我会对查看其余的分配语句非常感兴趣,但在这种情况下我也会摆脱 if 逻辑,因为它没有增加任何价值,只是增加了额外的指令。正如特里上面所说

 ASSIGN db-buffer1.field1 = db-buffer2.field2.
于 2013-07-29T09:30:23.950 回答