컴퓨터 과학에서 어려운 문제는 딱 두 가지,
캐시 무효화(cache invalidation)와 명명(naming)이다. - 필 칼튼
class Rover {
static final double WALKING_SPEED = 3;
final string serialNumber;
double milesPerHour;
Rover(String SerialNumber) {
this.serialNumber = SerialNumber;
}
void drive() {
milesPerHour = WALKING_SPEED;
}
void stop() {
milesPerHour = 0;
}
}
자바 코드 규칙은 1997년부터 있었다.
이 규칙은 이름을 비롯해 자바 코드를 서식화하는 실질적 표준이다.
enum은 CamelCase로 작성한다.CAPITAL_SNAKE_CASE로 작성한다.camelCase로 작성한다.is, has, save, get, set 등과 같이 동사로 시작해야 한다.class Member {
private String name;
private boolean status;
public Member() {
}
public Member(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isStatus() {
return status;
}
public void setStatus(boolean status) {
this.status = status;
}
}
Getter와Setter는 표준화가 잘 되어 있어서 여러 프레임워크에서 대부분 따르고 있다.
이에Getter와Setter만의 명세인 자바 빈 명세도 따로 존재한다.
private으로, Getter와 Setter는 public으로 작성한다.Getter와 Setter의 이름은 getXxx, setXxx로 한다.boolean 타입의 필드는 isXxx로 이름을 붙인다.
Setter는 무분별하게 사용하면 안 된다.
Setter는 의도를 쉽게 파악하기 어렵고, 일관성을 지키는 것을 힘들게 만든다.
한 글자 이름에는 이유가 있을 수 없다.
코드가 비효율적이게 될까 봐 걱정할 수 있는데,
어차피 컴파일러는 컴파일 타임에 이름을 바이트코드로 대체해 버리므로 상관없다.
자신만의 축약어는 코드의 의미를 파악하는 데 큰 걸림돌이 될 수 있다.
class MainSpaceShipManager {
AbstractRocketPropulsionEngine abstractRocketPropulsionEngine;
INavigationController navigationController;
boolean turboEnabledFlag;
void navigateSpaceShipTo(PlanetInfo planetInfo) {
RouteData data = navigationController.calculateRouteData(planetInfo);
LogHelper.logRouteData(data);
abstractRocketPropulsionEngine.invokeTask(data, turboEnabledFlag);
}
}
간결성과 명명: 끝없는 투쟁
간결한 명명이 항상 미덕인 것은 아니다.
알아 들을 수 없는 축약어 대신 길지만 의미 있는 서술적인 이름이 낫다.
이름은 쓸 일보다 읽힐 일이 훨씬 많기 때문에 명확함을 추구하는 것이 좋다.
class spaceShip {
Engine engine;
Navigator navigatonr;
boolean turboEnabled;
void navigateTo(Planet destination) {
Route route = navigator.calculateRouteTo(destination);
Logger.log(route);
engine.follow(route, turboEnabled);
}
}
flag, info, data 등)을 제거했다.Spring 프레임워크에는 유명한 클래스명이 하나 있다.
장미는 붉고 잎사귀는 푸른데 유독 자바에만AbstractSingletonProxyFactryBean클래스가 있다.
class Person {
String lastName;
String role;
int travels;
LocalDate employedSince;
String serializeAsLine() {
return String.join(",",
Arrays.asList(lastName,
role,
String.valueOf(travels),
String.valueOf(employedSince))
);
}
}
serializeAsLine() 메서드는 어떤 형식을 다루는가?클래스나 패키지처럼 범위가 넓은 이름은 메서드 내 변수 같은, 범위가 좁은 이름보다 훨씬 많이 읽힌다.
따라서 중요한 이름에는 더 많은 노력을 쏟아야 한다.
class Astronaut {
String tagName;
String rank;
int missions;
LocalDate activeDutySince;
String toCSV() {
return String.join(",",
Arrays.asList(tagName,
rank,
String.valueOf(missions),
String.valueOf(activeDutySince))
);
}
}
toCSV()로 변경하여 메서드의 의도를 더 확실히 알 수 있게 되었다.가능하면 코드 내 이름은 해당 도메인에 맞게 짓고 포괄적인 명칭은 피하자.
완벽한 명명은 불가능하다. 더 나은 이름이 떠오를 때까지 항상 리팩터링하자.
이 장의 내용은 [자바 코딩의 기술: 똑똑하게 코딩하는 법]의 4장 내용을 정리한 것입니다.