Java “如何看”;反if";运动及其目标?

Java “如何看”;反if";运动及其目标?,java,programming-languages,design-patterns,anti-patterns,Java,Programming Languages,Design Patterns,Anti Patterns,我有一个开发人员在过去3年,一直使用if-else或if-else-if语句在我的编程习惯很多 今天,我找到了链接 我放在这里的一个明显的样本 public void doSomthing(String target, String object){ //validate requests if(target != null && target.trim().length() < 1){ //invalid request; }

我有一个开发人员在过去3年,一直使用if-else或if-else-if语句在我的编程习惯很多

今天,我找到了链接

我放在这里的一个明显的样本

public void doSomthing(String target, String object){
    //validate requests
    if(target != null && target.trim().length() < 1){
        //invalid request;
    }

    //further logic

}
public void doSomthing(字符串目标、字符串对象){
//验证请求
if(target!=null&&target.trim().length()<1){
//无效请求;
}
//进一步逻辑
}

现在,我在各个地方、图书馆都看到过这种检查。所以,我想讨论一下这样一场运动的价值


请告诉我你的看法。

你举的例子似乎有点道理。但是,您不应该默默地让它失败或返回null或其他内容,而是在它无效时抛出异常。更好的方法是使用断言


使用ifs测试对象类型是一种糟糕的做法,而不是更多地考虑类和关系。在像Java这样的静态类型语言中,如果(b的一个实例)总是这样做,就不应该成为标准

。从本文中的代码来看,这似乎是针对可以通过利用多态性实现的构造的。在您的示例中,可以使用if子句。

这篇文章反对使用
if
来模拟多态性。换句话说,如果您发现自己正在切换或测试对象是否属于某种类型,那么您就错了——您应该让类型系统为您这样做。

本文并不是说永远不要使用
ifs
。它们是程序控制所必需的。也就是说,在某些情况下,避免if语句链是有意义的,这就是我认为“反if”运动的目的。

我想指出的一点是,链接的文章不是反if的。它是基于反类型的逻辑。假设每只动物都是一个类型/类别

IF i am a giraffe then eat a leaf
else IF i am a rhino eat some grass
else IF I am a monkey eat a banana
etc
这在我看来是惊人的。不是因为它有一个ifs字符串,而是因为条件语句的方式是特定于类型的

相反,每种动物都可以实现自己的eat()方法。现在,上面的代码变为

animal.eat();

就这样。因为没有if语句,所以不可能出现逻辑错误。此外,添加Animal的新实现不需要更改此代码。在第一个示例中,添加大象需要更改代码

我得好好读一读。不幸的是,网站上似乎有一些未经证实的说法,如“肯特·贝克加入反伊夫·坎潘”

如果语句增加了代码的复杂性,那是真的。因此,请尝试/捕获块、循环和任何条件表达式。笼统地说他们是坏的/邪恶的/等等不是好形式。见:


我看不出他的解决方案真正消除了条件逻辑的需要。底线是,只要代码易于维护,就去做。

“这样一个运动的价值”。这难道不是一个价值判断而不是一个问题吗?哦,天哪,我已经看到了TDWTF代码片段,这些代码片段是由看过这一页并认为“
如果
是邪恶的,那么
类如果
就更好了!”:(@Vijay:你不会的,因为
if
语句在你的代码中非常有意义,而Ant-if活动与
if
的这种用法没有任何关系。我不认为这个问题是主观的,需要关闭。+1表示重新打开。我也希望它被打开。+1表示重新打开。不。断言是为了进行理智检查。W如果断言失败,您的代码将被破坏,因为它已达到不可能的状态。断言!=错误处理。@delnan,是的,在示例中,他给出的代码不应该失败,因此断言失败。如果进一步处理没有意义,则失败,这将迫使您修复代码。无效参数在您的代码中不是错误代码。它甚至不一定是调用方代码中的错误。当传递无效参数时,您应该引发适当的异常或返回合理的结果(例如,
null
),而不是崩溃并显示错误消息“此函数已损坏”。如果它们不是无效的,则不要测试它们是否为null或空。如果一个方法希望非null、非空来完成其任务,那么如果它为null,则应该失败。我倾向于使用适合于此的断言,但异常也可以。但是返回null甚至空列表是不好的做法,因为调用方必须检查所需的计算是否实际完成。但是,如果参数有时可能为null,则甚至不要执行null检查,而是按原样返回。您应该使用(或正常的
if
,但有例外)对于这样的检查,不是断言。断言更多的是用于文档,并确保在开发过程中不会发生不可能的事情。