Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 디버깅
- langgraph
- ipo 매매자동화
- jwt 표준
- 결제서비스
- 크롤링
- docker
- 카카오
- BFS
- spring event
- 쿠키
- AWS
- ai agent
- 백준
- 이분탐색
- 구현
- 레디스 동시성
- gRPC
- 완전탐색
- 추천 검색 기능
- piplining
- 몽고 인덱스
- 아키텍쳐 개선
- 검색어 추천
- 프로그래머스
- 트랜잭샨
- next-stock
- 누적합
- JPA
- 셀러리
Archives
- Today
- Total
코딩관계론
[Clean Code] 코드에는 의미가 있어야 한다. 본문
반응형
의도를 밝혀라
public List<int[]> getThem()
{
List<int[]> list1 = new ArrayList<int[]
for(int[] x: theList)
{
if(x[0] == 4)
list1.add(x)
}
return list
}
- 코드의 문제점은 함축성이다
- list1이 무슨 기능을 가졌는지 알 수 없다
- 왜 x[0]번지의 값이 중요한지 알 수 없다.
- 상수 4가 의미하는 내용을 알 수 없다
public List<int[]> getThem()
{
List<int[]> flaggedcell = new ArrayList<int[]
for(int[] cell: gameBoard)
{
if(cell[STATE_VALUE] == FLAGGED)
flaggedcell.add(cell)
}
}
- 지뢰 찾기 게임이라고 가정한다
- 단순한 숫자를 의미있는 이름을 가진 상수로 변경해주면서 코드를 이해하기 더 쉽게 됐다.(STATE_VALUE, FLAGGED)
- 단순한 이름이 아닌 사용용도를 풀어줌으로써 이득이 생감
- list1 → flaggedcell
- 최종적으로 int형이 아니라 Cell 객체를 만들어도 됨
public List<int[]> getThem()
{
List<Cell> flaggedcell = new ArrayList<int[]
for(Cell cell: gameBoard)
{
if(cell.isFlaged())
flaggedcell.add(cell)
}
}
- Cell 객체화 하여 관리하기 더 쉽게 만들었다.
- isFlaged라는 명시적인 함수를 만들어 상수를 감춰주었다.
# # Create the launch description and populate
ld = LaunchDescription()
ld는 의미가 없다고 생각한다.
ld → launchDescription가 의미를 풍부하게 만든다고 생각한다
Clober/navi/bringup.launch 발췌
그릇된 정보를 피하라
- 특수성을 가진 단어를 피하라
- 여러명의 계정을 묶을 때 실제 List가 아니라면 accountList라고 명명하지 말자.
- List는 프로그래머에게 특수성을 준다
- accountList → accountGroup, accounts
- 여러명의 계정을 묶을 때 실제 List가 아니라면 accountList라고 명명하지 말자.
- 유사한 개념은 유사한 표기법을 사용하자
- 일관성이 떨어지는 표기법은 그릇된 정보이기 때문이다.
- 의미있게 구분하라
- 단순한 a1, a2가 아니라 source , destination이었다면 의미가 더 느껴졌을 것이다
public stsatic void copyChars(char a1[], chara2[])
{
for(int i = 0; i < a1.length; ++i)
{
a2[i] = a1[i];
}
}
public stsatic void copyChars(char source[], chara2 destination[])
{
for(int i = 0; i < a1.length; ++i)
{
destination[i] = source[i];
}
}
- 불용어를 추가하지 말자 → 개념이 달라지지 않고 이름만 달라지는 경우
- ProductInfo, ProudctData → 모르는 사람이 본다면 둘의 차이점을 알 수 없다. 개념을 구분해서 사용하자
- getActiveAccount(), getActiveAccounts(), getActiveAccounInfo() → 차이를 알기 힘들다. 차이를 알 수 있도록 작성하
- 클래스 이름
- 클래스 이름과 객체 이름 명사나 명사구가 적합하다
- 메서드 이름
- 메서드는 클래스의 동작을 수행함으로 동사나 동사구가 적합하다.
- 한 개념에 한 단어를 사용하자
- get, fetch, retrieve 제 각각 부르면 혼란스럽다.
- 말장난을 하지 말자
- add라는 함수는 기존값에 + 새로운 값 = 새로운 값을 나타내는 함수로 사용됐다. 하지만 다른 집합에 다른 내용을 추가할 때 add를 사용할 수 있는가? → no insert나 다른 개념을 사용하자
- 의미 있는 맥락을 추가하라 (이해가 잘 안됨)
- 변수의 대부분은 의미 있는 맥락을 제공하지 못한다.
- 클래스, 함수, namespace등으로 맥락(Context)을 표현해라
private void printGuessStatistics(char candidate, int count) {
String number;
String verb;
String pluralModifier;
if (count == 0) {
number = "no";
verb = "are";
pluralModifier = "s";
} else if (count == 1) {
number = "1";
verb = "is";
pluralModifier = "";
} else {
number = Integer.toString(count);
verb = "are";
pluralModifier = "s";
}
String guessMessage = String.format("There %s %s %s%s", verb, number, candidate, pluralModifier );
print(guessMessage);
}
함수는 맥락의 일부만 제공하고, 알고리즘이 나머지 맥락을 제공한다.
위의 변수가 어느 맥락에서 사용되는지 알 수 없다. 함수를 다 읽고야 메세지를 보내는 맥락에서 사용된다는 것을 알 수 있다.
public class GuessStatisticsMessage {
private String number;
private String verb;
private String pluralModifier;
public String make(char candidate, int count) {
createPluralDependentMessageParts(count);
return String.format("There %s %s %s%s", verb, number, candidate, pluralModifier );
}
private void createPluralDependentMessageParts(int count) {
if (count == 0) {
thereAreNoLetters();
} else if (count == 1) {
thereIsOneLetter();
} else {
thereAreManyLetters(count);
}
}
private void thereAreManyLetters(int count) {
number = Integer.toString(count);
verb = "are";
pluralModifier = "s";
}
private void thereIsOneLetter() {
number = "1";
verb = "is";
pluralModifier = "";
}
private void thereAreNoLetters() {
number = "no";
verb = "are";
pluralModifier = "s";
}
}
세가지 변수를 클래스에 넣어줌으로써 맥락이 분명해졌다.
변수들이 확실하게 Message 클래스에 속하게 된다.
반응형
'Clean code' 카테고리의 다른 글
파이썬 데코레이터(Decorator) (0) | 2023.02.26 |
---|---|
[Clean code] 클래스 (0) | 2023.01.11 |
[Clean code] 형식 맞추기 (0) | 2023.01.09 |
[Clean code] 자료추상화 (1) | 2023.01.06 |
[Clean code] 함수 (0) | 2023.01.04 |