"컴퓨터 과학에서 어려운 것은 단 두 가지입니다: 캐시 무효화, 그리고 이름짓기 입니다." - 필 칼슨(Phil Karlson) |
프로그래밍을 할 때 변수 이름을 짓는 것이 가장 어렵다고 생각합니다.
어떤 규칙이 있는 것은 아니지만 변수명을 잘 작성해야 코드의 이해도를 높이고 협업시에도 가독성면에서 큰 도움이 되기 때문입니다.
이러한 변수명 작성 규칙에 도움이 되는 A/HC/LC패턴을 소개하려고 합니다.
아래 코드는 자바를 기준으로 예시를 들어 설명하겠습니다.
A/HC/LC 패턴
(prefix) + action (A) + high context (HC) + (low context) (LC)
A/HC/LC 패턴에서 context(문맥)는 함수 또는 메소드가 수행하는 동작과 관련된 정보를 제공합니다.
해당 함수가 어떤 도메인에서 작동하는지 또는 예상하는 데이터 유형을 명시하는데 사용됩니다.
여기서 설명하는 패턴은 행위 + 명사(high context) + 명사(low context)의 패턴으로 이루어져 있습니다.
prefix와 low context는 생략 가능하며 자세한 것은 아래에서 설명하겠습니다.
1. prefix
현재 동작의 상태를 반영합니다.
문맥이 상태와 관련된 것이 아니라면 생략 가능합니다.
예시 용어들
- is : 주어진 조건이나 상태를 확인하는 데 사용합니다.
public boolean isReady() {
// 계좌에 금액이 얼마 이상이면 준비됨
return getAccountBalance() >= 100_000;
}
- has : 특정 속성 또는 항목을 보유하고 있는지 확인하는데 사용합니다.
public boolean hasPermission(String user, String permission) {
// 사용자의 권한을 확인
String userPermission = userPermissions.get(user);
// 사용자의 권한이 존재하고, 요청한 권한과 일치하면 true 반환
return userPermission != null && userPermission.equals(permission);
}
- should : 조건에 따라 특정 동작을 수행해야 할 때 사용합니다.
public boolean shouldUpdateCache() {
// 현재 시간을 얻어옴
LocalTime currentTime = LocalTime.now();
// 시간이 홀수인 경우에는 캐시 업데이트 필요
return currentTime.getHour() % 2 != 0;
}
2. action
메소드가 수행하는 동작을 의미합니다. 일반적으로 동사를 사용합니다.
예시 용어들
- get : 데이터를 가져오는 동작을 나타냅니다.
private int data;
// 데이터를 가져오는 메소드
public int getData() {
return data;
}
- set : 값을 설정하거나 변경하는 동작을 나타냅니다.
private int configValue;
// 값을 설정하는 메소드
public void setConfigValue(int newValue) {
configValue = newValue;
}
- reset : 초기 상태로 되돌리는 동작을 나타냅니다.
private int count;
// 초기 상태로 되돌리는 메소드
public void resetCounter() {
count = 0;
}
- fetch : 외부에서 데이터를 가져오는 동작을 나타냅니다.
public String fetchData() {
// 데이터를 가져오는 메소드
return "Fetched data";
}
- remove : 항목을 제거하는 동작을 나타냅니다.
private List<String> itemList = new ArrayList<>();
// 항목을 제거하는 메소드
public void removeItem(String item) {
itemList.remove(item);
}
- delete : 데이터나 파일 등을 삭제하는 동작을 나타냅니다.
// 파일을 완전히 삭제하는 메소드
public void deleteFile(String filePath) {
File file = new File(filePath);
if (file.exists()) {
file.delete();
System.out.println("파일 제거 완료");
} else {
System.out.println("파일을 찾을수 없음" + filePath);
}
}
- compose : 여러 부분을 조합하여 새로운 것을 만드는 동작을 나타냅니다.
// 이름을 조합하는 메소드
public String composeFullNames(String firstName, String LastName) {
return firstName + " " + LastName;
}
- handle : 특정 이벤트나 조건을 처리하는 동작을 나타냅니다.
// 이벤트를 처리하는 메소드
public void handleEvent(String eventName) {
if (eventName != null) {
// 이벤트 처리 로직
updateEventCount(eventName);
displayEventInfo(eventName);
} else {
System.out.println("이벤트 정보를 찾을 수 없습니다.");
}
}
3. context
메소드가 작동 가능한 도메인이 무엇인지 알려주거나 최소한 예상하는 데이터 유형을 알려줍니다.
HC(High Context) : HC는 주로 함수나 메소드가 수행하는 동작과 관련된 핵심 도메인을 나타냅니다.
LC(Low Context) : LC는 경우에 따라 생략 가능하며, 함수가 수행하는 동작의 보조적인 부분이나 세부 정보를 나타냅니다.
HC 예시
public double calculateIncome(double income) {
// 소득에 대한 세금 계산
return income * 0.2;
}
여기서 HC는 Income으로, 수입과 관련된 도메인 다룬다는 것을 알려줍니다.
HC + LC 예시
public String getUserFullName(User user) {
// user의 전체 이름을 가져오는 로직
return user.getFirstName() + " " + user.getLastName();
}
여기서 HC는 User이며, LC는 사용자의 이름을 가져오는 로직에 관련된 정보입니다.
결론
네이밍 규칙은 네이밍에 도움이 되는 것일 뿐 절대적이진 않습니다.
예시를 잘 보면 prefix를 사용할 때 action이 생략되어 있기도 하고, HC + LC조합으로는 다소 이해하기 어려운 메소드도 있습니다.
오히려 메소드가 여러일을 할 떄에는 전치사나 접속사로 작성하는 것이 더 도움이 될 때도 있습니다.
예를 들어
public void registerUserInDatabase(String username) {
// 사용자 등록 로직
database.addUser(username);
}
public String formatAndPrintMessage(String message) {
// 메시지 서식 지정 로직
// 서식이 지정된 메시지를 출력하는 로직
}
public void performComplexTaskWithRetry() {
// 복잡한 작업 수행
// 실패 시 재시도 로직
}
이런 경우가 있을수 있겠죠.
각 상황에 따라 유연하게 네이밍을 선택하고, 코드의 의도를 명확히 전달할 수 있는 방식을 선택하는 것이 중요합니다.
가독성과 이해도를 높이기 위해 코드를 작성하고 유지보수하는 과정에서 항상 유연하게 생각하는 게 좋을 것 같습니다.
참고
'프로그래밍' 카테고리의 다른 글
h2 데이터베이스 설치 및 실행방법 정리 (0) | 2023.07.03 |
---|
남에게 설명할 때 비로소 자신의 지식이 된다.
포스팅이 도움되셨다면 하트❤️ 또는 구독👍🏻 부탁드립니다!! 잘못된 정보가 있다면 댓글로 알려주세요.