※ 개인적으로 이해한 대로 정리한 글
의미 있는 이름
- 의도를 분명히 하기
변수나 함수, 클래스의 이름을 길더라도 의미있는 이름으로 바꾸고, 상수는 final로 선언하여 이름을 주어 사용하기
배열을 클래스로 바꾸거나(필요 하에), 상수를 함수로 감추어도 좋음
- 그릇된 정보를 피하기
약어라도 이미 프로그래머들 사이에서 의미가 있는 약어는 사용하지 않는다.
ex) hypotenuse(삼각형 빗변) -> hp 왜냐하면 hp는 유닉스 플랫폼을 가리키는 이름이기 때문
List가 아닌데 AccountList로 만든다거나 하지 않기 -> 그릇된 정보! Accounts라고 하거다 다른 방법을 찾는다.
한번에 구분되지 않는 흡사한 이름도 피한다
유사한 개념은 유사한 표기법을 사용한다(hot key 조합을 사용할 수 있게)
- 의미있게 구분하기
동일한 번위 안에서 다름 두개념에 같은 이름을 사용하여 한쪽 이름을 마음대로 바꾸는 상황을 만들지 않는다.
불용어를 사용하지 않는다. 불용어는 중복이다. 굳이 붙이지 않아도 의미가 통하는 Info나 Data는 붙이지 않아도 되며 a나 the같은 접두어는 붙이지 않는다.
- 발음하기 쉬운 이름을 사용하기
변수 이름을 줄이겠다고 발음하기 어렵고 그들만이 아는 이름을 만들지 않는다. 의사소통에 방해를 한다.
- 검색하기 쉬운 이름을 사용하기
문자 하나를 이용하는 이름과 상수는 코드에서 쉽게 눈에 띄지 않는다.
MAX와 숫자 7 중에 찾기 쉽고 눈에 띄는 것은 MAX다.
문자 하나인 int e같은 변수도 검색하기 어렵다.
이름의 길이는 범위의 크기에 비례해야 한다. 간단한 메서드에서는 로컬 변수만 한 문자를 사용하기도 한다.
- 인코딩을 피하기
인코딩은 한글 인코딩 UTF-8/MS 949만 알고 있었다. 인코딩이라는 개념을 컴퓨터가 읽어들이는 명시적 정보라고 봐도 좋다. (변수 타입같은거)
헝가리식 표기법에서 타입을 변수이름에 넣거나 했는데, 이제는 그럴 필요가 없다.
멤버 변수를 구분하기 위해 옛날처럼 m_ 접두어를 붙이지않아도 된다.
단 인코딩이 필요한 경우도 있는데 인터페이스 클래스와 구현 클래스를 구분하기 위함이다.
그러나 옛날 방식처럼 인터페이스 클래스에 접두사 I를 붙이는 방법보다는 뒤에 접미사로 Imp나 구현클래스에 접두사 C를 붙이는 방법이 더 좋다.
- 자신의 기억력을 자랑하지 말기
자신만 아는 이름으로 만들지 않고 명료함이 최고다.
- 클래스 이름과 메서드 이름
클래스 이름은 명사나 명사구로, 메서드의 이름은 동사나 동사구가 적합하다. 접근자, 변경자, 조건자는 javabean 표준에 따라 get, set, is를 붙여야 한다.
생성자 중복 정의에는 정적 팩토리 메서드를 사용하는 것이 좋다.
Character minsoo = new Character(10,50);
Character chelsoo = new Character(10,50);
Character minhee = new Character(50,10);
Character younghee = new Character(50,10);
정적 팩토리 메서드는 이름을 가질 수 있어 어떤 값을 넣는지 알 수 있고, 불필요한 인스턴스 생성을 막는다.
class Character{
int mp;
int hp;
Character(int mp, int hp){
this.mp = mp;
this.hp = hp;
}
public static Character newWizard(){
return new Character(50, 10);
}
public static Character newWarrior(){
return new Character(50, 10);
}
}
간단하게 이러한 이유로 생성자 중복 정의에는 정적 팩토리 메서드를 사용하는 것이 좋다.
- 기발한 이름은 피하기
구어체나 속어, 특정 문화권에서만 통하는 이름을 사용하지 말것.
- 한 개념에 한 단어를 사용하기
추상적인 개념 하나에 단어 하나를 선택하여 일관적으로 사용한다.
똑같은 기능을 하는 메서드를 클래스마다 fetch, retrive, get으로 부르면 헷갈린다.
- 말장난을 하지 말기
위와 반대로 한가지 단어를 다른 개념에 사용하지 말아야 한다.
add라는 이름을 더하는 메서드로도 사용하고, 배열에 값을 추가하는 메서드로도 사용한다면 이것은 말장난이다.
- 해볍 영역에서 가져온 이름/ 문제 영역에서 가져온 이름
해법 영역에서 가져온 이름이란 프로그래머 사이에서 한번에 이해 가능한 개념을 이용한 이름
Queue라는 개념을 사용해서 변수이름을 지정하는 것처럼 해법영역에서 가져온 이름을 사용해도 된다.
문제 영역에서 가져온 이름이란 business 영역에서 가져오는 이름
두 개를 구분하여 적절히 사용하면 좋다.
- 의미 있는 맥락을 추가하기/ 불필요한 맥락을 없애기
클래스, 함수, 이름 공간에 넣어 맥락을 부여한다.
Address와 관련된 변수들을 접두어를 붙이거나 Address 클래스로 만들어서 관리한다.
그러나 맥락을 추가한다고 불필요하게 남용하면 안된다.
정적 팩토리 메서드 참고:
https://johngrib.github.io/wiki/static-factory-method-pattern/
'공부 스걱스걱 > 개발 지식' 카테고리의 다른 글
[clean code] 6장_ 객체와 자료구조 (0) | 2021.07.20 |
---|---|
[clean code] 4장_주석 (0) | 2021.07.01 |
[boostcourse/edwith] 부스트 코딩 뉴비 챌린지 2020 참여 (0) | 2021.06.20 |
[clean code] 3장_함수 (0) | 2021.06.16 |
[GIT] github 사용법 (0) | 2021.04.03 |