클린 코드

가언·2024년 7월 9일

클린 코드란?

  • 가독성이 좋은 코드
  • 성능이 좋은 코드
  • 안정성이 좋은 코드

  • 코드는 이해하기 쉬워야 한다.
  • 코드는 다른 사람이 그것을 이해하는 데 들이는 시간을 최소화 하여야 한다
  • 이해를 위한 시간을 최소화 하는 것이 더 좋은 목표이다.

예시01

bad 코드

if(data.before(SUMMER_START)||date.after(SUMMER_END))
//여름이 아니면
	charge=quantity*_winterRate+_winterServiceCharge;
    //겨울 비용을 부과한다.
else
	//여름이면
    	charge=quantity*_summerRate;
        //여름 비용을 부과한다.

clean 코드

if(isSummer()){
    charge=getSummerCharge();
    
}
else{
	charge=getWinterCharge();
}

 자바에서는 메소드/생성자 내에서만 if 문을 쓸 수 있음!

  • 나쁜 코드는 지속적인 생산성 하락과 관리 비용가 증가한다.

깨진 유리창 법칙

깨진 유리창 하나를 방치해 두면, 그 지점을 중심으로 범죄가 확산되기 시작한다는 이론
코드는 시간이 지남에 따라 지저분한 코드가 되며, 이는 "깨진 유리창 법칙"과 유사한 원리로 설명될 수 있습니다. 초기에는 작은 결함이나 비일관성이 눈에 띄지 않을 수 있지만, 이를 방치하면 점차 더 큰 문제로 발전하게 된다.

워드 커닝엄

코드를 읽으며 짐작했던 기능을 각 루틴이 그대로 수행한다면 클린 코드라 불러도 되겠다.
코드가 그 문제를 풀기 위한 언어처럼 보인다면 아름다운 코드라 불러도 되겠다.

면접 질문

  • 클린 코드 책 아세요?
  • 우리 회사 코드가 클린코드 책과 다르게 적혀있으면 어떻게 하실건가요?
    이 책이 정답이 아니기 때문에 회사 내에 룰을 따르는게 먼저다..!

예시02

의도가 분명하게 이름 지을 것

//boolean e=false;
boolean isExpired=false; =>조건문(if(isExpire)){...)

//가장 최근 비밀번호 변경 날짜로부터 로그인한 현재까지의 날짜 차이 수
//ind d;
int daysSinceLastChangePassword
  • 변수의 길이가 길어도 되지만, 가독성을 해치면 안됨.

예시03

	//public List<String> retrieveAuListUser(Data inputData) throws Exception
    public List<String> retrieveAuThorityIdsForUser (Data inputData) throws Exception
    
    //MultiData userList
    MultiData users;//userMap userSet
    
    //MultiData auList
    MultiData authorities;
    
    //List<String> idList
    List<String> authorityIds;
  • List를 사용하지않고 복수형으로 적기, 줄어서 쓰지 않기
  • 접미사로 컨테이너가 포함된 이름은 복수단어로 대체하는 것이 좋다

예시 04

//String tmp=user.getName();
//tmp+=" "+user.getTelNumber();
//tmp+=" "+user.getEmail();
//template.set("userInfo", tmp);
String userInfo=user.getName();
.
.
.
  • 보편적인 약어쓰지 말자
  • 임시로 사용하는 것만 변수명을 tmp로

예시 05

//불필요한 단어(Info, Data) 추가 지양
//Customer customerInfo=CommonResource.get..
//Account accountData=CommonResource.get..

Customer customer=CommonResource.get..
Account account=CommonResource.get..

예시 06

//public void genymdhms();

//YYYYMMDD
public void generateDateTime();
  • 발음하기 어려운 메소드는 사용하지 말자
  • 패턴을 빼놓고 적기

실습 01

치킨집
매장이름: String
매장오픈일: Date
사장님이름: String
매장정보출력():void
주문접수():void
주문거절():void

public class ChickenStore{
	String name;
    Date openDate;
    String ownerName;
    public void toString(){
    }
    public void acceptOrder(){
    }
    public void rejectOrder(){
    }
}

method 추출

  • 가급적이면 if/else, while 문 등에 들어가는 블록은 길지 않게 작성하며, 주로 메소드 호출 등의 짧고 간단한 내용으로 적는 것이 좋다.

short-circuit

//assert((!(bucket=findBucket(key)) || !bucket.isOccupied());
||(또는 ) 연산자는 앞 조건이 True이면 뒤를 볼 필요가 없다.

Bucket bucket=findBucket(key);
if(bucket!=null){
	assert(!bucket.isOccupied());
}

예시 07

//set메소드는: userName 변수에 아무런 값이 없으면, "홍길동"을 넣고, 있으면 반환
if(set(userName, "홍길동")){//userName에 "홍길동"이라는 이름을 넣자?! NO!}


//아래와 같이 값을 조회하는 메소드와 저장하는 메소드로 역할을 분리해야함
if(existAttribute(userName)){
	setAttribute(userName, "홍길동");
}

예시 08

가능하면 메소드를 최대한 빨리 반환하는 것이 좋다.

public boolean checkContain(String, fullString, String subString){
	//boolean isFull=false;
    if(fullString==null ||subString==null){
    	return false;
    }
    
    if("".equals(subString){
    	return ture;
    }
    //return isFull;
}
  • 로직 역추적 불가능=어디에서 어떤 조건이 이런 반환값을 만들어냈는지 알아내기 어려움
  • 굳이 아래 로직을 안 타도 되는데(=확인할 필요 없는 로직도) 타는 경우가 발생
  • return을 앞에서 하면 성능적으로 좋고, 메모리에 올려둘 필요가 없음

예시09

중복 코드는 없애세요!

결론

처음부터 완벽한 소스코드를 작성하는 사람은 아무도 없다.
그냥 완벽한 코드도 없다. 누군가에게는 다른 시선이 존재하기 때문이지~
이유를 제시하고 설득할 수 있으면 가능하다.
처음부터 클린코드를 짜겠다는 생각보다는 리팩토링하겠다는 생각을 하자
그렇다면 처음부터 클린코드를 염두에 두며 코드를 짜게 될 것이다!

profile
@gari_guri

0개의 댓글