2013-03-11 47 views
4

我的意思是,我读过写一种方法的好方法是通过规则引导:一种方法应该只执行一项任务。如果我有不同的顺序操作,那么我需要将该方法分成几个。它应该使代码更简洁,自我解释的方法名称。 但是,如果我想要实现方法,应该做些什么,然后返回布尔值 - 真是成功,假如失败。例如,假设我们有一个名为setObjectValue()的setter。 [再次,这只是一个例子]。什么是执行某些操作并返回指示在Java中成功的布尔值的良好做法?

问: 难道是很好用这个名字,并返回布尔值,或者它应该是什么为: isSuccessfullsetObjectValue(),setObjectValueAndCheckIsOk(),或者应该有两种方法还是什么?因为名称“setObjectValue()”不会告诉您该方法除了设置值之外还在做某些事情。

+0

我不明白你在问什么。似乎是一个关于命名的问题,或者关于如何将代码拆分成方法的问题,或者有关匈牙利符号的问题......我不确定。 – 2013-03-11 19:37:13

+0

@LaRRy我猜setter是一个错误的例子。你需要它的二传手? – amod 2013-03-11 19:38:52

+0

命名是否可以返回布尔指标作为方法的额外特征。或者更适合返回指标的方法(当然,正在提出例外)。 – LaRRy 2013-03-11 19:41:26

回答

11

除非有很好的理由,否则我通常会使用例外来表明这一点。这有两个好处:

  1. 你跟1种方法的公约 - 1个想法
  2. 你强迫自己(如果该异常检查),用于处理故障情况。如果你返回一个布尔值,那么代码很容易忽略这种情况。

如果你做这样的事情:

try{ 

    setObjectValue("foo") 
} catch(SomeKindOfException e){ 
    //handle 
} 

然后你得到它的阅读,如英语的另一个好处:“尝试设置对象的值,但如果你不能再经处理它...“

+2

关于抛出是否存在相当多的争议像这样的例外是非常好的做法。不确定它在这里最有意义。 – 2013-03-11 19:39:19

+0

完美的+1 .. :) – amod 2013-03-11 19:39:45

+0

相关:http://stackoverflow.com/questions/77127/when-to-throw-an-exception。如果您在这里购买最佳答案,那么如果基本假设是错误的,则会抛出异常。由于制定者通常不应该失败,这似乎是合适的。 – 2013-03-11 19:43:19

0

从我的角度来看,除非你打电话给慢速存储设备(比如Web服务),否则setter不应该返回一个值,但是在这种情况下抛出异常将会更清晰。

0

我想如果你提到在JavaDoc中要使用的返回值是什么,我会返回一个布尔值而不明确地说明该值在方法签名中表示的值是否可以。这是在Java Collections API中完成的(不是Collections API是黄金标准),所以在Java中这通常是一种公认​​的做法。

1

它确实取决于你的代码在做什么,但是从你描述的内容来看,它是非常有意义的,并且可能是可取的行为(同样取决于你的代码在做什么)。

例如,Collection如果作为操作结果而被更改,则返回布尔值。另一个例子是AtomicBoolean。在这些情况下,由于您可能需要知道是否修改了某些内容,因此返回布尔值是有意义的。只要有意义,方法的命名确实无关紧要。

在这些例子中,知道您的设置是否成功并且这是唯一真正做到这一点的地方非常重要。但是,我不会有用于设置某些值的方法,这也会执行很多其他非相关操作。

此外,如果您在您的示例中返回false的原因是某些验证错误的结果,那么您最有可能在尝试设置值之前检查该值。

1

在我看来,詹姆斯的回答非常好。但想想更多的制定者和由此产生的try-catch-blocks。 一个稍微不同的方法是通过验证器来处理这些设置器的值,例如,用户做了一些输入或类似的东西。

String userInput = ...; 
if (myValidator.isValid(userInput)) { 
    myObject.setObjectValue(userInput); 
} 

方法isValid(boolean valueToCheck)指示它将返回一个布尔值。您的setObjectValue(String newValue)只需要完成这项工作而不返回任何价值。

你仍然可以在你的setter中检查newValue。如果这是一个无效的输入,你会抛出一个IllegalArgumentException(快速失效)。

if (newValue==null || newValue.contains("foo")) { 
    throw new IllegalArgumentException("Illegal value for newValue: "+newValue); 
} 
this.value = newValue; 

所以在你的代码中,你可以使用你的setter来获取你自己的值。我的意思是,你写了这个方法,并且应该知道你的输入,所以这应该没问题。 如果用户进行了一些输入,请使用设置器的验证器。会有奇怪的投入,相信我! ;-)

结果是,如果你有异常(如果你不使用验证器),你不必处理这个数量的try-catch块并知道去哪里看。

0

安装人员通常应该是无效的(不返回值)。有几种方法可以在不使你的setter返回布尔值的情况下实现你的目标。一种方法是将布尔标志设置为实例变量,只要您设置了特定的值,该变量就会设置为true。这个标志可以通过它自己的吸气器来访问。

例如,您有一个具有姓名和电话号码属性的人员。你希望能够设置一个人的电话号码,后来确定该电话号码是否已设置:

public class Person 
{ 
    private String name; 
    private String phone; 
    private boolean hasPhone; 

    public void setName(String name) 
    { 
     this.name = name; 
    } 

    public String getName() 
    { 
     return name; 
    } 

    public void setPhone(String phone) 
    { 
     this.phone = phone; 
     hasPhone = true; 
    } 

    public String getPhone() 
    { 
     return phone; 
    } 

    public boolean hasPhone() 
    { 
     return hasPhone; 
    } 
} 
0

这是OK创建检查一些条件,并返回一个布尔值的方法,而另一种方法在执行某些操作之前可能会使用条件检查。

boolean checkSomeCondition(); 

您的代码不会受到

if (checkSomeCondition()) {...} 
else {...} 

但是当该方法无法执行它的名字规定动作的情况下,应使用异常。他们实际上是为此创造的。

try { 
    DoSmth(); 
} catch (ParticularError e) { 
    ... 
} 

它一般用来风格,可能是处理该函数的体内内容时发生错误的最好方式。

相关问题