kok202
[2019.02.06] 클린 코드 (형식, 객체)

2019. 2. 6. 03:39[공부] 독서/클린 코드

형식


코드가 200줄 안인 작은 파일이 이해하기 쉽다.

마찬가지로 한줄이 짧을 수록 이해하기 쉽다.


함수사이는 개행을 한줄 넣어서 분리하라


밀접한 개념은 가까이 둬라


protected 변수는 피해라

밀접한 개념이 한 파일에 속하지 못하게 한다.


상수는 사용하는 지점에 바로 사용할 경우 너무 저차원에 배치되어 묻히는 경우가 있을 수 있다.

그러므로 적절한 수준에 두고 사용이 필요한 함수로 상수를 넘겨주는 방식이 더 좋다.


지역변수 선언은 사용하는 위치의 최대한 가까이에 둔다.

멤버변수 선언은 클래스 맨 처음에 두며 개행으로 변수간에 거리를 두지않는다.

종속함수는 A함수가 B함수를 선언하는 경우 B함수를 말하는데 호출 순서에 맞춰 배치하라


띄어쓰기를 이용해서 요소를 분명히 나눠라

function( A, B ) -> function(A, B)

A=B*B+C*C -> A = B*B + C*C


변수 선언부에 공백을 넣어 '=' 의 위치를 맞추는데 에너지를 낭비하지마라

IDE 별로 자동으로 수정하는 경우도 있고 전체를 보지못하고 특정값에만 주목하게 되는 효과가 있다,


코드 선언부가 너무 길다면 클래스를 쪼개야한다는 의미다.


들여쓰기를 확실하게해라

public String getAddress() { return address; }

public String getAddress() { 
return address; 
}

저자는 한줄 if 문에서 {}를 생략하는 것을 허용한다.




객체와 자료구조


private = 변수에 의존하지 않는 클래스를 만들기 위해서

그러니까 아무 생각없이 private 변수에 getter setter를 다 넣지마라


디미터 법칙 : 다른 객체의 메서드를 호출할 때 다음 객체의 메서드 호출만 허용해라

1. 클래스의 멤버 메소드

2. 클래스의 멤버 변수로 지정된 객체

3. 메서드가 생성한 객체

4. 메서드로 넘어온 인수 객체


Train wreck

즉 디미터 법칙에 의해 다음을 허용하지 않는다.

String output = object1.function1().function2().targetFunction();

function1(), function2()가 만들어서 반환하는 객체가 위 범주안에 허용되지 않기 때문이다.

단 function1()과 function2()가 반환하는 것은 자료구조가 아닌 객체라고 가정한다.

이렇게 계속 길어지는걸 기차 충돌이라고 부른다.


다음과 같이 고쳐라

Object2 object2 = object1.function1();

Object3 object3 = object2.fucntion2();

String output = object3.targetFunction();


하지만 이 마저도 Object2, Object3는 디미터 법칙에 허용되지 않는 범주다.

= Object2는 작성하고 있는 메소드 전체를 이해하기 위해 필요한 지식이 아니다.


멤버 변수를 만들 때

자료구조는 public을 이용해라

객체는 private과 getter를 이용해라


하지만 자료구조를 public이 아니라 private으로 지정하고 getter setter를 지정해줘야하는 경우가 생기는데

스프링 프레임워크의 빈 파일이 대표적이다. 


즉 스프링의 DTO는 자료구조이다.

첨언으로 활성 레코드도 자료구조다.