代码整洁之道 第5章 格式 笔记
5.1 格式的目的
代码格式关乎沟通
5.2 垂直格式
5.2.1 像报纸学习
源文件最顶部应该给出高层次概念和算法,细节应该往下渐次展开。
5.2.2 概念间垂直方向上的分隔
不同的东西用空白隔开。
5.2.3 紧密相连的应该靠近
5.3 横向格式
每行的代码不要过宽,尽量不超过80个字符
5.3.1 水平方向上的分隔与靠近
一段简单的例子:
private void measureLine( String line) {
lineCount++;
int lineSize = line.length();
totalChars += lineSize;
lineWidthHistogram.addLine(lineSize, lineCount);
recordWidestLine(lineSize);
5.3.2 水平对齐
不必过分对齐。
5.3.3 缩进
类中的方法相对类缩进,方法的实现相对方法声明缩进
5.4 团队规则
5.5 一个范例
public class CodeAnalyzer implements JavaFileAnalysis { private int lineCount; private int maxLineWidth; private LineWidthHistogram lineWidthHistogram; private int totalChars; public CodeAnalyzer() { lineWidthHistogram = new LineWidthHistogram(); } public static List<File> findJavaFiles(File parentDirectory) { List<File> files = new ArrayList<File>(); findJavaFiles(parentDirectory, files); return files; } private static void findJavaFiles(File parentDirectory, List<File> files) { for(File file : parentDirectory.listFiles()) { if(file.getName().endsWith(".java")) files.add(file); else if(file.isDirectory()) findJavaFiles(file, files); } } public void analyzeFile(File javaFile) throws Exception { BufferedReader br = new BufferedReader(new FileReader(javaFile)); String line; while((line = br.readLine()) != null) measureLine(line); } private void measureLine(String line) { lineCount++; int lineSize = line.length(); totalChars += lineSize; lineWidthHistogram.addLine(lineSize, lineCount); recordWidestLine(lineSize); } private void recordWidestLine(int lineSize) { if(lineSize > maxLineWidth) { maxLineWidth = lineSize; widestLineNumber = lineCount; } } public int getLineCount() { return lineCount; } public int getMaxLineWidth() { return maxLineWidth; } public int getWidestLineNumber() { return widestLineNumber; } public LineWidthHistogram getLineWidthHistogram() { return lineWidthHistogram; } public double getMeanLineWidth() { return (double) totalChars / lineCount; } public int getMedianLineWidth() { Integer[] sortedWidths = getSortedWidths(); int cumulativeLineCount = 0; for (int width : sortedWidths) { cumulativeLineCount += lineCountForWidth(width); if(cumulativeLineCount > lineCount / 2) return width; } throw new Error("Cannot get here"); } private int lineCountForWidth(int width) { return lineWidthHistogram.getLinesForWidth(width).size(); } private Integer[] getSortedWidths() { Set<Integer> widths = lineWidthHistogram.getWidths(); Integer[] sortedWidths = (widths.toArray(new Integer[0])); Arrays.sort(sortedWidths); return sortedWidths; } }