나쁜 코드와 좋은 코드란?
🚫 나쁜 코드의 특징
- 필수적인 로직 외의 코드들이 추가되어서 성능이 저하된다.
- 제 3자가 볼때 사용 용도, 의미를 알 수 없는 모호한 표현(네이밍)
- 중복으로 인한 코드의 재활용성 저하
😊 깨끗한 코드의 특징
- 성능이 보장되는 코드
- 가독성이 좋은 코드, 즉 잘 쓴 문장처럼 술술 읽히는 코드
- 중복을 최대한 줄여서 코드의 재활용성을 극대화한 코드
- 한가지 기능에 집중하는 코드(SOLID의 SRP 원칙)
보이스카우트 룰
내가 코드를 건드리기 전보다 더욱 깨끗한 상태로 만들어야 한다.
네이밍을 잘 하기
String a;
int b;
public void printMyData(String a, int b)
{
System.out.println("my name is " + a + " and my age is " + b)
}
a , b 로 변수명을 짓는건 결과값이 나오기 전까지는 변수의 용도를 알 수 없게 한다.
코드의 가독성을 떨어뜨리는 원인이다. 좋은 코드는 보자마자 문맥을 파악 할 수 있어야 한다.
String name;
int age;
public void printMyData(String name, int age)
{
System.out.println("my name is " + name + " and my age is " + age)
}
List<Member> memberList = new ArrayList<>(); // OK
Map<Member> memberList = new HashMap<>(); // BAD
Map<Member> members = new HashMap<>(); // OK
List나 Map 등의 자료형에 대한 이름은 실제 데이터 타입이 맞을 때 명시해주자.
자료형을 명시 하지 않으려면 members와 같은 이름을 대신 사용하자.
변수명만 보고도 타입을 유추할 수 있는게 Best!
int a1; // BAD !
int a2;
int a3;
String MemberData // BAD !
String MemberInfo
String zipcode // 나쁘지 않지만 3가지를 포함할 수 있는 클래스 생성해서 명확성 부여
String city
String state
Class Address { // address의 state라는게 명확해졌다.
String zipcode
String city
String state
}
단순 숫자의 증가로 변수를 표현하는 것 금지
단순 구분을 짓기 위한 Data, Info 같은 모호한 불용어 사용 금지
공통으로 묶을 수 있는 클래스를 지정해주는것도 좋은 방법
Member, Customer, User // 해당 단어들은 같은 문맥으로 쓰이는 단어이다.
Repositor, dao
Service, manage
add, plus // 메서드 이름도 적용 가능
array.insert() 와 addNumber(int first, int second)의 add는 용도가 다르다.
array.add() // BAD
단어의 일관성을 유지하자. 프로젝트 내의 여러 곳에서 각자 다른 단어가 사용되면 혼란이 오고 유지보수성이 떨어진다.
팀과의 협업에서 네이밍에 대한 기준을 정하고 들어가자!
add와 insert의 사례처럼 일관성은 유지하되, 기능적으로 차이가 있을때는 둘을 묶지 않고 명확하게 분리 해줘야 한다.
Interface ISalesDeploy // BAD
Interface SalesDeploy // OK
class SalesDeployImpl // not bad
class FixSalesDeploy // OK
인터페이스의 이름 앞에 I를 붙이는건 지금 거의 사용 안한다.
클래스 이름은 구체적인 기능을 명시해주는게 Best Practice
for( int i ; i < 10 ; i++) // BAD
for(Member member : members) // OK
members.stream().foreach() // lamda OK
for 반복문을 사용하면 의미없는 변수 이름인 i 가 사용된다. 코드를 더럽게 만들기 좋은 변수명이기 때문에 의미 있는 이름으로 변경하던가 아예 없애야 한다.
for문의 사례에서는 advanced for문과 lamda를 사용해서 i라는 무의미한 변수를 없앨 수 있다.
Member.setNameAndAge("jemin",24)
Member.setName("jemin")
클래스의 생성자를 중복으로 정의할 때는 생성자를 여러개 만드는것 보다 정적 팩토리 메서드를 만들자
Google style guide
// Package name
com.example.jeminwork // OK
com.example.jemin_work // BAD
com.example.jeminWork // BAD
// Method : lowerCamelCase
public setMethodName() // OK
// Class : UpperCamelCase
public class FixSaleDeploy{} // OK