2008-11-25 93 views
4

请赐教:Java:代码重构/优化

您更喜欢哪一个?为什么? [可读性?记忆关注?其他一些问题?]

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())); 

如果你会做一些其他的方式,那会是什么呢?你为什么要那样做?

回答

12

我可能会去在两者之间:

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

选项#2好像很多在一线做。它是可读的,但需要一点努力来解析。在选项#1中,每条线的意图都非常可读并且清晰,但是当我仔细阅读时,详细程度会降低我的速度。我会尽量平衡简洁和清晰度,每行代表一个简单的“句子”的代码。

1

个人而言,我更喜欢第二个。它不那么混乱,我不必跟踪这些临时变量。但是,使用更复杂的表达式可能会轻易改变。

17

我会去用:

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

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

someObject.setSomeProperties(strSomething1 + strSomething2); 

我个人的偏好是用行动来组织,而不是序列。我认为它会更好。

4

选项2为可读性。如果方法只做他们的名字所表示的内容,我不会在这里看到任何内存问题。虽然我会因连接而异。由于Java字符串的不变性,性能肯定会随着字符串连续数的增加而增加。

只是想知道,你真的写自己的removeTrailingSpaces()方法,或者它只是一个例子吗?

+0

当然是一个例子..我删除它,因为你可能会想为什么我的版本.. :) – DragonBorn 2008-11-25 15:29:08

6

我更喜欢第二个。您可以使其具有一点格式化的可读性,而无需声明额外的中间引用。

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

您的方法名称提供了所有需要的解释。

2

对我来说,它取决于上下文和周围的代码。

[编辑:没有任何意义,对不起] 如果是像“setSomeObjectProperties()”方法,我宁愿变2,但也许会创造一个私有方法“的getProperty(字符串名称)”,这删除尾随空格,如果去掉空格是不是一个重要的操作 [/编辑]

如果验证属性是你方法的一个重要步骤,那么我会调用该方法“setValidatedProperties()”,并希望您的第一个建议的变体:

validatedProp1 = doValidation(someObject.getSomeProperty1()); 
validatedProp2 = doValidation(someObject.getSomeProperty2()); 
someObject.setSomeProperties(validatedProp1, validatedProp2); 

如果验证不是该方法的重要部分(例如,我试图把验证步骤放在“getSomePropertyX()”

1

我喜欢格雷格和比尔版本,我想我会更自然地编写像格雷格的代码一。中间变量的一个优点是:更容易调试(在一般情况下)。

3

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

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

如果你在这里有NPE,哪个方法返回null?所以我喜欢在代码落入调试器的强大手臂之后看到某些变量的中间结果,而不必重新启动!