什么是分配和格式化的首选选项?

4
考虑可读性、内存使用和其他原因,哪个是推荐的呢? 1.
String strSomething1 = someObject.getSomeProperties1();
strSomething1 = doSomeValidation(strSomething1);

String strSomething2 = someObject.getSomeProperties2();
strSomething2 = doSomeValidation(strSomething2);

String strSomeResult = strSomething1 + strSomething2;
someObject.setSomeProperties(strSomeResult);

2.

someObject.setSomeProperties(doSomeValidation(someObject.getSomeProperties1()) + 
                             doSomeValidation(someObject.getSomeProperties2()));

如果您采用其他方式,那会是什么方式?为什么要这样做?
8个回答

17

我会选择:

String strSomething1 = someObject.getSomeProperties1();
String strSomething2 = someObject.getSomeProperties2();

// clean-up spaces
strSomething1 = removeTrailingSpaces(strSomething1);
strSomething2 = removeTrailingSpaces(strSomething2);

someObject.setSomeProperties(strSomething1 + strSomething2);

我个人偏好按照操作分类组织,而不是序列。我认为这样读起来更流畅。


12

我可能会选择折中:

String strSomething1 = doSomeValidation(someObject.getSomeProperties1());
String strSomething2 = doSomeValidation(someObject.getSomeProperties2());
someObject.setSomeProperties(strSomething1 + strSomething2);

选项#2看起来在一行中要做很多事情。它可读性高,但需要一些解释。在选项#1中,每行非常易读且意图明确,但冗长会拖慢我的速度。我建议尝试平衡简洁和清晰,每行代码都代表一个简单的“句子”。


6
我更喜欢第二种方式。只需稍微格式化一下,就可以使其易读,而无需声明额外的中间引用。
someObject.setSomeProperties(
    doSomeValidation( someObject.getSomeProperties1() ) + 
    doSomeValidation( someObject.getSomeProperties2() ));

你的方法名已经提供了足够的解释。

4

可读性的第二个选择。如果方法只执行其名称指示的操作,则我不认为存在任何内存问题。但是,我会对连接操作保持警惕。由于Java字符串的不可变性,随着字符串连接的增加,性能肯定会受到影响。

只是好奇,你真的编写了自己的removeTrailingSpaces()方法,还是这只是一个例子?


当然,这只是一个例子... 我已经将其删除,因为您可能会想知道我的版本为什么不同 :) - Sajal Dutta

3

我尝试让每一行只有一个操作。主要原因是这样做:

setX(getX().getY()+getA().getB())

如果您在这里遇到了空指针异常,是哪个方法返回了null值?因此,我希望在代码跑进调试器强大的怀抱之后,可以通过某些变量看到中间结果,而无需重新启动!


2
对我来说,这取决于上下文和周围代码。如果它在像“setSomeObjectProperties()”这样的方法中,我更喜欢第二种变体,但也许会创建一个私有方法“getProperty(String name)”,如果去除空格不是重要操作,则删除尾随空格。如果验证属性是您方法的重要步骤,则我将调用方法“setValidatedProperties()”,并且更喜欢您第一项建议的变体。
validatedProp1 = doValidation(someObject.getSomeProperty1());
validatedProp2 = doValidation(someObject.getSomeProperty2());
someObject.setSomeProperties(validatedProp1, validatedProp2);

如果验证不是此方法的重要部分(例如,返回未经验证的属性没有意义),我会尝试将验证步骤放在“getSomePropertyX()”中。


1

就我个人而言,我更喜欢第二个。它更简洁,我不必跟踪那些临时变量。

但是,随着更复杂的表达式,可能会很容易地发生变化。


1

我喜欢Greg和Bill的版本,但我认为我更自然地编写像Greg的代码。中间变量的一个优点是:在一般情况下更容易调试。


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