何时在ColdFusion中使用IMP运算符?

4
3个回答

2

我运用我的谷歌功夫找到了这个链接:

http://www.cfug-md.org/meetings/RichardBierregaardLogicwCFConditionals.ppt

它启发我认识到IMP可能有助于编写单元测试:

assertTrue(Income >= 200000 IMP TaxRate == 0.35);
assertTrue(Income < 200000 AND Income >= 70000 IMP TaxRate == 0.28);
assertTrue(Income < 70000 AND Income >= 35000 IMP TaxRate == 0.20);
assertTrue(Income < 35000 AND Income >= 15000 IMP TaxRate == 0.10);
assertTrue(Income < 15000 IMP TaxRate == 0);

取代
if (Income >= 200000) assertTrue(TaxRate == 0.35);
if (Income < 200000 AND Income >= 70000) assertTrue(TaxRate == 0.28);
if (Income < 70000 AND Income >= 35000) assertTrue(TaxRate == 0.20);
if (Income < 35000 AND Income >= 15000) assertTrue(TaxRate == 0.10);
if (Income < 15000) assertTrue(TaxRate == 0);

你认为 IMP 版本更好吗?


1
为了进行真正的比较,你应该将if/asset放在一行上。 - Aaron Greenlee

1
在现实世界中,能够像这样做一些事情会很方便,对可选参数进行验证:
<cfif structKeyExists(URL, "a") IMP validateId(URL.a)>

在这里,我们只关心验证URL.a是否存在。这可能是IMP最有用的应用之一,我个人认为(嗯,就像这样)。

然而,由于IMP实现中的bug,这并不起作用:-(

我认为Dale的断言,即更长(且不正确)的逻辑比缩短版本更易于阅读,是自相矛盾的,并且基于一个牵强附会的前提。他的立场基于这样一个想法:“某人不知道某事”是一个连续的状态,即当某人不知道某事(比如“IMP”的含义)时,他们将永远不知道它。这是不正确的。一个人可能最初不知道某件事,但一旦他们了解了它,那么他们就会知道它。因此,不知道IMP操作符如何工作的问题是一个非常短暂的问题。

我认为需要使用IMP的情况并不经常出现,但有它确实很方便。如果它能正常工作,那就更方便了;-)


这并不是我在断言什么,我是在建议清晰的代码比99%的开发人员无法理解的复杂代码要好得多。 - Dale Fraser
@ Dale,有100%的开发者在未接触到某种技术/概念/语法元素之前是无法理解它的。但一旦被介绍了,他们通常就会理解。你的立场仍然站不住脚:你不能简单地断言你的逻辑错误示例比使用IMP的正确示例更好。除非你试图将IMP表达式转换为另一种表达方式,这也是一个难以理解的例子吧?我承认人们可能不知道IMP运算符,但如果他们遇到它,他们会查一下资料! - Adam Cameron
我认为你应该重新阅读标签的目的和意图。你的论点比我更无效,你说只因为它存在人们就应该使用它,如果他们不理解,人们会查找它,这就像我在这句话中使用一个没有人理解的单词,让每个人都去查找它,而实际上有一个更好、更清晰的单词,每个人都能理解。我们看法不同,各自坚持。 - Dale Fraser

0

我认为你应该避免使用它,我从未见过它被使用过,也从未有过使用它的需求。其他开发人员大多不会理解它的含义。

我宁愿写

<cfif a eq true and b eq false>

<cfif a imp b>

第一个更清晰明了。


2
(a IMP b)实际上是(非a或b)- http://www.cfug-md.org/meetings/RichardBierregaardLogicwCFConditionals.ppt - Henry
Adam是对的 - 如果你只为经验不足的开发者编写代码,那么你将永远只有经验不足的开发者来编写你的代码。更好的做法是有效地编写代码,并在开发者遇到不理解的问题时进行教育 - Peter Boughton
我不认为使用没有人理解的晦涩编码是一个好主意。@Henry,我没有像那样写,如果你有自己的解决方案,那么请提出一个答案,而不是将正确的答案改成你的方式。 - Dale Fraser
1
@DaleFraser(a IMP b)实际上是(非a或b),因此按照您的cfif风格,应该是<cfif a eq false or b eq true>,对吗? - Henry
事实上,这几乎是我编写此类逻辑的方式的一个示例,它并非旨在与之等价。但是,你提出的模型并不比这个实现更清晰。 - Dale Fraser
@DaleFraser 好的,我猜那是因为你说你宁愿写X而不是Y,我以为你暗示X等同于Y。算了,抱歉编辑了你的答案。 - Henry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接