`写一篇文章,要层次清楚,段落分明,写代码也是这样。杂志排版,布局合理,阅读舒服,代码的编排也很重要`
代码整洁的优点
代码的整理并不复杂,也不需要什么高深的技巧。有效的使用代码,空格和缩进,简单的分割与对齐,就可以使得代码的视觉效果甚至质量发生巨大的变化,
理顺编码的思路,提高编码的效率。这是一个付出少,收获大,值得养成的好习惯。
解决方案:给代码分块
reason:
我们的大脑接收信息是按照分块的模式进行的。一块是一个可识别的信息,它被安放到短期的记忆的"插槽"里。
信息块的实际信息量是可变的,但是越简单,越具体的信息块越容易被记住和理解。
一个代码文件,可以看做是一个杂志版面,在这个版面里,我们要把代码整理成清晰的模块,这样的每一块在视觉上和逻辑上都是可以区分的,
可以帮助我们阅读和记忆,减轻眼睛和大脑的疲劳。
`优化一:`
例子1:下面的两种形式的语句。这两种形式,在实际逻辑上是完全相同的。但是,第二个语句使用了
更细化的块,这样视觉形式和逻辑形式都是清晰直观的。
1.
if(firstName !=null && lastName != null)
2.
if((firstName!=null)&&(lastName != null));
如果一段代码放眼望去都是大块大块的,那对于一个初学者来说,阅读和理解就非常困难。
他需要将复杂的表达式再次分解,分解到可以单独理解的变量和运算符,再重新组合。
**_注意三点:_**
1.保持代码块的单一性,一个代码块只能有一个目标。
代码块内的所有的内容都是为了一个目标服务的,不能把无关的内容放在同一个代码块里。同一个代码块里的
语句相互联系比与相邻代码块里的语句更为紧密。
2.注意代码块的完整性
代码块就是一个完整的信息块。一个代码块要表达一个相对完整的意思,不能一个意思没说完就分块了。
3,代码块数量要适当
一个基础的代码块最好不要超过25行,否则就会有增加阅读的理解的困难。
**使用空白空间**
为什么呢?
靠近的代码会形成一个视觉块,并且具有隐含的关联。分开的代码,意味着上下代码的关联没有那么紧密。这种视觉
效果会给我们暗示,代码直接的关系越紧密。
因此,空白区域,不仅仅可以用来分割代码,还展示了代码之间的关系。
**一行一个行为**
每一行代码仅仅表示一个行为。这样的每一行代码才是常规的大小的,可以识别的基础信息块。
下面这行代码包含了两个行为,一个是判断行为,一个是执行行为。两个行为放在一行,这样的代码不仅看起来有些乱,
我们的大脑处理起来有些萌。
`if (variable != null) variable.doSomething();`
如果分割开这两个行为,信息块的区隔会更明显,代码会更清晰。
if (variable != null) {
variable.doSomething();
}
一般一个完整的表达式可以看做是一个完整的独立行为。
**基本的换行原则**
代码分块的基本思想,同样使用与换行。基本的换行需要考略一下三点。
1。每行代码字符数的限制。
2。如果一行不足以容纳一个表达式,就需要换行;
3。一般的换行原则包括一下5点
1.在逗号后换行
String variable = anObject.getSomething(longExpressionOne,
longExpressionTwo, longExpressionThree);
2。在操作符前换行
String varibale = longStringOne + longStringTwo
+ longStringThree;
3。高级别的换行优先
anObject.methodOne(parameterForMethodOne,
anObject.methodTwo(parameterForMethodTwo));
/ conventional indentation
int runningMiles = runningSpeedOne * runningTimeOne
+ runningSpeedTwo * runningTimeTwo;
// confusing indentation
int runningMiles = runningSpeedOne
* runningTimeOne + runningSpeedTwo
* runningTimeTwo;
4。新的换行与上一行同级别表达式的开头对齐
anObject.methodOne(parameterOne,
parameterTwo,
parameterTwo);
5。如果上述规则导致代码混乱或者代码太靠右,使用8个空格作为锁进
anObject.methodOne(parameterForMethodOne,
anObject.methodTwo(parameterOneForMethodTwo,
parameterTwoForMethodTwo,
parameterThreeForMethodTwo));
// bad indentation
if ((conditionOne && conditionTwo)
|| (conditionThree && conditionFour)) {
doSomething();
}
// a better indentation, using 8 spaces for the indentation
if ((conditionOne && conditionTwo)
|| (conditionThree && conditionFour)) {
doSomething();
}
import java.util.HashMap;
import java.util.Map;
class Solution {
/**
* Given an array of integers, return indices of the two numbers
* such that they add up to a specific target.
*/
public int[] twoSum(int[] nums, int target) {
Map map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
if (map.containsKey(complement)) {
return new int[] { map.get(complement), i };
}
map.put(nums[i], i);
}
throw new IllegalArgumentException("No two sum solution");
}
}