책에서 예시를 드는 프로젝트들은 테스트와 관련된 파일들로 보입니다.
실제 프로그래밍을 하다 보면 200줄 미만으로 작성한다는게
현실적으로 어렵고 억지로 줄이려고 파일을 나누는 건 오히려 비효율적일 때도 있다고 생각합니다.가독성을 해치지 않는 선에서
가능한 파일을 작게 분리하는게 좋다는 것을 강조하는 뜻으로 보면 될 것 같습니다.
[빈 행 X]
import Foundation
class Model {
...
}
[빈 행 O]
import Foundation
class Model {
...
}
[밀집 X]
class Model {
private var topConstraint: NSLayoutConstraint!
private var bottomConstraint: NSLayoutConstraint!
}
[밀집 O]
class Model {
private var topConstraint: NSLayoutConstraint!
private var bottomConstraint: NSLayoutConstraint!
}
이 개념을 알지 못하더라도 본능적으로 불편함을 유발하는 부분이 아닐까 생각합니다
수직 거리
결국 일관성에 관한 이야기.
이렇게 일관성 있게 코드를 작성하면 유추가 가능해지는게 가장 큰 장점이라고 생각합니다.일관성 있는 코드를 읽다 보면 아 이 함수는 밑에서 나오겠구나 유추가 되고
혹은 밑에 나오지 않는 경우 해당 함수가 가지는 어떠한 특수성으로 인해 다른 곳에 위치해있겠구나 등 굳이 찾아보지 않아도 유추가 가능해집니다.
가로 형식 맞추기
들여쓰기
func emptyString() { return "" }
보다는,
func emptyString() {
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;
}
}