1. 程式人生 > >Clean Code 程式碼整潔之道 格式

Clean Code 程式碼整潔之道 格式

程式碼整潔之道 第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;
	}
}