본문 바로가기
책/클린코드

[클린코드 완독하기] Chapter 01~02 깨끗한 코드와 의미있는 이름

by 6161990 2021. 9. 15.

Chapter 01. 나쁜 코드란 무엇일까

성능이 나쁜 코드 

불필요한 연산이 들어가서 개선의 여지가 있는 코드 

 

의미가 모호한 코드

이해하기 어려운 코드
네이밍과 그 내용이 다른 코드

 

중복된 코드  

비슷한 내용인데 중복되는 코드 

 

나쁜 코드를 방치하면 안되는 이유 

 

1. 깨진 유리창 법칙  *깨진 유리창 하나를 방치해두면 그 지점을 중심으로 범죄가 확산한다는 법칙

나쁜 코드는 깨진 유리창처럼 계속 나쁜 코드가 만들어지도록 한다. 

 

2. 생산성 저하

나쁜 코드는 팀 생산성을 저하시킨다. 기술 부채를 만들어 수정을 더 어렵게한다.

 

3. 새로운 시스템을 만들어야한다.

현 시스템을 유지보수하며 대처할 새로운 시스템 개발은 현실적으로 매우 어렵다. 

 

 

나쁜 코드를 짜는 이유 

  • 촉박한 일정
  • 생각보다 영향범위가 넓어서 일이 커질까봐

 

So, What is CLEAN CODE

  • 한 가지를 제대로 하는 코드 Single Responsibility Principle
  • 의미가 명확한 코드
  • 성능이 좋은 코드 
  • 중복이 제거된 코드

 

 


 

 

 

Chapter 02. 의미가 분명한 이름짓기

  • 더 좋은 코드가 뭘까 고민해보자.
int a;
int b; 

System.out.println("User's Seed Money %d. Today's Save Money =%d", a, b );
int seedMoney;
int saveMoney;

System.out.println("User's Seed Money %d. Today's Save Money =%d", seedMoney, saveMoney );

 

 

  • 명확하게 코드를 파악할 수 있도록 클래스 이용하기
class ResearchItem {
    ResearchCode code;
    String title;
    int researcherCount;
}

ResearchItem selectedResearch = researchItemRepository.getResearchByCode(conferenceRequet.getResearchCode());

 

 

  • 인덱스가 필요 없다면 roop 속 i j k  사용하지않기
for( int i = 0; i<research.size(); i++) {
   // ..
}
instead of Advanced for 
for(int research : todayResearch) {
   // ..
}
instead of lamda
todayResearch.stream().forEach(
  research -> // ..
)

 ** i j k 대신,  맥락에 맞는 이름을 찾아 사용하자

      ex ) row, col / width, height .. 

 

 

 

  • 통일성 있는 단어 사용하기
Member / Customer / User
Service / Manager
Repository / Dao

 

 

  • 변수명에 타입 넣지 않기
String nameString 보다는 name
int itemPriceAmonut 보다는 itemPrice

Account[] accountArray 보다는 accounts
List<Account> accountList 또는 accounts
Map<Account> accountMap : 네이밍만 보고 타입을 유추할 수 있다

public interface IShapeFactory 보다는 ShapeFactory
public class ShapeFactoryImpl 또는 CircleFactory : 인터페이스 앞에 I를 붙이지않고 구현클래스에 Impl을 붙이는 방식인데, 이것은 팀과 회사가 정해놓은 규칙을 따라가면 된다. 

 

 

  • 패키지 네이밍 가이드 , All lower case, no underscores
com.example.deepspace (o)
com.example.deep_space (x)
com.example.deepSpace (x)

 

 

  • 클래스 네이밍 가이드 , UpperCamelCase (대문자로 시작)
클래스는 명사, 명사구
Character, ImmutableList

인터페이스는 명사, 명사구, (형용사)
List, Readable

테스트 클래스는 Test로 끝나기
HashTest, HashIntegrationTest

 

 

  • 메소드 네이밍 가이드 , LowerCamelCase (소문자로 시작)
메소드는 동사, 동사구
sendMessage, stop

jUnit 테스트에 underscore 사용되기도 함
** methodUnderTest_state 패턴 
pop_emptyStack

 

 

 

 

 

본 포스팅은 로버트 C마틴의 <클린코드  : 애자일 소프트웨어 장인정신> 을 기반으로 한다.