본문 바로가기

TDD, CleanCode

클린코더스 강의 리뷰 4. Forms

1. 코멘트 작성 요령

1) 남발 하지 마라. 가능한 사용하지 마라.

< 키가 키고 밸류가 밸류고 >

의미 없는 코드는 우리를 양치기 소년으로 만든다고 한다.

 

정말 필요할 때만 사용하여서, 코멘트를 가치있게 만들자.

 

2) 이럴 때는 사용할 수 있다.

 

  • 법률적인 문제에 대한 코멘트

< 라이센스 >

  • 정규표현식과 같은 포멧에 대한 알림

< 날짜 포멧 >

  • TODO 코멘트

< 다음에 혹은 나중에 해야 할 일은 무엇인가 >

3) 이럴 때는 사용을 자제하라

 

  • 정보의 중복을 피하라

위의 chhildren의 경우 변수의 타입이나 변수명만 보고도 예측할 수 있다. 

가운데의 경우 이미 메소드에서 input데이터는 무엇인지 어떤 데이터가 output되있는지 명시되어 있다.

아래의 경우 설명하지 않아도 이미 default 생성자이다.

 

  • 버전관리 시스템의 역할을 하지 마라

누가 만들었는지, 언제 만들었고 수정했는지는 버전관리 시스템에게 맡기자.

 

2. Vertical Formatting

세로에 대한 포멧, 즉 어떤 경우에 공란을 사용하고 하지 말아야 하는지가 핵심이다.

다음 경우를 제외하고는 공란을 사용하지 말도록 하자.

 

1) 메소드 사이

2)private 변수들과 public 변수들 사이

3) 메소드 내에서 변수선언과 메소드 실행의 나머지 부분 사이

4) if/loop 블록과 다른 코드사이

< 다음을 충족하는 예시 >

3. Classes

클래스란 무엇인가?

private 변수들은 숨기고 public함수들로 private변수들을 조작하는 것이다.

그런데 기껏 private으로 만들어 두고 getter/setter를 사용한다면, 이게 무슨 의미가 있나.

그렇기 때문에 getter/setter 사용을 지양하도록 한다.

 

클래스가 가장 클래스 답기 위해서는

coupling(결합도)를 낮추고, cohesive(응집도)를 높이라고 항상 말한다.

정의는 다음과 같다.

coupling(결합도)

소프트웨어 코드의 한 요소가 다른 것과 얼마나 강력하게 연결되어 있는지, 또한 얼마나 의족적인지 나타내는 정도이다. 프로그램의 요소가 결합도가 낮다는 것은 그것이 다른 요소들과 관계를 그다지 맺지 않는 상태를 의미한다.

 

이는 객체와 객체간이 얼마나 독립적인지를 말한다.

 

cohesive(응집도)

 

프로그램의 한 요소가 해당 기능을 수행하기 위해 얼마만큼의 연관된 책임과 아이디어가 뭉쳐있는지를 나타내는 정도이다. 일반적으로 프로그램의 한 요소가 특정 목적을 위해 밀접하게 연관된 기능을이 모여서 구현되어 있고, 지나치게 많은 일을 하지 않으면 그것을 응집도가 높다고 표현한다. 응집도가 높으면 프로그램을 쉽게 이해할 수 있으므로 유지보수성이 높아진다.

 

이는 곧 하나의 클래스가 가지는 변수와 메소드를 얼마나 많이 사용하는 가를 의미한다.

< 응집도가 좋은 예시 >

getter/setter는 하나의 변수만 사용하기 때문에 cohesive하지 않게 된다.

 

만약 getter를 사용해야 한다면 다음과 같이 추상화한 인터페이스를 만들어 사용한다. 이는 곧 재사용성과도 연결된다.

< 누가 봐도 gallonsOfGas라는 변수가 있음을 알 수 있다.>

해당 예제는 남은 연료를 반환하는 메소드를 인터페이스로 만들었다.

그렇기 때문에 정확하게 어떤 변수가 들어 있는지도 알 수 없을 뿐더러, 여러 타입의 객체들이 입맛에 맞게 사용할 수 있다. ( 디젤차는 디젤을 리턴, 전기차는 전기를 리턴, 가솔린차는 가솔린을 리턴 )

 

그리고 이를 요청하는 CarDriver는 안의 객체들이 무슨 상황이 벌어지는지 알 수 없다.(알 필요도 없고)

 

4. DataStructure

class와 반대되는 개념이 DataStructure이다. DataStructure는 public한 변수들만 가지고, 메소드는 가지고 있지 않다. (public 시에 getter/setter들은 실상 메소드는 아니다.)

이 때 마지막 줄에 class는 Tell만 가능하고 data structure는 Ask만 가능하다고 한다.

이는 main클래스는 class에게 일을 시키기만 하면 되고, data structure는 내가 값을 불러와 내가 일을 해야 한다는 점을 뜻한다.(시키느냐, 물어보느냐)

< ask스러운 예시 >

Employee의 type을 물어보고 그에 대한 처리를 한다. 이런 것들은 switch문을 유발 시키고 코드는 복잡해진다.