본문으로 바로가기

TIL 2022-03-14 클린코드 10장

category TIL 2022. 3. 14. 23:48

클래스

 

클래스는 작아야함

당연히 수많은 메서드와 변수로 이루어진 클래스는 더 작은 클래스로 나눌 수 있다.

 

그러나 단순 숫자만 따지는 것은 아님. 메서드가 적어도 책임(이 클래스가 해야하는 일)이 너무 많다면 이를 나누어야함.

 

클래스 이름이 애매하면 이건 책임이 너무 많아서임. 이것저것을 하니까 책임이 애매한거고, 딱딱 책임을 나눈 클래스들로 나누어야함.

 

단일 책임 원칙

Single Resposiblity Principle, SRP라고도 하는데, 클래스, 모듈을 변경할 이유는 하나여야한다는 것이다.

 

책에 나온 10-2 코드에서는 소프트웨어 출시할때 마다, 그리고 스윙 컴포넌트 관리하며 스윙 코드를 변경할떄마다 버젼 번호가 바뀐다. 바뀌는 이유가 두 가지인 것이다.

 

이런 경우에는 버젼 정보를 다루는 메서드를 빼내 독자적인 클래스로 만들면 재사용하기도 편하다.

 

근데 클래스 설계할떄 SRP 안지키는 경우가 많음. 왜냐하면 돌아가는 코드를 만드는데는 SRP 안지키는게 더 편하기 떄문임. 오히려 SRP를 지키다보면 코드량이 늘어나고 생각할것도 많아짐.

몇몇 개발자들은 이렇게 자잘한 단일 클래스가 많아지면 이해하기 어렵다고 하는데 어차피 규모 있으면 논리 복잡한데 체계적으로 정리하여 작은 클래스 여럿으로 이루어진 시스템이 더 바람직하다고 필자는 말함.

 

응집도

응집도 : 메서드가 변수를 많이 사용할수록 메서드와 클래스는 응집도가 높다. (클래스의 자체 변수를 많이 사용한다는게 결국 클래스에 의존?지탱?한다는 의미인듯. 메서드가 돌아가려면 클래스의 변수가 필요함)

 

응집도가 제일 높은 클래스는 바람직하지 않으나 적당한걸 선호하는 경향이 있음. 클래스의 메서드와 변수가 논리적인 단위로 묶인다는 의미이기 때문

 

응집도를 유지하면 작은 클래스 여럿이 나옴

큰 함수를 작은 함수로 나누기만 해도 클래스가 나눠짐. 큰 함수에서 사용하는 변수를 클래스 인스턴스 변수로 올리고 작은 함수로 쪼개면 몇몇 함수만 사용하는 변수가 나옴.

 

그러면 이렇게 몇몇 변수만 사용하는 함수들을 독자 클래스로 나눠버리면 됨. (책 코드 다시 보자)

 

변경하기 쉬운 클래스

변경할떄마다 시스템이 의도대로 동작 안할 가능성 있음. 클래스 체계적으로 정리하면 이런 위험 낮출수 있음.

 

update를 아직 미구현한 SQL 클래스에서 update를 구현하려면 그 클래스에 손을 대야한다. 기존 sql문을 수정할떄도 클래스에 손을 대야한다.

 

이거 자체가 SRP 위반임. 그리고 select문에서만 사용하는 비공개 메서드가 있는데, 특정 함수에서만 사용하는 비공개 메서드가 있다는게 더 작은 클래스로 쪼갤수 있다는 의미임.

 

변경으로부터 격리

상세한 구현에 의존하는 코드는 테스트가 어려움.

 

5분마다 값이 변하는 API를 사용하는 클래스가 있다고 하자. 이런 코드를 테스트하기는 쉽지 않다. API를 직접 호출 안하고 별도의 인터페이스를 만들고 클래스에서는 이 참조자를 인수로 받도록 수정함. 이제 테스트용 클래스 만들수 있고 고정적인 값을 반환하는 것을 기반으로 테스트할 수 있다.

 

Jest로 Mocking하는거랑 비슷한듯.

'TIL' 카테고리의 다른 글

TIL 2022-03-17 git rebase, 3-way merge  (0) 2022.03.17
TIL 2022-03-16 깃 관리 rebase, reset, force-push  (0) 2022.03.16
TIL 2022-03-13 클린코드 6~9  (0) 2022.03.13
TIL 2022-03-12 클린 코드 1~5장  (0) 2022.03.12
TIL 2022-03-10 SSH  (0) 2022.03.10