Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 알렉스넷
- 1916
- 논문리뷰
- Java
- GPT
- 디미터법칙
- 백준 1339 자바
- 3745
- 논문구현
- deeplearning
- Alexnet
- 1261
- MachineLearning
- 다익스트라
- cs231n
- NLP
- 논문
- 짝지어제거하기
- 백준
- 1107번
- dijkstra
- 딥러닝
- 자바
- 관심사분리
- 백준 1339
- 알고리즘
- 클린코드
- 백준 1916 자바
- 백준9095
- 머신러닝
Archives
- Today
- Total
산 넘어 산 개발일지
Clean Code - 창발성 본문
창발성 : 창발또는 떠오름 현상은 하위 계층에는 없는 특성이나 행동이 상위 계층에서 자발적으로 돌연히 출현하는 현상이다.
왜 이번 챕터의 제목이 창발성인지는 잘 모르겠다.
전체적으로 내용은 코드를 단순하게 하기 위한 내용을 요약한 것이었다.
주로 지금까지 한 내용을 다시 간결하게 되짚어 보는 단계인 것 같다.
굳이 창발성과 관련이 있는 것이라면 TEMPLATE METHOD 정도가 아닌가 싶다.
단순한 코드 법칙
- 모든 테스트를 실행한다.
- "테스트가 가능한 시스템"
- 테스트가 가능한 시스템을 만드는 과정 속에서 자연스럽게 소프트웨어의 품질도 높아진다.
- 테스트가 가능해야 검증이 가능하다.
- 낮은 결합도 + 높은 응집도
- 결합도는 낮춤으로써 테스트와 유지보수에 용이하도록 설계하고, 응집도는 높인다.
- SRP 지키기, DI, 인터페이스, 추상 클래스와 같은 기법들 사용
- "테스트가 가능한 시스템"
- 중복을 없앤다.
- 중복은 불필요하게 코드 양이 많아져 읽기가 부담스러워지고 복잡해보인다.
- 작은 부분의 중복을 해결하는 "소규모 재사용"들이 결국 "대규모 재사용"을 불러온다.
- TEMPLATE METHOD 패턴
- 상위 클래스(추상 클래스)에서 공통되는 메서드를 작성하고, 이 메서드 내부의 세부구현은 하위 클래스의 역할에 따라 다르게 구현하는 기법
- primitive 메서드, 혹은 hook 메서드를 사용하여 하위 클래스에서 오버라이드된 메서드를 상위 클래스에서의 공통 메서드에서 사용한다.
- 프로그래머의 의도를 표현하라
- 모든 제품에서 유지보수는 중요하다.
- 유지보수를 위해서는 유지보수 개발자가 코드를 파악할 필요가 있는데, 파악하는 것에 얼만큼의 비용이 소모되는지가 관건이다.
- 따라서 개발자는 코드를 작성할 때 자신의 의도를 명확히 표출하여 유지보수 개발자가 빠르고 쉽게 코드를 파악할 수 있도록 해줘야 한다.
- 의도를 분명히 하는 좋은 방법
- 좋은 이름
- 함수와 클래스 크기를 "가능한" 줄이기
- 표준 명칭 사용
- 단위 테스트 케이스 작성
- 클래스와 메서드 수를 최소로 줄여라
- 최소로 줄이되 실용적인 경계 안에서만 줄여야 한다.
- 지나치게 이론에 집착하는 구조로 쓸데없이 복잡성을 증가시켜서는 안된다.
내 코드 돌아보기
중복없애기
FoodsRecyclerViewAdapter 는 OriginFoodsRecyclerviewAdapter를 상속받은 하위 클래스임에도 불구하고 대부분의 함수를 오버라이드 해서 사용했다.
즉 그만큼 중복이 심해지고, 재사용성이 낮아진 것이다.
수정된 코드
여러 수정을 했지만, 생성자 부분인 constructor에 주목해보자.
TEMPLATE METHOD
- 하위 클래스마다 생성자 부분에 추가적으로 생성할 부분이 상이해서 이 부분을 loadFoodList() 추상 메서드로 정의하고 하위 클래스에서 구현하게 했다.
- 이후 아래와 같이, 각 하위 클래스는 자신들의 상황에 맞게 loadFoodList()를 구현했다.
- 결과적으로, 생성자를 다시 정의할 필요가 없어졌다.
포인트
1.테스트가 가능한 시스템
2. 낮은 결합도 + 높은 응집도
3. 중복 없애기(TEMPLATE METHOD)
4. 프로그래머의 의도 표현하기
5. 클래스, 함수 크기 줄이기
느낀점
리팩터링 하는 것이 특히나 어려운 부분이였다.
특히 처음 코드를 짤 때, 상속을 사용했음에도 상속의 이점을 제대로 살리지 못했다는 것을 뼈저리게 느꼈다.
앞으로 코드를 짤 때, 단순히 기능에만 충실하지 않고 미래의 유지보수를 고려해서 짜게 될 것 같다.
지금처럼 고통을 겪지 않으려면...
또한 추상 클래스나 인터페이스를 더 활용해 보고 싶은 욕심이 생겼다.
'Study > CleanCode' 카테고리의 다른 글
Clean Code - 시스템 (0) | 2021.03.10 |
---|---|
Clean Code - 클래스 (0) | 2021.03.04 |
Clean Code - 단위 테스트 (0) | 2021.03.03 |
Clean Code - 경계 (0) | 2021.03.01 |
Clean Code - 객체와 자료구조 (0) | 2021.02.21 |
Comments