자바/자바 코딩의 기술

자바 코딩의 기술 - 4장 ( 올바르게 명명하기 )

끄적끄적 2022. 4. 9. 13:25

컴퓨터 과학에서 어려운 문제는 딱 두 가지, 캐시 무효화(Cache invalidation)와 명명(naming)이다.
- 필 칼튼

 

4-1. 자바 명명 규칙 사용하기

클래스는 대문자로 시작하고, 메소드는 동사형태의 소문자, 변수는 명사형태의 소문자로 시작하는 등 자바 코드 규칙을 준수하라. 

https://www.oracle.com/technetwork/java/codeconventions-150003.pdf

4-2. Getter/Setter는 규칙을 적용하라.

필드명이 foo이면 getFoo(), setFoo()와 같이 명명하며, boolean필드는 isFoo()와 같이 명명한다.

4-3. 변수명에 한 글자(i, l, m 등)를 사용하지 마라. 명시적으로 변수의 의미를 알 수 있는 이름을 사용하라.

4-4. 축약 쓰지 않기 

static final Path DIR = Paths.get("/var/log");
static final Path CSV = DIR.resolve("stats.csv");
static final String GLOB = "*.log";

void createStats() throws IOException {
    try (DirectoryStream<Path> dirStr =
                 Files.newDirectoryStream(DIR, GLOB);
         BufferedWriter bufW = Files.newBufferedWriter(CSV)) {
        for (Path lFile : dirStr) {
            String csvLn = String.format("%s,%d,%s",
                    lFile,
                    Files.size(lFile),
                    Files.getLastModifiedTime(lFile));
            bufW.write(csvLn);
            bufW.newLine();
        }
    }
}

위에는 DIR, CSV, GLOB, dirStr, bufW, lFile, csvLn 등 축약어가 많아 이해하기가 어렵다. 아래와 같이 변경하면 훨씬 낫다

static final Path LOG_FOLDER = Paths.get("/var/log");
static final Path STATISTICS_CSV = LOG_FOLDER.resolve("stats.csv");
static final String FILE_FILTER = "*.log";

void createStatistics() throws IOException {
    try (DirectoryStream<Path> logs =
                 Files.newDirectoryStream(LOG_FOLDER, FILE_FILTER);
         BufferedWriter writer =
                 Files.newBufferedWriter(STATISTICS_CSV)) {
        for (Path log : logs) {
            String csvLine = String.format("%s,%d,%s",
                    log,
                    Files.size(log),
                    Files.getLastModifiedTime(log));
            writer.write(csvLine);
            writer.newLine();
        }
    }
}

4-5. 무의미한 용어 쓰지 않기

class MainSpaceShipManager {
    AbstractRocketPropulsionEngine abstractRocketPropulsionEngine;
    INavigationController navigationController;
    boolean turboEnabledFlag;

    void navigateSpaceShipTo(PlanetInfo planetInfo) {
        RouteData data = navigationController.calculateRouteData(planetInfo);
        LogHelper.logRouteData(data);
        abstractRocketPropulsionEngine.invokeTask(data, turboEnabledFlag);
    }
}

main, manager, data, info, flag 처럼 자주 쓰이지만 무의미한 용어는 빼는게 낫다. 클래스명에 impl을 붙이거나 인터페이스에 접두사 I를 붙이는 것도 불필요.

class SpaceShip {
    Engine engine;
    Navigator navigator;
    boolean turboEnabled;

    void navigateTo(Planet destination) {
        Route route = navigator.calculateRouteTo(destination);
        Logger.log(route);
        engine.follow(route, turboEnabled);
    }
}

4-6. 도메인 용어 사용하기

업무 도메인마다 사용하는 언어가 있으므로, 단순히 Person 등을 쓰기 보다는, 해당 도메인의 용어 Astronaut(우주비행사) 등의 구체화된 용어를 사용하라.

반응형