일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Machine Learing
- 인공신경망
- Dao
- 머신러닝
- requestbody
- 객체지향특징
- 노개북
- JPA
- 북클럽
- 스프링스터디
- REST API
- til
- IntelliJ
- 노마드코더
- mysql
- NullCheck
- 개발서적
- 북스터디
- Deep Learning
- 스프링컨테이너
- 임팩트커리어스터디
- spring
- valid
- 클린코드
- 스프링어노테이션
- 스프링프레임워크
- springboot
- 딥러닝
- 인텔리제이
- 개발필독서
- Today
- Total
dev.jaieve 공부기록
[노개북] 클린코드 TIL(2022.03.01) 본문
DAY 8
🚀 오늘 읽은 범위 : 6장 객체와 자료구조
🔥 책에서 기억하고 싶은 내용
1. 자료추상화
변수 사이에 함수라는 계층을 넣는다고 구현이 저절로 감춰지지는 않는다. 구현을 감추려면 추상화가 필요하다.(p. 119)
2. 자료/객체 비대칭
객체는 추상화 뒤로 자료를 숨긴채 자료를 다루는 함수만 공개한다. 자료구조는 자료를 그대로 공개하며 별다른 함수는 제공하지 않는다.(p. 119)
3. 디미터 법칙
모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다는 법칙이다. ... 즉, 객체는 조회 함수(getter)로 내부구조를 공개하면 안된다.(p.123)
🤔 오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보자!
1. 자료 추상화
추상인터페이스를 제공해 사용자가 구현을 모른 채 자료의 핵심을 조작할 수 있어야 진정한 의미의 클래스다.(p. 119)
이 말을 보니 상당히 DIP원칙의 목적과 유사하다는 생각이 들었다.
DIP : 프로그래머는 ‘추상화에 의존해야지, 구체화에 의존하면 안된다.’
그것과는 또 별개로 실무에서는 처음부터 추상화수준을 수립한 다음 개발을 하는 것이 어려운 것이 현실이며 한계점이라는 생각도 동시에 했다.
2. 자료/객체 비대칭
객체 지향적인 도형 클래스 .여기서 area()는 다형(polymophic) 메서드다. 그러므로 새 도형을 추가해도 기존 함수에 아무런 영향을 미치지 않는다. 반면 새 함수를 추가하고 싶다면 도형 클래스를 전부 고쳐야 한다.(p. 121)
이 예시를 보면서 기능을 확장하는데에(새 함수 추가) 소스코드의 수정이 필요하기 때문에 OCP를 위반한다는 생각이 들었다.
절차지향적 코드와 객체지향적 코드
(자료 구조를 사용하느) 절차적인 코드는 기존 자료 구조를 변경하지 않으면서 새 함수를 추가하기 쉽다. 반면, 객체 지향 코드는 기존 함수를 변경하지 않으면서 새 클래스를 추가하기 쉽다. ... 절차적인 코드는 새로운 자료 구조를 추가하기 어렵다. 그러려면 모든 함수를 고쳐야 한다. 객체지향 코드느 새로운 함수를 추가하기 어렵다. 그러려면 모든 클래스를 고쳐야 한다.(p. 122)
이 말이 머리로 곰곰히 생각해보면서 이해되는 부분이었다. 그래서 어떻게 해야한다는건데? 라는 생각에 대한 답은 바로 아래에 있었다.
때로는 단순한 자료구조와 절차적인 코드가 가장 적합한 상황도 있다(p. 122)
3. 디미터 법칙
final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();
Options opts = ctxt.getOption();
File scratchDir = opts.getScratchDir();
final STring outputDir = scratchDir.getAbsolutePath();
객체라면 내부 구조를 숨겨야 하므로 확실히 디미터 법칙을 위반한다. 반면, 자료구조라면 당연히 내부구조를 노출하므로 디미터 법칙이 적용되지 않는다.(p. 124)
이 예시를 보면서 객체와 자료구조의 목적이 다르다는 것을 깨달았다. 자료구조는 getter메서드가 없기 때문에 ctxt, Options, ScratchDir이 자료구조라면 다음과 같은 코드가 올바르다고 한다.
final String outputDir = ctxt.options.scratchDir.absolutePath;
반면에 객체라면 내부구조를 감춰야하기 때문에 저렇게 쓰면 안된다고!
🔎 궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면?
4. 자료전달객체 - 활성레코드
활성레코드는 DTO의 특수항형태다. 공개 변수가 있거나 비공개변수에 조회/설정 함수가 있는 자료 구조 이지만, 대게 save나 find와 같은 탐색 함수도 제공한다.(p. 127)
스프링 프레임워크를 이용해서 MVC 패턴를 개발하면서 bean을 만들기 위한 DTO를 많이 만들어봤고, 단축키에도 빠삭하지만 활성레코드 형식은 한번도 작성해본적이 없는 것 같아서 낯설었다. Member 모델과 MemberRepository가 있다면 섞여있는 모습일려나?
'IT의 이것저것 > 스터디' 카테고리의 다른 글
[SSR vs CSR] SSR(Server Side Rendering) (0) | 2022.05.04 |
---|---|
[노개북] 클린코드 TIL(2022.03.04) - 수정중 (0) | 2022.03.04 |
[노개북] 클린코드 TIL(2022.02.28) (0) | 2022.02.28 |
[노개북] 클린코드 TIL(2022.02.22-23) (0) | 2022.02.23 |
[노개북] 클린코드 TIL(2022.02.21) (0) | 2022.02.22 |