Closed minSW closed 4 years ago
String pageName = getPageNameOrDefault(request, "FrontPage");
:
상수를 적절한 수준에 두는 좋은 예, getPageNameOrDefault 안에서 "FrontPage"를 상수로 사용할 수 있지만, 그러면 잘 알려진 상수가 적적하지 않은 저차원 함수에 묻힌다. 상수를 알아야 마땅한 함수에서 함수로 상수를 넘겨주는 방법이 더 좋다.
→ 앞서 나왔던 저/고 추상화 수준처럼 코드를 특정한 레벨(우리가 이해하는 단계?)에 따라 잘 나누는 게 중요한 듯.
세로 순서 : 함수 호출 종속성을 아래방향으로 유지함으로서(중요한 개념을 앞에, 세세한 것을 뒤에) 첫 함수 몇 개만 읽어도 개념을 파악하기 쉬워진다. → 이런 코드 짜본 적도 본적도 잘 없는 것 같지만 ㅜㅜ 노력하기
가로 정렬 : 정렬이 필요할 정도로 (선언부)목록이 길다면 문제는 목록 길이(→클래스를 쪼개야 한다는 의미)이지 정렬 부족이 아니다. → ㅎㅎ.. 너무 길어지는 경우가 많던데.... 클래스를 쪼개진 못 하더라도 적어도 세로 공백을 적절히 줘서 이해하기 쉽도록 해야겠다.
변수가 private 이더라도 각 값마다 get/set 을 제공한다면 구현을 외부로 노출하는 셈 (==변수 사이에 함수라는 계층을 넣는다고 구현이 저절로 감춰지는게 아님). 추상화가 필요하다! 추상 인터페이스를 통해 구현을 모른 채 함수를 조작할 수 있어야 진정한 의미의 클래스이다! → 뼈때리는 말.... ㅎ..... private만 해놓고 안심하지 말고 한 번 더 고민해보기
객체에게는 뭔가를 하라고 해야하지 속을 드러내라고 하면 안된다. → 하려는 일의 의미를 파악해서 어떠한 값을 받아서 내가 하려하지 말고 객체가 그 일을 하도록 만들자.
추가: 상수를 알아야 할 마땅한 함수에서 실제로 사용하는 함수로 상수를 넘겨주는 방법으로,\ 사용하지 않으면 잘 알려진 상수가 적절하지 않은 저차원 함수에 묻힌다.
public Response makeResponse(...){
String pageName = getPageNamedOrDefault(request, "FrontPage");
...
}
private String getPageNamedOrDefault(Request request, String defaultPageName){ String pageName = request.getResource(); if(StringUtil.isBlank(pageName)) pageName = defaultPageName;
return pageName; }
while(dis.read(buf, 0, readBufferSize) != -1)
;
객체(Object) | 자료구조(Data Structure or struct) | |
---|---|---|
정의 | 추상화 뒤로 자료를 숨긴 채 자료를 다르는 함수만 제공. | 자료를 그대로 공개하며 별다른 함수를 제공하지 않는다. |
장점 | 새로운 클래스를 추가하기 쉽다. | 새로운 함수를 추가하기 쉽니다. |
단점 | 새로운 할수를 추가하기 어렵다. | 새로운 자료구조를 추가하기 어렵다. |
PR #8
가로 형식 맞추기
최신 IDE
객체? 자료구조?
jackson을 사용하거나 직렬화가 필요한 객체 (직렬화 객체?)도 자료구조
Getter/Setter가 있지만 DTO(활성 레코드)로 봐야하지 않은가
(Java말고) 다른 언어에서는..
Kotlin
data class
=> 자료구조class
seal class
object
... C
struct
=> 자료구조class
=> 객체 (변수, 함수)그럼 Java는 어떤가요? (as basis of 📖)
Java는 다 class로 두루뭉술...
마! 이게 OOP다!
기차 충돌
기차처럼 보여지는 긴 호출 체인 => 조잡하고 지양되는 코드
=> 🤔Q/A 1기차 충돌 안에 체이닝도 포함이 될까?(이 책에서는 단순히 다음 클레스 호출을 늘어지게하여 불러오지 말라고 표현한거 같은데...)
- build pattern / chaining 은 다 수평적인 호출 인 느낌 (순서도 무관)
- 책에서 말하는 지양하는 케이스는 수직적으로 호출하는 것 (고차원 -> 저차원)
구조체 감추기로 기차 충돌 코드 개선한 예시
getAbsolutePath()
)를 맨 위까지 가져와서 처리하지말고, 밑에서 다 처리하고 가져오라는 의미로 이해했다 (createScratchFileStream()
) 활성 레코드
활성 레코드에 비즈니스 규칙 메서드를 추가해 객체처럼 사용하는 경우 => 잡종 구조
장고에서는 "모델 종속적인 기능에대해서는 활성 레코드 자체에 구현"
사실 공통적으로 써서 유틸로 분리할거 아니면..
책 자체가 Java (OOP)를 기준으로 작성
최신의 함수형 프로그래밍과의 갭..
언어에 따라 차이 존재할 듯
이번 주 발표자
진도
발표자료