책/클린코드

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

6161990 2021. 9. 15. 20:21

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마틴의 <클린코드  : 애자일 소프트웨어 장인정신> 을 기반으로 한다.