[표식찾기 연습]
1단계 코드베이스 선택
owasp-java-html-sanitizer 에서 PolicyFactory 클래스의 sanitize 메서드
public final class PolicyFactory
...
public <CTX> String sanitize(
@Nullable String html,
@Nullable HtmlChangeListener<CTX> listener, @Nullable CTX context) {
if (html == null) { return ""; }
StringBuilder out = new StringBuilder(html.length());
HtmlSanitizer.sanitize(
html,
apply(
HtmlStreamRenderer.create(out, Handler.DO_NOTHING),
listener,
context),
preprocessor);
return out.toString();
}
}
2단계 코드 파악: 선택한 메서드나 함수를 파악하고 코드가 하는 일을 요약
html 파라미터는 sanitize 대상이 된다. sanitize 된 결과는 out 변수에 담겨서 리턴된다. 허용 또는 차단하는 html tag 정책들은 이미 PolicyFactory 가 갖고 있어서 sanitize 메서드에서는 다루지 않는다. HtmlSanitizer.sanitize 메서드로 out 변수를 같이 전달한다.
listener 파라미터는 sanitize 대상이 되서 변경이 될 때 훅을 제공하는 인터페이스다.
context 파라미터는 listener 노티받을 때 관련 정보를 제공해주는 객체다.
context 타입이 CTX 이라서 처음엔 특별한 뭔가가 있는가 했다. 그냥 일반적인 T 라고 했으면 더 빨리 이해했을거같다.
3단계 사용하는 표식의 적극적 확인
설명 : 읽는 도중 '아, 그렇구나'라는 생각이 들면서 그 코드의 의미를 좀 더 이해하게 되면 잠시 멈추고 왜 그렇게 생각했는지를 적어보라. 주석문, 변수명, 메서드명, 임시 저장값 등 어느 것이든 표식이 될 수 있다.
sanitizer 메서드명을 통해 필터링 역할을 한다는것을 알 수 있었다.
html 변수명을 통해 원문 html 문자열이 제공됨을 알 수 있었다.
listener 변수명을 통해 이벤트가 발생할 때 훅킹이 가능함을 알 수 있었다.
context 변수명은 listener 가 사용될때에만 사용가능하다는것을 알기 어려웠다. 주석을 통해서 알게 됐다.
4단계 회고
- 어떤 표식을 찾았는가?
sanitizer, html, listener, context, out
- 찾은 표식들은 코드의 요소인가, 아니면 사람의 언어로 된 정보인가?
변수명이기 때문에 코드의 요소다.
- 그 표식들은 무엇에 관해 알려주고 있는가?
html 문자열에 대해 sanitize 즉 필터작업을 하고 이벤트가 발생하면 등록된 listener 가 동작하고 context 정보를 활용할 수 있다. 필터작업 결과는 out 에 담긴다.
- 그 표식들은 코드의 도메인에 대한 지식을 나타내는가?
sanitize 네이밍이 xss filter 를 의미하는것은 누구나 바로 생각할 수 있는 범용적인 지식이 아니다. xss filter 도메인 특화된 지식이라 볼 수 있다. 나머지 html, listener,context 는 도메인에 대한 지식으로 볼 수 없다. out 은 변수명이 너무 추상적이다.
- 그 표식들은 코드의 기능에 대한 지식을 나타내는가?
그렇다.
[청킹연습]
1단계 코드 선정
public <CTX> HtmlSanitizer.Policy apply(
HtmlStreamEventReceiver out, @Nullable HtmlChangeListener<CTX> listener,
@Nullable CTX context) {
if (listener == null) {
return apply(out);
} else {
HtmlChangeReporter<CTX> r = new HtmlChangeReporter<CTX>(
out, listener, context);
r.setPolicy(apply(r.getWrappedRenderer()));
return r.getWrappedPolicy();
}
}
2단계 코드 파악
설명: 최대 2분을 넘지 않도록 타이머를 설정하고 코드 파악. 시간이 다 되면 코드는 보지 않는다.
3단계 코드 재현
설명: 기억을 되살려 새롭게 코드를 다시 작성
public <CTX> apply(out, HtmlChangeListener listener, context) {
if (listener == null) {
apply(out);
} else {
r.method(out, listenr, context);
}
}
4단계 회고
- 어느 부분을 쉽게 기억했는가?
파라미터명은 쉽게 기억했다.
- 부분적으로 기억한 코드가 있는가?
파라미터 타입중 하나만 기억했다.
- 전체를 다 기억하지 못한 코드가 있는가?
else 부분은 거의 다 기억하지 못했다.
- 기억하지 못한 라인들이 있다면 그 이유가 무엇일까?
파라미터 타입 HtmlStreamEventReceiver 와 HtmlChangeListener 기억하는데 시간이 소요됐다.
else 부분의 HtmlChangeReporter 타입도 익숙하지 않아서 기억하기 어려웠다.
- 기억하지 못한 라인에 본인이 익숙하지 않은 프로그래밍 개념이 들어 있지는 않는가?
그런건 없었다. 필요한 타입 네이밍들이 익숙하지 않았다.
- 기억하지 못한 라인에 본인이 익숙하지 않은 도메인 지식이 있지는 않는가?
그렇다. 이 작업을 왜 하는지, 왜 필요한지 모른채로 외우다 보니 short term memory 에 의존할 수 밖에 없었다.
'연습' 카테고리의 다른 글
프로그래머뇌 청킹연습/표식찾기연습 - 3 (0) | 2022.05.25 |
---|---|
프로그래머뇌 청킹연습/표식찾기연습 - 2 (0) | 2022.05.15 |
[구현] 자물쇠와 열쇠 (0) | 2021.12.06 |
[구현] 문자열 압축 (0) | 2021.11.29 |
[구현] 문자열 재정렬 (0) | 2021.11.21 |