개행이 빠지면 가독성이 현저히 떨어진다.연관성이란 한 개념을 이해하는데 다른 개념이 중요한 정도다.변수는 처음으로 사용하기 직전에 선언하며 수직으로 가까운 곳에 위치해야 한다.비공개 함수는 처음으로 호출한 직후에 정의해야 쉽게 눈에 띄어야 한다.인스턴스 변수는 클래스 맨 처음에 선언한다.호출하는 함수를 호출되는 함수보다 먼저 배치해야 자연스럽게 읽힌다.
    public void checkAdmin() {
  if (!isAdmin()) {
    throw new BusinessException();
  }
}
  
private boolean isAdmin() {
  return Role.ADMIN == this.roleName;
}
private boolean isAdmin() {
  return Role.ADMIN == this.roleName;
}
private boolean isManager() {
  return Role.MANAGER == this.roleName;
}
들여쓰기 무시하기
# before
public String render() { return ""; }
# after    
public String render() {
  return "";
}
팀에 속한다면 자신이 선호해야할 규칙은 바로 팀 규칙이다. 그래야 스타일이 일관적이고 매끄럽다.public class CodeAnalyzer implements JavaFileAnalysis { 
    
    private int lineCount;
	private int maxLineWidth;
	private int widestLineNumber;
	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;
	} 
}